溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中windows怎么鏈接linux執(zhí)行命令并獲取執(zhí)行狀態(tài)

發(fā)布時(shí)間:2022-11-14 10:07:33 來源:億速云 閱讀:134 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了python中windows怎么鏈接linux執(zhí)行命令并獲取執(zhí)行狀態(tài)的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇python中windows怎么鏈接linux執(zhí)行命令并獲取執(zhí)行狀態(tài)文章都會(huì)有所收獲,下面我們一起來看看吧。

    環(huán)境

    工具

    • pycharm

    • qt designer

    庫(kù)

    • python3.7

    • pyqt5.15.4

    • paramiko2.12.0

    上網(wǎng)搜了很多,發(fā)現(xiàn)paramiko實(shí)現(xiàn)遠(yuǎn)程SSH鏈接非常的方便,作為python的第三方庫(kù)安裝也很方便

    pip install paramiko

    內(nèi)容匯總

    創(chuàng)建SSHClient

    ssh = paramiko.SSHClient()

    首先通過paramiko創(chuàng)建SSHClient類,SSHClient類封裝了鏈接SSH和發(fā)送命令等方法

    設(shè)置鏈接主機(jī)后的策略

    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    設(shè)置在連接到?jīng)]有已知主機(jī)密鑰的服務(wù)器時(shí)使用的策略,有三種情況,一般直接用Auto,會(huì)將遠(yuǎn)程主機(jī)的秘鑰添加到known_hosts文件中

    鏈接遠(yuǎn)程主機(jī)

    ssh.connect(ip, port, username, password)
    • ip:遠(yuǎn)程主機(jī)地址

    • port:端口默認(rèn)22

    • username:訪問主機(jī)的用戶名

    • password:訪問主機(jī)的用戶密碼

    通過connect鏈接

    發(fā)送命令

    cmd = "python /work/tools/build_project.py"
    stdin, stdout, stderr = ssh.exec_command(cmd)
    • stdin:輸入內(nèi)容(用來交互)

    • stdout:執(zhí)行命令linux控制臺(tái)的輸出內(nèi)容

    • stderr:執(zhí)行失敗后的信息

    我們通過exec_command方法在鏈接成功后向主機(jī)發(fā)送命令,有三個(gè)返回參數(shù)

    獲取linux的輸出內(nèi)容

    stdin, stdout, stderr = ssh.exec_command(cmd)
    successResult = stdout.read()
    errorResult = stdout.read()

    可以通過read的方法獲取到linux控制臺(tái)的輸出信息

    問題總結(jié)

    在實(shí)際運(yùn)用的時(shí)候,碰到了不少問題,如下:

    • 順序執(zhí)行多條命令的時(shí)候,后邊的命令不生效

    • 非瞬時(shí)命令執(zhí)行是,read在第一時(shí)間拿不到輸出入職

    這兩個(gè)問題在實(shí)際運(yùn)行的時(shí)候會(huì)造成很大的問題,比如下面的情況:

    cd /work
    git pull
    cd tools
    python test.py

    同時(shí)執(zhí)行多條命令的時(shí)候,因?yàn)間it pull是一個(gè)非瞬時(shí)完成的命令,所有后邊的命令都沒有生效,并且read也拿不到控制臺(tái)的信息,想了想可以通過延時(shí)調(diào)用的方式去初始,time.sleep(1),這個(gè)樣子,但是很不優(yōu)雅,因?yàn)闀r(shí)間是不固定的,這樣做也很不保險(xiǎn)

    解決方式

    搜索查找了一下,找到了相關(guān)問題的解決方式,在exec_command返回參數(shù)stdout內(nèi)有一個(gè)channel類,channel可以內(nèi)可以接收遠(yuǎn)端主機(jī)的狀態(tài),就是exit_status_ready(),當(dāng)遠(yuǎn)端主機(jī)執(zhí)行結(jié)束后,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

    如上述代碼所示,在發(fā)送命令后,在while循環(huán)去判斷遠(yuǎn)端注意執(zhí)行狀態(tài),當(dāng)執(zhí)行狀態(tài)結(jié)束時(shí),返還所有接收到的信息

    演示

    下述為完整代碼演示, 為了方便執(zhí)行多條命令,這里直接調(diào)用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)

    如上述代碼所示,兩個(gè)腳本的配合,就可以實(shí)現(xiàn)多命令的遠(yuǎn)程調(diào)用和回執(zhí),另外建議ssh的操作都放到子線程里去處理,這樣就不會(huì)卡著主線程了

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

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI