通过 python 子进程 sshing 后终端挂起
Terminal hangs after sshing via python subprocess
我已经为此工作了很长时间,如有任何帮助,我们将不胜感激。
我在这里要做的是通过 ssh 连接到测试服务器,然后 cd ..,然后通过 python 打印该文件夹中的目录列表。这段代码是我最好的尝试:
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
print "Test 1"
proc_stdout = process.communicate()[0].strip()
#proc_stdout= process.stdout.readlines() (Gives same outcome as communicate)
#proc_stdout= process.stdout.read() (Gives same outcome as communicate)
print "Test 2"
print proc_stdout
subprocess_cmd('ssh user@server -p 111;cd ..;ls')
出于某种原因,此函数总是挂在 "proc_stdout= " 步骤。它从不打印 "Test 2" 或 returns 文件列表。不过,如果我取出 ssh 命令,它就可以正常工作。我希望在终端中看到的是这样的,但是终端挂了,我不能再与之交互了:
dredbounds-computer: python file_name.py
Test 1
Test 2
FileA
FileB
FileC
更新:
我修改了代码并放置了 proc_stdout= process.stderr。交流()。
这是我更新的代码:
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
print "Test 1"
proc_stderr= process.stderr. communicate()
print "Test 2"
print proc_stderr
print "Test 3"
运行 我在终端中收到以下错误:
dredbounds-computer: python terminal_test.py
Test 1
Traceback (most recent call last):
File "file_name.py", line 26, in <module>
subprocess_cmd('ssh user@server -p 111;cd ..;ls')
File "terminal_test.py", line 21, in subprocess_cmd
proc_stdout= process.stderr. communicate()
AttributeError: 'NoneType' object has no attribute 'communicate'
有谁知道我如何修复这段代码,或者用另一种方法来做同样的事情。不知道为什么这会给我一个 none 类型错误。我调用 ssh 命令的方式有问题吗?我在终端中手动输入了相同的命令,它 returns 是一个目录列表,因此理论上它应该可以工作。有什么建议吗?
如果您只想列出目录内容,可以通过 SSH 发送一些命令。
Bash:
ssh 192.168.122.24 ls /tmp
或者如果您想在问题中使用 "cd":
ssh 192.168.122.24 "cd /tmp; ls"
Python 脚本示例:
import subprocess
HOST = 'server'
PORT = '111'
USER = 'user'
CMD = 'cd /tmp; ls'
process = subprocess.Popen(['ssh', '{}@{}'.format(USER, HOST),
'-p', PORT, CMD],
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = process.stdout.readlines()
if not result:
err = process.stderr.readlines()
print('ERROR: {}'.format(err))
else:
print(result)
我已经为此工作了很长时间,如有任何帮助,我们将不胜感激。
我在这里要做的是通过 ssh 连接到测试服务器,然后 cd ..,然后通过 python 打印该文件夹中的目录列表。这段代码是我最好的尝试:
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
print "Test 1"
proc_stdout = process.communicate()[0].strip()
#proc_stdout= process.stdout.readlines() (Gives same outcome as communicate)
#proc_stdout= process.stdout.read() (Gives same outcome as communicate)
print "Test 2"
print proc_stdout
subprocess_cmd('ssh user@server -p 111;cd ..;ls')
出于某种原因,此函数总是挂在 "proc_stdout= " 步骤。它从不打印 "Test 2" 或 returns 文件列表。不过,如果我取出 ssh 命令,它就可以正常工作。我希望在终端中看到的是这样的,但是终端挂了,我不能再与之交互了:
dredbounds-computer: python file_name.py
Test 1
Test 2
FileA
FileB
FileC
更新: 我修改了代码并放置了 proc_stdout= process.stderr。交流()。 这是我更新的代码:
def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
print "Test 1"
proc_stderr= process.stderr. communicate()
print "Test 2"
print proc_stderr
print "Test 3"
运行 我在终端中收到以下错误:
dredbounds-computer: python terminal_test.py
Test 1
Traceback (most recent call last):
File "file_name.py", line 26, in <module>
subprocess_cmd('ssh user@server -p 111;cd ..;ls')
File "terminal_test.py", line 21, in subprocess_cmd
proc_stdout= process.stderr. communicate()
AttributeError: 'NoneType' object has no attribute 'communicate'
有谁知道我如何修复这段代码,或者用另一种方法来做同样的事情。不知道为什么这会给我一个 none 类型错误。我调用 ssh 命令的方式有问题吗?我在终端中手动输入了相同的命令,它 returns 是一个目录列表,因此理论上它应该可以工作。有什么建议吗?
如果您只想列出目录内容,可以通过 SSH 发送一些命令。
Bash:
ssh 192.168.122.24 ls /tmp
或者如果您想在问题中使用 "cd":
ssh 192.168.122.24 "cd /tmp; ls"
Python 脚本示例:
import subprocess
HOST = 'server'
PORT = '111'
USER = 'user'
CMD = 'cd /tmp; ls'
process = subprocess.Popen(['ssh', '{}@{}'.format(USER, HOST),
'-p', PORT, CMD],
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = process.stdout.readlines()
if not result:
err = process.stderr.readlines()
print('ERROR: {}'.format(err))
else:
print(result)