Форум сайта python.su
Здравствуйте.
Возникла задача - сделать что-то с файлом на удаленном сервере под рутом.
Для этого написал скрипт примерно следующего содержания
import paramiko
login = raw_input("Login ")
ip = raw_input("IP ")
r_password = raw_input("Password ")
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
stdin, stdout, stderr = ssh.exec_command("sudo do_something_with_file")
stdin.write('r_password\n')
ssh.close()
Вывод консоли
>>> stdin, stdout, stderr = ssh.exec_command("sudo do_something_with_file")
>>> stdin.write('r_password\n')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/pymodules/python2.6/paramiko/file.py", line 314, in write
self._write_all(data)
File "/usr/lib/pymodules/python2.6/paramiko/file.py", line 435, in _write_all
count = self._write(data)
File "/usr/lib/pymodules/python2.6/paramiko/channel.py", line 1218, in _write
self.channel.sendall(data)
File "/usr/lib/pymodules/python2.6/paramiko/channel.py", line 763, in sendall
raise socket.error('Socket is closed')
socket.error: Socket is closed
Отредактировано (Окт. 31, 2011 02:36:55)
Офлайн
ssh.connect забыли
Офлайн
извиняюсь, что ввел общество в заблуждение - когда постил скрипт, удалил эту строку.
Код ниже, ошибка та же.
import paramiko
login = raw_input("Login ")
ip = raw_input("IP ")
r_password = raw_input("Password ")
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ip, username=login, password=r_password)
stdin, stdout, stderr = ssh.exec_command("sudo do_something_with_file")
stdin.write('r_password\n')
ssh.close()
Отредактировано (Окт. 31, 2011 14:01:39)
Офлайн
Ну тогда возможно надо так: stdin.write(r_password+'\n')
А вообще посмотрите что там в stderr: print stderr.read()
Отредактировано (Окт. 31, 2011 21:57:49)
Офлайн
если не запрашивать sudo, то работает нормально, но зайти сразу под рутом возможности нет.
>>> print stderr.read()
sudo: no tty present and no askpass program specified
Отредактировано (Ноя. 2, 2011 09:04:06)
Офлайн
в принципе, уже не столь актуально - задачу решил с помощью empty в .sh скрипте. Но всё же интересно, как это сделать в python.
Офлайн
Это из-за пароля.
вот, что пишут в man sudoers:
visiblepw By default, sudo will refuse to run if the user must enter a password but it is not possible to disable echo on
the terminal. If the visiblepw flag is set, sudo will prompt for a password even when it would be visible on
the screen. This makes it possible to run things like “rsh somehost sudo ls” since rsh(1) does not allocate a
tty. This flag is off by default.
Так что можно либо попоользовать ключи, что мне кажется гораздо лучше, чем хардкодить пароль, либо попробовать использовать visiblepw, если уж так хочется использовать пароль.
Офлайн