Я использую Paramiko SSH на Python. Он отлично работает в первый раз, как показано в следующем журнале:
.... more logs above...
Authentication (password) successful!
[chan 0] Max packet in: 32768 bytes
[chan 0] Max packet out: 32768 bytes
Secsh channel 0 opened.
[chan 0] Sesch channel 0 request ok
[chan 1] Max packet in: 32768 bytes
[chan 1] Max packet out: 32768 bytes
Secsh channel 1 opened.
[chan 0] EOF sent (0)
[chan 1] Sesch channel 1 request ok
Ignoring message for dead channel 0
Ignoring message for dead channel 0
Ignoring message for dead channel 0
... starts running expect script and works fine...
[chan 1] EOF received (1)
[chan 1] EOF sent (1)
[chan 2] Max packet in: 32768 bytes
[chan 2] Max packet out: 32768 bytes
Secsh channel 2 opened.
[chan 2] Sesch channel 2 request ok
EOF in transport thread
И я снова запускаю сразу после завершения этого сценария, и он не работает со следующим журналом:
... more logs above...
Authentication (password) successful!
[chan 0] Max packet in: 32768 bytes
[chan 0] Max packet out: 32768 bytes
Secsh channel 0 opened.
[chan 0] Sesch channel 0 request ok
[chan 1] Max packet in: 32768 bytes
[chan 1] Max packet out: 32768 bytes
Secsh channel 1 opened.
[chan 0] EOF sent (0)
[chan 1] Sesch channel 1 request ok
[chan 1] EOF received (1)
[chan 2] Max packet in: 32768 bytes
[chan 1] EOF sent (1)
[chan 2] Max packet out: 32768 bytes
Secsh channel 2 opened.
Ignoring message for dead channel 0
Ignoring message for dead channel 0
[chan 2] Sesch channel 2 request ok
EOF in transport thread
... does not run rest and ends here...
Вот пример моего кода (не точный):
import paramiko
import logging
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.WarningPolicy)
ssh.connect(host, username=usr, password=pwd)
prompt="{\\\\$ $}"
expect_script='set timeout -1\n' \
'spawn sudo -i -u {0}\n' \
'expect -exact \\"\\\\[sudo\\\\] password for {1}: \\"\n' \
'send -- \\"{2}\\\\r\\"\n' \
'set prompt_re {3}\n' \
'expect -re \\$prompt_re\n' \
'send \\"shell_script.sh\\\\r\\"\n' \
'expect -re \\$prompt_re\n' \
'\n' \
.format(another_user,usr,pwd,prompt)
ssh.exec_command('echo "{}" > test.exp'.format(expect_script))
stdin, stdout, stderr = ssh.exec_command('expect test.exp')
for line in stdout:
logging.debug(line.strip('\n'))
ssh.close()
Я думаю, это как-то связано с тем, что сессия не закрывается должным образом в конце. Мне нужно запустить этот скрипт на Python несколько раз, и он работает, только если я жду ~ 5 минут между каждым запуском этого. Я добавил ожидаемый скрипт в код на случай, если это может быть причиной проблемы. Может быть, потому, что ожидаемый сценарий все еще работает, и я пытаюсь начать другой сеанс? Каждый раз, когда я запускаю это, хост и пользователь совпадают.