2016-08-11 3 views
0

Я пытаюсь использовать модуль подпроцесса python для ssh на сервере, а затем переключиться на суперпользователя, а затем ls и распечатать папки в терминале.Python subprocess stdout.readlines() get stuck

Мой код:

def sudo_Test(): 
    HOST = 'Host' 
    PORT = '227' 
    USER = 'user' 
    cmd='sudo su - ec2-user;ls' 

    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("my_password\r\n") 

    print "stuck here VVV" 
    result = process.stdout.readlines() 
    print "finished it" 

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

print sudo_Test() 

выход консоли при запуске этого:

dredbounds-computer:folder dredbound$ python terminal_test.py 
stuck here VVV 

По какой-то причине код застревает на результат линии = process.stdout.readlines(). Мне нужно cntrl + c выйти из сеанса терминала, когда это произойдет. Он отлично работает, если я просто делаю cmd = 'sudo; ls 'вместо cmd =' sudo su - ec2-user; ls'.Anyone знаю, что я делаю неправильно или как я могу заставить это работать?

Обновление: Я изменил cmd = 'sudo su - ec2-user; ls' -> cmd = 'sudo su - ec2-user ls' в коде выше. Теперь я получаю следующее сообщение об ошибке:

['password\r\n', '\r\n', '/bin/ls: /bin/ls: cannot execute binary file\r\n'] 

Я не знаю, почему он думает, что Ls является двоичным файлом, в настоящее время, но в любом случае я могу сказать это, что это просто команда терминала, так что возвращает список каталогов?

ответ

1

Проблема здесь:

sudo su - ec2-user;ls 

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

Если ваша цель в том, чтобы запустить ls, как пользователь ec2-user, попробуйте:

sudo -u ec2-user ls 

Другими словами, заменить

cmd='sudo su - ec2-user;ls' 

С:

cmd='sudo -u ec2-user ls' 
+0

Спасибо, просто попробовал это, и теперь я получаю следующую ошибку: ['my_password \ r \ n', '\ r \ n', '/ bin/ls:/bin/ls: невозможно выполнить двоичный файл \ r \ n'] Если я просто запустил «sudo -u ec2 -user ls "в терминале без кода. Я также получаю сообщение об ошибке: " bin/ls: невозможно выполнить двоичный файл " – dredbound

+0

Поскольку ваш вопрос помечен' Linux', странно, что вы получаете линии конца DOS, '\ r \ n', в вашем выходе. Есть ли еще о вашей настройке, которую вы должны нам рассказать? – John1024

+0

Нет, я так не думаю. Я работаю над Mac (OS X El Capitan). Если я сделаю sudo su вручную для пользователя ec2, а затем ls работает. – dredbound