Выполнение su пользователя (без пароля) при подключении через paramiko ssh - PullRequest
2 голосов
/ 07 декабря 2011

Мне нужно войти в систему через ssh на сервер, выполнить «su username» (без пароля), чтобы выполнить некоторые команды от имени этого пользователя (которые не имеют прямого входа в ssh).

Из терминала это будет примерно так:

root@cs01:~# su foo
foo@cs01:/root$ cd
foo@cs01:~$ ls

Я пытался сделать это с помощью paramiko (python):

import paramiko
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect('host', username='root', password='mypassword', key_filename='<filename>')

stdin, stdout, stderr = ssh.exec_command('su foo')
print stdout.readlines()
stdin, stdout, stderr = ssh.exec_command('cd')
print stdout.readlines()
stdin, stdout, stderr = ssh.exec_command('pwd')
print stdout.readlines()
ssh.close()

Но сценарий не заканчивается.

Журналы это:

...
DEB [20111207-16:22:25.538] thr=1   paramiko.transport: userauth is OK
INF [20111207-16:22:25.921] thr=1   paramiko.transport: Authentication (publickey) successful!
DEB [20111207-16:22:25.923] thr=2   paramiko.transport: [chan 1] Max packet in: 34816 bytes
DEB [20111207-16:22:26.088] thr=1   paramiko.transport: [chan 1] Max packet out: 32768 bytes
INF [20111207-16:22:26.088] thr=1   paramiko.transport: Secsh channel 1 opened.
DEB [20111207-16:22:26.151] thr=1   paramiko.transport: [chan 1] Sesch channel 1 request ok

Если я попробую только это:

stdin, stdout, stderr = ssh.exec_command('su foo')
#without print
stdin, stdout, stderr = ssh.exec_command('pwd')
print stdout.readlines()

выполняет pwd как root, а не как foo.

Что не так?

1 Ответ

7 голосов
/ 07 декабря 2011

Каждый вызов exec_command() происходит в новой оболочке, поэтому состояние не переносится из предыдущих команд. Если для выполнения команд используется предыдущая команда, вы должны отправить их в виде одного оператора или в виде сценария. Если вам нужна интерактивная оболочка, есть команда invoke_shell, но затем вам нужно проанализировать выходные данные оболочки для имитации интерактивного использования (здесь можно использовать библиотеку pexpect).

Вы можете использовать команду sudo или su -c для выполнения команды. Однако я бы предложил настроить безопасный вход в систему для нужного пользователя и подключиться напрямую под этим пользователем.

...