channel.recv_exit_status в paramiko всегда возвращает код возврата первой команды, выполненной через invoke_shell

Я получаю некоторое несоответствие в коде возврата ниже. Может быть, я не использую должным образом. Каждый раз, когда я печатаю код возврата, он печатается так же, как и первый. Нужно ли сбрасывать код возврата. Я имею в виду, что в следующем примере я получаю код возврата как 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()

Мне нужно напечатать код возврата каждой команды. Не могли бы вы помочь мне, как решить эту проблему?


person sameer    schedule 19.11.2011    source источник


Ответы (1)


Статус выхода, отправленный обратно через ssh, — это статус удаленной команды, выполняемой процессом ssh. Вы получаете только один статус выхода, и в случае invoke_shell() это статус выхода самой оболочки. Статус выхода команд, выполняемых в этой оболочке, известен только в этой среде.

Вам нужно либо получить и проанализировать статус в оболочке или сценарии (ярлык bash — это переменная $?), либо выполнить свои команды независимо с помощью exec_command().

См. также: Могу ли я получить код выхода команды, выполняемой в подоболочке через ssh?

person JimB    schedule 29.11.2011