Python 使用Paramiko执行交互式工具的命令并读取其输出

Python 使用Paramiko执行交互式工具的命令并读取其输出,python,ssh,stdout,paramiko,readline,Python,Ssh,Stdout,Paramiko,Readline,我正在准备一段代码,使用ssh和Paramiko访问远程服务器,并运行一些命令,查看stdout的输出 我已经用Ubuntu服务器测试了代码,它工作得很好,但是当我用另一台服务器测试代码时(这是一台Windows服务器和一台远程通信机器的接口),stdout没有被读取, “远程服务器上成功执行的命令”已打印,但以下(“行已读取”) 未打印,因此我断定代码挂起在stdout=stdout.readlines() 代码复制到下面,你能帮我找出失败的原因吗 我还想补充一点,如果我使用PuTTY在该服务

我正在准备一段代码,使用ssh和Paramiko访问远程服务器,并运行一些命令,查看stdout的输出

我已经用Ubuntu服务器测试了代码,它工作得很好,但是当我用另一台服务器测试代码时(这是一台Windows服务器和一台远程通信机器的接口),stdout没有被读取, “远程服务器上成功执行的命令”已打印,但以下(“行已读取”) 未打印,因此我断定代码挂起在
stdout=stdout.readlines()
代码复制到下面,你能帮我找出失败的原因吗

我还想补充一点,如果我使用PuTTY在该服务器上执行命令,我会得到正确的输出

import paramiko
import os
user_name = "****"
passwd = "******"
ip = "*.*.*.*"

print ("Please wait creating ssh client ...")
ssh_client = paramiko.SSHClient()     #Create sshclient instance
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
print ("Please wait, connecting to remote server")
ssh_client.connect(hostname=ip,username=user_name,password=passwd)
cmd="mml \n command2"
print ("Please wait, executing command on remote server")
stdin,stdout,stderr=ssh_client.exec_command(cmd)
print ("Successfully executed command on remote server")
stdout=stdout.readlines()
print ("lines are read")
stdout="".join(stdout)
ssh_client.close()
print ("Connection closed")
print (stdout)
os.system("pause")

您正在执行的命令是交互式的。启动时,它等待子命令。执行它并等待命令完成时(通过调用
readlines
)。永远不会发生的事

您必须将子命令提供给您的命令才能让它执行某些操作。


您还必须使命令退出(通过发送子命令,如
exit
/
quit
/
bye
)。

您正在执行的命令是交互式的。启动时,它等待子命令。执行它并等待命令完成时(通过调用
readlines
)。永远不会发生的事

您必须将子命令提供给您的命令才能让它执行某些操作。


您还必须使命令退出(通过发送子命令,如
exit
/
quit
/
bye
)。

您确定没有引发异常吗?+您是否对任何命令或某些特定命令有问题?+那是什么样的服务器?您好,是的,没有任何异常,只是挂起没有任何输出。这是一台windows服务器,通过内部协议与另一台电信计算机通信,登录后第一个命令是mml(对于man-machine languague),然后我可以为此电信提供商键入一些特定命令。您确定没有引发异常吗?+您是否对任何命令或某些特定命令有问题?+那是什么样的服务器?您好,是的,没有任何异常,只是挂起没有任何输出。这是一台windows服务器,通过内部协议与另一台电信计算机通信。登录后,第一个命令是mml(对于人机语言),然后我可以为此电信提供商键入一些特定命令。感谢您的反馈,我是否必须在write中添加子命令。stdin:我添加了以下行:stdin.write(“subcommand”)和stdin.flush()在stdout.stdout.readlines()之前,但仍然是相同的结果,我觉得我必须阅读更多关于使用paramiko的内容,但我不知道我需要搜索哪一部分。1)您错过了换行符
+'\n'
。2)您已经告诉了您的命令(
mml
)在调用
readlines
之前关闭。通常通过发送
“exit\n”
“bye\n”
“quit\n”
来关闭。现在执行stdout.readlines,即使它给出空输出[],但我想这是另一个问题,我相信是由于第二个ssh\u客户端.exec\u命令(“exit;”)的位置造成的这会删除mml命令的输出。我已经在上面的问题中添加了修改后的代码。您必须将
退出
发送到
mml
,发送方式与发送
命令1
相同。感谢您的反馈,我是否必须在write中添加子命令。stdin:我添加了以下行:stdin.write(“子命令”)stdout.stdout.readlines()之前的stdin.flush()和stdin.flush(),但仍然是相同的结果,我觉得我必须阅读更多关于使用paramiko的内容,但我不知道需要搜索哪个部分。1)您错过了新行
+'\n'
。2)您已经告诉了您的命令(
mml
)在调用
readlines
之前关闭。通常通过发送
“exit\n”
“bye\n”
“quit\n”
来关闭。现在执行stdout.readlines,即使它给出空输出[],但我想这是另一个问题,我相信是由于第二个ssh\u客户端.exec\u命令(“exit;”)的位置造成的这会删除mml命令的输出。我已在上面的问题中添加了修改后的代码。您必须将
退出
发送到
mml
,发送方式与发送
命令1
相同。