2016-07-28 3 views
0

Вот мой код:Python подпроцесс Судо возвращается ошибка: ERROR: [ «Sudo: извините, вы должны TTY для запуска SUDO п»]

import subprocess 

HOST = 'host_name' 
PORT = '111' 
USER = 'user_name' 
CMD = 'sudo su - ec2-user; ls' 

process = subprocess.Popen(['ssh','{}@{}'.format(USER, HOST), 
         '-p', PORT, CMD], 
         shell=False, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

result = process.stdout.readlines() 

if not result: 
    print "Im an error" 
    err = process.stderr.readlines() 
    print('ERROR: {}'.format(err)) 
else: 
    print "I'm a success" 
    print(result) 

Когда я запускаю это я получаю следующий результат в моем терминале:

dredbounds-computer: documents$ python terminal_test.py 
Im an error 
ERROR: ['sudo: sorry, you must have a tty to run sudo\n'] 

Я пытался несколько вещей, но я получаю эту ошибку «Sudo: извините, вы должны TTY для запуска sudo». Он отлично работает, если я просто делаю это через терминал вручную, но мне нужно автоматизировать это. Я читал, что обходным решением может быть использование «-t» или «-tt» в моем вызове ssh, но я еще не смог реализовать это успешно в подпроцессе (терминал просто зависает для меня). Кто-нибудь знает, как я могу исправить свой код или решить эту проблему? В идеале я хотел бы ssh, затем переключиться на пользователя sudo, а затем запустить файл оттуда (я просто положил ls для тестирования).

+0

Почему 'Sudo су - ec2 пользователей; ls' вместо 'sudo -u ec2-user ls'? – miken32

ответ

1

sudo запрашивает пароль, но для этого нужен терминал. Передача -t или -tt предоставляет терминал для запуска удаленной команды, но теперь он ждет ввода пароля.

process = subprocess.Popen(['ssh','-tt', '{}@{}'.format(USER, HOST), 
          '-p', PORT, CMD], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          stdin=subprocess.PIPE) 
process.stdin.write("password\r\n") 

Имейте в виду, однако, что ls не не работает до тех пор, после оболочки начатое su выходов. Вы должны либо войти в машину как ec2-user напрямую (если возможно), либо просто использовать sudo, чтобы выполнить любую команду, если хотите, не пройдя через su.

+0

Спасибо за ответ. Я попробовал использовать process.stdin.write («пароль»), как вы сказали, но я получаю: «AttributeError: объект« NoneType »не имеет атрибута« write »« , когда я его запускаю. – dredbound

+0

Вы передали 'stdin = subprocess.PIPE' в качестве аргумента? – chepner

+0

Пропустил это, но теперь это только возвращает меня к исходному выходу с консоли. «ОШИБКА: ['sudo: извините, у вас должно быть tty для запуска sudo \ n']" – dredbound

0

Вы можете сообщить sudo для работы без запроса пароля. Просто добавьте это в /etc/sudoers на удаленный сервер host_name.

user ALL = (ec2-user) NOPASSWD: ls 

Это позволяет пользователю с именем user выполнить команду ls, как ec2-user без ввода пароля.

Это предполагает, что вы изменить свою команду, чтобы выглядеть так, что кажется более разумным мне:

CMD = 'sudo -u ec2-user ls'