Python - SSH с паролем на чужой компьютер без использования не встроенных модулей - PullRequest
3 голосов
/ 13 октября 2011

Прежде чем вы проголосуете против этого, позвольте мне сказать, что я прочитал ОЧЕНЬ много вопросов на эту тему на SO и не нашел ответа.Этот ответ ближе всего к тому, что мне нужно, хотя в ответе «Нил».

Какой самый простой способ использовать SSH с использованием Python?

Я бы хотелнайти способ авторизации на другом хосте, используя ssh, предоставив пароль, без импорта нестандартных модулей python.Затем мне нужно было бы иметь возможность отправлять несколько команд, используя соединение SSH.Я должен сделать это, потому что мне нужно автоматизировать что-то во многих закрытых системах, на которые я не могу установить новые модули (не доступные через Интернет).

Ответ в указанном вопросе:

Если вы хотите избежать каких-либо дополнительных модулей, вы можете использовать модуль подпроцесса для запуска

ssh [host] [command] и перехватить вывод.

Попробуйте что-то вроде:

process = subprocess.Popen ("ssh example.com ls", shell = True, вывод stdout = subprocess.PIPE, stderr = subprocess.STDOUT), stderr = process.communicate () status = process.poll () вывод на печать Чтобы иметь дело с именами пользователей и паролями, вы можете использовать подпроцесс для взаимодействия с процессом ssh или установить открытый ключ на сервере, чтобы избежать запроса пароля.

Звучит неплохо,но я не могу понять это достаточно хорошо, чтобы пойти дальше.Может ли кто-нибудь помочь мне сделать шаг ребенка?

(1) log in to ssh
(2) provide the password when its prompted
(3) issue an ls command and display the result

Я могу выполнить остальную часть автоматизации, если смогу просто ввести пароль доступа.

PS: я пытался использовать функцию ожидаемо,но TCL отсутствует в системе, поэтому, пожалуйста, не говорите мне использовать это!Если вы знаете что-то еще, я могу позвонить, чтобы помочь python, но я с удовольствием попробую это сделать, если он будет встроен в систему Fedora Enterprise Linux по умолчанию.

1 Ответ

2 голосов
/ 13 октября 2011

Этот код использует Popen.communicate () для запуска команды.Как описано в главе 17 Справочника по библиотекам Python, connect () открывает каналы для stdin, stdout и stderr, запускает подпроцесс и ожидает завершения процесса.К сведению других читателей: startupinfo - это специфичный для Windows способ запуска подпроцесса в приложении с графическим интерфейсом без появления черного окна консоли;он не нужен при запуске в качестве консольного скрипта или в Linux.

def runcmd(self, prog, args, inputs):
    cmd = " ".join((prog, args))
    si = subprocess.STARTUPINFO()
    si.dwFlags = subprocess.STARTF_USESHOWWINDOW
    process = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, startupinfo=si)
    return(process.communicate(input=inputs))

Его можно вызвать с помощью:

    p = self.runcmd("c:\Program Files\ApplicationDir\application.exe", "arguments", "inputs")
    result = str(p[0],"ascii").strip()
    print(result)

В результате получается 2-кортеж (stdout, stderr), которыйдолжен быть преобразован из строки байтов в строки.Пароль, передаваемый как «входные данные», должен быть байтовой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...