通过python子进程sshing后终端挂起

时间:2016-07-27 21:08:57

标签: python bash ssh 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 ="步骤。它从不打印"测试2"或返回文件列表。如果我拿出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'

有谁知道如何修复此代码,或者其他方式做同样的事情。不知道为什么这会给我一个无类型的错误。我如何调用我的ssh命令有什么问题吗?我在终端中手动输入了相同的命令,它返回了一个目录列表,所以它应该在理论上有用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果您只想列出目录内容,可以通过SSH发送一些命令。

击:

ssh 192.168.122.24 ls /tmp

或者如果你想使用&#34; cd&#34;如你的问题:

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)