Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
终端在通过python子进程进行sshing后挂起_Python_Bash_Ssh_Subprocess - Fatal编程技术网

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

终端在通过python子进程进行sshing后挂起,python,bash,ssh,subprocess,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.commu

我已经在这方面工作了很长时间,如果有任何帮助,我将不胜感激

我在这里试图做的是用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
子进程\u cmd('sshuser@server-第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'
dredbounds计算机:python terminal_test.py
测试1
回溯(最近一次呼叫最后一次):
文件“File_name.py”,第26行,在
子进程\u cmd('sshuser@server-第111页;cd.;ls')
文件“terminal_test.py”,第21行,在subprocess_cmd中
proc_stdout=process.stderr。沟通
AttributeError:“非类型”对象没有属性“通信”

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

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

狂欢节:

或者,如果您想使用问题中的“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
这可能是在键入“exit”时),我尝试使用proc_stdout=process.stdout.readlines()和proc_stdout=process.stdout.read()。同样的结果。它可能正在写入
stderr
communicate
返回一个元组,如果stdout无法连接到服务器,则可能没有写入任何内容。谢谢,我尝试了,并用我得到的输出更新了我的问题。效果很好,非常感谢!我将对此进行研究,找出我的代码不起作用的原因。
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)