Как взаимодействовать с ssh с помощью модуля подпроцесса
Я пытаюсь создать дочерний процесс ssh с помощью подпроцесса.
Я работаю над Python 2.7.6 на Windows 7
вот мой код:
from subprocess import * r=Popen("ssh sshserver@localhost", stdout=PIPE) stdout, stderr=r.communicate() print(stdout) print(stderr)
Выходы:
None
stdout должен содержать: sshserver @ пароль localhost:
- subprocess.Popen: как передать список в качестве аргумента
- Python – подпроцессы и оболочка python
- Подпроцесс Python с каналами и большими файлами
- Трубопроводы Shell с подпроцессом в Python
- скрипт python или bash для передачи всех файлов в папку в java-командную строку
Вот пример работы SSH-кода, который обрабатывает promt для да / нет в части сертификата, а также при запросе пароля.
#!/usr/bin/python import pty, sys from subprocess import Popen, PIPE, STDOUT from time import sleep from os import fork, waitpid, execv, read, write class ssh(): def __init__(self, host, execute='echo "done" > /root/testing.txt', askpass=False, user='root', password=b'SuperSecurePassword'): self.exec = execute self.host = host self.user = user self.password = password self.askpass = askpass self.run() def run(self): command = [ '/usr/bin/ssh', self.user+'@'+self.host, '-o', 'NumberOfPasswordPrompts=1', self.exec, ] # PID = 0 for child, and the PID of the child for the parent pid, child_fd = pty.fork() if not pid: # Child process # Replace child process with our SSH process execv(command[0], command) ## if we havn't setup pub-key authentication ## we can loop for a password promt and "insert" the password. while self.askpass: try: output = read(child_fd, 1024).strip() except: break lower = output.lower() # Write the password if b'password:' in lower: write(child_fd, self.password + b'\n') break elif b'are you sure you want to continue connecting' in lower: # Adding key to known_hosts write(child_fd, b'yes\n') elif b'company privacy warning' in lower: pass # This is an understood message else: print('Error:',output) waitpid(pid, 0)
Причина (и исправить меня, если я здесь не так), потому что вы не можете сразу прочитать stdin
, потому что SSH работает как подпроцесс под другим идентификатором процесса, который вам нужно прочитать / прикрепить.
Поскольку вы используете окна, pty
не будет работать. есть два решения, которые будут работать лучше, и это pexpect, и как кто-то указал на аутентификацию на основе ключей.
Чтобы добиться аутентификации на основе ключа, вам нужно только сделать следующее: На вашем клиенте запустите: ssh-keygen
Скопируйте содержимое id_rsa.pub
(одна строка) в /home/user/.ssh/authorized_keys
на сервере.
И вы сделали. Если нет, перейдите с pexpect.
import pexpect child = pexpect.spawn('ssh user@host.com') child.expect('Password:') child.sendline('SuperSecretPassword')
- Как я могу получить окно, ориентированное на Windows, и изменить его размер?
- Ошибка при запуске приложений Google в python в ОС Windows
- Jython subprocess.call () для Python
- Получить вывод bash с помощью python
- Нет подключения к подпроцессу IDLE
- Как предоставить вход в вызов подпроцесса python, который ожидает имя файла, а не переменную?
- Создание новых файлов из загрузки
- Общение с процессом unix-фильтра в Python
- Как использовать python subprocess.check_output с правами root / sudo
- Проблема с выполнением скрипта с использованием Python и subprocces.call пока работает в Bash
- Как я могу взаимодействовать с приложением на mac через подпроцесс python?