中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中windows怎么鏈接linux執行命令并獲取執行狀態

發布時間:2022-11-14 10:07:33 來源:億速云 閱讀:138 作者:iii 欄目:開發技術

這篇文章主要介紹了python中windows怎么鏈接linux執行命令并獲取執行狀態的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇python中windows怎么鏈接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的操作都放到子線程里去處理,這樣就不會卡著主線程了

    關于“python中windows怎么鏈接linux執行命令并獲取執行狀態”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“python中windows怎么鏈接linux執行命令并獲取執行狀態”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    临沧市| 盘锦市| 都昌县| 绥芬河市| 上思县| 台前县| 阳谷县| 金溪县| 绥化市| 娱乐| 安岳县| 磴口县| 思茅市| 叶城县| 阿拉善左旗| 泸州市| 酒泉市| 陇川县| 连山| 肃南| 威信县| 分宜县| 万荣县| 龙胜| 盈江县| 炎陵县| 九龙县| 启东市| 呼伦贝尔市| 房山区| 改则县| 华安县| 英吉沙县| 四川省| 原平市| 焦作市| 屯门区| 双辽市| 新乡市| 合川市| 张掖市|