Найти - Пользователи
Полная версия: ssh через paramiko
Начало » Python для новичков » ssh через paramiko
1
Viktors
Здравствуйте.
Возникла задача - сделать что-то с файлом на удаленном сервере под рутом.
Для этого написал скрипт примерно следующего содержания

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
Подскажите, пожалуйста, где ошибка.
Ed
ssh.connect забыли
Viktors
извиняюсь, что ввел общество в заблуждение - когда постил скрипт, удалил эту строку.
Код ниже, ошибка та же.

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()
Ed
Ну тогда возможно надо так: stdin.write(r_password+'\n')
А вообще посмотрите что там в stderr: print stderr.read()
Viktors
если не запрашивать sudo, то работает нормально, но зайти сразу под рутом возможности нет.

>>> print stderr.read()
sudo: no tty present and no askpass program specified
как это исправить?
Viktors
в принципе, уже не столь актуально - задачу решил с помощью empty в .sh скрипте. Но всё же интересно, как это сделать в python.
Ed
Это из-за пароля.
вот, что пишут в 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, если уж так хочется использовать пароль.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB