2010-12-01 2 views
0

совет библиотеки для работы с SSH. Основным требованием является нормальная работа с утилитой sudo. я уже пробовал и то, что я мучаюсь:Лица для работы с SSH

  • paramiko - не Судо вообще, пытаясь после вызова на службу в STDIN пароль, но Sudo писал, что затем введите: «Нет TTYs не представляют»
  • pxssh - mmmmmm, очень медленный, очень очень медленный, неудобный
  • fabric - can sudo только в идеальном мире, так как есть работа с разными пользователями и где мне нужно отправить пароль?

Имеют ли обычные библиотеки, которые работают с sudo, или нет?

+0

Не могли бы вы изменить свой вопрос немного? `sudo` и` ssh` - это две разные вещи. Что вы ищете? – 2010-12-01 07:10:06

+0

Все, что мне просто нужно подключиться к серверу через SSH и выполнить любую задачу из привилегированной учетной записи – Denis 2010-12-01 08:23:39

ответ

0

Вместо того чтобы заставить sudo работать без tty, почему бы не получить Paramiko, чтобы выделить вам TTY?

Paramiko and Pseudo-tty Allocation

0

Вы можете настроить sudo на работу без реального терминала с настройкой «requiretty». Из справочника sudoers:

Если установлено, sudo будет работать только при входе пользователя в реальный tty. Это будет запретить такие вещи, как «rsh somehost sudo ls», поскольку rsh (1) не выделяет tty. Поскольку невозможно отключить эхо, если нет tty, , некоторые сайты могут захотеть установить этот флаг, чтобы пользователь не ввел видимый пароль . По умолчанию этот флаг отключен.

Это работает для меня с парамико. В зависимости от того, что вы делаете, вы также можете посмотреть что-то вроде pexpect.

0

У меня была такая же проблема с pxssh на первых: это было очень медленно!
Вот способ я нашел, чтобы сделать его работать быстрее:

#!/usr/bin/python 

import pxssh 
import getpass 

try: 
    s = pxssh.pxssh() 
    s.PROMPT = "#" 
    hostname = raw_input('hostname: ') 
    username = raw_input('username: ') 
    password = getpass.getpass('password: ') 
    s.login(hostname, username, password, auto_prompt_reset=False) 
    s.sendline('ls') # run a command 
    s.prompt()    # match the prompt 
    print(s.before)  # print everything before the prompt. 
    s.sendline('ls -l /tmp') # run a command 
    s.prompt()    # match the prompt 
    print(s.before)  # print everything before the prompt. 
    s.logout() 
except pxssh.ExceptionPxssh as e: 
    print("pxssh failed on login.") 
    print(e) 

Ключом часть s.PROMPT = "#" и auto_prompt_reset=False в s.login().
Этот метод требует, чтобы вы знали шаблон для подсказки (в моем случае это «#», я думаю, что атрибут PROMPT может быть установлен в регулярное выражение).

0

У меня также были проблемы со скоростью входа на pxssh. Я попытался использовать код, упомянутый выше, но все же видел 10 + секунды только для входа. Использование аргумента original_prompt устранило проблему для меня. Вам нужно убедиться, что для параметра original_prompt задано то, что вы видите при первом ssh в машине, что в моем случае закончилось в '>'.

#!/usr/bin/env python 

from pexpect import pxssh 

host = 'hostname.domain' 
user = 'username' 
password = 'password' 

terminal = pxssh.pxssh() 
terminal.login(host, user, original_prompt='[>$]') 
Смежные вопросы