在python

时间:2015-09-23 07:40:27

标签: python linux printing stdout paramiko

我在Python 2.7中使用Paramiko连接到Linux服务器,程序运行正常。问题是,当我运行它时,我从IDE获得此输出:

Start
This is a test program
before the cd..
after the cd ..
after the pwd
after the ls
/home/11506499

End

我的代码如下所示:

import paramiko
ssh = paramiko.SSHClient()

print('Start')
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('XXX.XX.XXX.XX', port = 22, username = 'tester', password = 'test')

print("This is a test program")

stdin, stdout, stderr = ssh.exec_command('pwd')

print('before the cd..')
stdin.write('cd ..')
stdin.write('\n')
stdin.flush()

print('after the cd ..')
stdin.write('pwd')
stdin.write('\n')
stdin.flush()

print('after the pwd')
stdin.write('ls')
stdin.write('\n')
stdin.flush()

print('after the ls')
output = stdout.readlines()
print '\n'.join(output)

ssh.close()
print('End')

正如您在打印件上看到的那样,程序会运行所有命令,但stdout只显示第一个ssh.exec_command('pwd')的输出,而不是所有stdin.write的输出。 我想知道的是,是否有一种方法或命令可以从我通过终端发送的其他命令中获取输出?我正在考虑第二个'pwd'或'ls'命令等命令?

有没有办法显示我在终端中执行的每个操作的响应输出,就像我在Linux中使用cmd.exe或终端一样?

我尝试在网上查看但由于示例仅显示第一个命令的输出,因此无法看到任何内容。所以我希望有人可以帮我解决这个问题。

编辑:我离开了建立客户端连接,而是使用shell来保持连接直到我退出。我使用recv存储终端的输出并打印出来。这创造了奇迹。

我确实做了导入时间,所以脚本可能需要稍微休息,它可以在打印之前收集剩余的输出。通过这种方式,我可以打印出终端中出现的所有内容,而不会缺少它。

1 个答案:

答案 0 :(得分:2)

您只在脚本中执行一个命令。根据我的理解,你的案例中的stdin将用于将参数传递给正在运行的命令。这意味着您必须为pwd,cd和ls单独运行ssh.exec_command(<cmd>)。初始执​​行后,会话关闭,您无法发出更多命令。

这就像发出命令

一样
ssh user@hostname "pwd"

会话已完成,连接已关闭。它不像telnet,只需键入一个命令并添加'\ n'来执行它,也不像bash提示,因为你没有启动tty。

的问候,
Lisenby