網站首頁 編程語言 正文
前言
最新需要做一個小工具,讓協作部門能夠獲取到服務器上的一些資源訊息,因為工具是pyqt寫的所以牽扯到用python鏈接linux的問題,這里記錄一下一些碰到的問題
環境
工具
- pycharm
- qt designer
庫
- python3.7
- pyqt5.15.4
- paramiko2.12.0
上網搜了很多,發現paramiko實現遠程SSH鏈接非常的方便,作為python的第三方庫安裝也很方便
pip install paramiko
內容匯總
創建SSHClient
ssh = paramiko.SSHClient()
首先通過paramiko創建SSHClient類,SSHClient類封裝了鏈接SSH和發送命令等方法
設置鏈接主機后的策略
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
設置在連接到沒有已知主機密鑰的服務器時使用的策略,有三種情況,一般直接用Auto,會將遠程主機的秘鑰添加到known_hosts文件中
鏈接遠程主機
ssh.connect(ip, port, username, password)
- ip:遠程主機地址
- port:端口默認22
- username:訪問主機的用戶名
- password:訪問主機的用戶密碼
通過connect鏈接
發送命令
cmd = "python /work/tools/build_project.py"
stdin, stdout, stderr = ssh.exec_command(cmd)
- stdin:輸入內容(用來交互)
- stdout:執行命令linux控制臺的輸出內容
- stderr:執行失敗后的信息
我們通過exec_command方法在鏈接成功后向主機發送命令,有三個返回參數
獲取linux的輸出內容
stdin, stdout, stderr = ssh.exec_command(cmd)
successResult = stdout.read()
errorResult = stdout.read()
可以通過read的方法獲取到linux控制臺的輸出信息
問題總結
在實際運用的時候,碰到了不少問題,如下:
- 順序執行多條命令的時候,后邊的命令不生效
- 非瞬時命令執行是,read在第一時間拿不到輸出入職
這兩個問題在實際運行的時候會造成很大的問題,比如下面的情況:
cd /work
git pull
cd tools
python test.py
同時執行多條命令的時候,因為git pull是一個非瞬時完成的命令,所有后邊的命令都沒有生效,并且read也拿不到控制臺的信息,想了想可以通過延時調用的方式去初始,time.sleep(1),這個樣子,但是很不優雅,因為時間是不固定的,這樣做也很不保險
解決方式
搜索查找了一下,找到了相關問題的解決方式,在exec_command返回參數stdout內有一個channel類,channel可以內可以接收遠端主機的狀態,就是exit_status_ready(),當遠端主機執行結束后,exit_status_ready()就是true,如此就方便處理了
stdin, stdout, stderr = ssh.exec_command(s_cmd, get_pty=True)
result = ""
while not stdout.channel.exit_status_ready():
result = result + stdout.readline()
if stdout.channel.exit_status_ready():
break
如上述代碼所示,在發送命令后,在while循環去判斷遠端注意執行狀態,當執行狀態結束時,返還所有接收到的信息
演示
下述為完整代碼演示, 為了方便執行多條命令,這里直接調用shell腳本
#!/bin/bash
project_path="/works"
cd $project_path
# 清理
git clean -f
git checkout *
# 拉代碼
git pull
cd tools
python build_android.py
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.x.xxx', 22, "root", 123456)
s_cmd = "sh /work/tools/ssh/build_android.sh"
stdin, stdout, stderr = ssh.exec_command(s_cmd, get_pty=True)
result = ""
while not stdout.channel.exit_status_ready():
result = result + stdout.readline()
if stdout.channel.exit_status_ready():
break
print(result)
如上述代碼所示,兩個腳本的配合,就可以實現多命令的遠程調用和回執,另外建議ssh的操作都放到子線程里去處理,這樣就不會卡著主線程了
推送
Github
https://github.com/KingSun5
原文鏈接:https://blog.csdn.net/Mr_Sun88/article/details/127811199
相關推薦
- 2022-04-15 ASP.NET?Core基礎之Startup類_基礎應用
- 2022-08-12 利用Python判斷文件的幾種方法及其優劣對比_python
- 2022-06-11 FreeRTOS進階之系統延時完全解析_操作系統
- 2022-11-07 pandas中字典和dataFrame的相互轉換_python
- 2022-11-17 Go語言學習教程之反射的示例詳解_Golang
- 2023-04-20 ES6:字符串的擴展及新增方法
- 2023-11-22 Linux Ubuntu Linux中建立、復制、移動、刪除文件的命令
- 2022-07-18 SQL?Server中的文本函數和圖像函數介紹_MsSql
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支