Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 31, 2011 02:36:22

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

ssh через paramiko

Здравствуйте.
Возникла задача - сделать что-то с файлом на удаленном сервере под рутом.
Для этого написал скрипт примерно следующего содержания

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)

Офлайн

#2 Окт. 31, 2011 10:04:22

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

ssh через paramiko

ssh.connect забыли



Офлайн

#3 Окт. 31, 2011 14:01:06

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

ssh через paramiko

извиняюсь, что ввел общество в заблуждение - когда постил скрипт, удалил эту строку.
Код ниже, ошибка та же.

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)

Офлайн

#4 Окт. 31, 2011 21:54:41

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

ssh через paramiko

Ну тогда возможно надо так: stdin.write(r_password+'\n')
А вообще посмотрите что там в stderr: print stderr.read()



Отредактировано (Окт. 31, 2011 21:57:49)

Офлайн

#5 Ноя. 1, 2011 17:36:04

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

ssh через paramiko

если не запрашивать sudo, то работает нормально, но зайти сразу под рутом возможности нет.

>>> print stderr.read()
sudo: no tty present and no askpass program specified
как это исправить?



Отредактировано (Ноя. 2, 2011 09:04:06)

Офлайн

#6 Ноя. 2, 2011 09:51:46

Viktors
От:
Зарегистрирован: 2011-10-23
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

ssh через paramiko

в принципе, уже не столь актуально - задачу решил с помощью empty в .sh скрипте. Но всё же интересно, как это сделать в python.



Офлайн

#7 Ноя. 2, 2011 22:24:37

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

ssh через paramiko

Это из-за пароля.
вот, что пишут в 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, если уж так хочется использовать пароль.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version