大家好,我遇到了一个小问题。可能是我遗漏了一些明显的东西,但我无法找出问题所在。我有 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 和标准输出问题。
关于python - ssh 与 Subprocess.popen,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26227791/