paramiko中的channel.recv_exit_status总是返回在invoke_shell上执行的第一个命令的返回码

时间:2011-11-19 03:31:40

标签: exitstatus

我在下面的返回代码中遇到了一些差异。可能是我没有以正确的方式使用。每次我打印返回代码时,它都会打印出与返回的第一个相同的内容。我是否需要重置返回码。我的意思是在下面的例子中,我得到两个命令的返回码为2。现在当我交换两个命令时,我的意思是用ls -al;exit\n替换ls -al file_not_exist;exit\n,反之亦然,它打印返回代码0.每次打印的返回代码与第一个返回的代码相同。

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('localhost', username='sam', password='mypassword')

channel = ssh.invoke_shell()
channel.send('ls -al file_not_exist;exit\n') #Sending to list a file which doesn't exist
time.sleep(3)
print "My 1st command exit status is: ",channel.exit_status_ready()
print "My 1st command return code is: ", channel.recv_exit_status()

channel.send('ls -al;exit\n')
time.sleep(3)
print "My 2nd command exit status is: ",channel.exit_status_ready()
print "My 2nd command return code is: ",channel.recv_exit_status()

我需要打印每个命令的返回码。你能帮我解决一下如何解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

通过ssh发回的退出状态是ssh进程执行的远程命令的退出状态。您只获得一个退出状态,在invoke_shell()的情况下,这是shell本身的退出状态。在该shell中运行的命令的退出状态仅在该环境中是已知的。

您需要检索并解析shell或脚本中的状态(bash快捷方式是变量$?),或者使用exec_command()独立执行命令。

另见: Can I get the exit code of a command executed in a subshell via ssh?