Парамико и Судо - PullRequest
       48

Парамико и Судо

5 голосов
/ 26 апреля 2011

Я уже некоторое время искал в сети решение моей проблемы, и мне не повезло.

Моя проблема в том, что я не могу заставить команды sudo работать с paramiko.

Сначала я попытался просто использовать функцию SSHClient (). Exec_command (command) для выполнения команды sudo, но это с ошибками:

sudo: sorry, you must have a tty to run sudo

Затем, следуя совету этогоpost: Как сделать команду sudo, используя Paramiko , я попробовал это:

#self._ssh is the SSHClient object    
self._ssh.invoke_shell().exec_command(command)

Однако, в большинстве случаев, это просто дает мне:

File "pipelines/load_instance/ssh_tools.py", line 71, in executeCommand
    stdin, stdout, stderr = self._ssh.invoke_shell().exec_command(command)
  File "<absolute_path>/paramiko/channel.py", line 213, in exec_command
    self._wait_for_event()
  File "<absolute_path>/paramiko/channel.py", line 1084, in _wait_for_event
    raise e
paramiko.SSHException: Channel closed.

С другой стороны, я бы сказал, что в 40% случаев я получаю следующее:

File "<absolute_path>/paramiko/client.py", line 291, in connect
    sock.connect(addr)
File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 111] Connection refused

В качестве дополнительного примечания я пытаюсь запустить эти команды sudo на Amazon Web Services EC2Например, я не понимаю, почему я получаю ошибку «Отказано в соединении», поскольку каждый раз, когда я запускаю этот код, он появляется на новом новом экземпляре ...

Кроме того, я использую paramiko 1.7.6.

Ответы [ 2 ]

3 голосов
/ 26 апреля 2011

Это распространенная проблема в последних дистрибутивах, которая влияет не только на paramiko.(Я столкнулся с ним на днях, когда обновил коробку с fedora2 до последней версии. Несколько скриптов управления ssh / sudo сломались)

Пока у вас есть доступ к удаленному хосту, вы можете редактировать /etc/sudoers изакомментируйте строку: Defaults requiretty

Подробности в справочной странице sudoers :

requiretty

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

0 голосов
/ 10 апреля 2017
stdin, stdout, stderr = client.exec_command(cmd,  get_pty=True)
...