Skip to main content
 首页 » 编程设计

python之ssh 与 Subprocess.popen

2025年05月04日15kevingrace

大家好,我遇到了一个小问题。可能是我遗漏了一些明显的东西,但我无法找出问题所在。我有 GUI,其中有一个名为“erp”的按钮,如果我按下它,它应该首先对名为(主机 ID 名称)'ayaancritbowh91302xy' 的机器执行 ssh然后它应该执行像 (cd change dir) 和 'ls -l' 这样的命令。我尝试了以下代码:

def erptool(): 
    sshProcess = subprocess.Popen(['ssh -T', 'ayaancritbowh91302xy'],stdin=subprocess.PIPE, stdout = subprocess.PIPE) 
    sshProcess.stdin.write("cd /home/thvajra/transfer/08_sagarwa\n") 
    sshProcess.stdin.write("ls -l\n") 
    sshProcess.stdin.write("echo END\n") 
    for line in stdout.readlines(): 
        if line == "END\n": 
        break 
        print(line) 

我收到以下错误:

Traceback (most recent call last): 
  File "Cae_Selector.py", line 34, in erptool 
    for line in stdout.readlines(): 
NameError: global name 'stdout' is not defined 
Pseudo-terminal will not be allocated because stdin is not a terminal. 

如何做到这一点?谁能帮我解决这个问题?

请您参考如下方法:

试试这个:

#!/usr/bin/env python 
import subprocess 
def erptool(): 
    sshProcess = subprocess.Popen(['ssh', '-T', 'ayaancritbowh91302xy'], 
                                  stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
    out, err = sshProcess.communicate("cd /home/thvajra/transfer/08_sagarwa\nls -l\n") 
    print(out), 
erptool() 

我添加了 -T 这样 ssh 就不会尝试分配伪终端,并通过使用通信避免 END 和标准输出问题。