Это потому, что вы должны открывать новый канал для каждого вызова exec_command.Это теряет аутентификацию команды su, поскольку она связана с конкретным каналом.
У вас есть несколько вариантов.
- запустить команду с sudo, что может быть невозможно через paramiko
- Войдите в систему как пользователь root, что не обязательнохорошая идея
- Использовать invoke_shell () на вашем канале, а затем отправлять команды через std в оболочку
Опция 3 позволяет интерактивно использовать ssh с paramiko, сохраняя информацию о состоянии без изменений,Это то, что вам нужно для команд su.Это также позволяет вам создавать оболочку pexpect-типа вокруг вашего соединения с оболочкой, отслеживая канал stdout на наличие признаков того, что все сделано, и вы можете отправлять дополнительные команды через stdin.Просто следите за тем, чтобы каналы не заполнялись и не блокировались, пока вы не прочитаете данные.