Python + SSH Пароль аутентификации (без внешних библиотек или открытых / закрытых ключей)?
Итак, я знаю, что вы можете использоватьPexpect
чтобы решить проблему, но я не хотел бы полагаться на дополнительные библиотеки для решения этой проблемы, кроме поставляемых с Python3.
Я также знаю, что генерация открытых ключей и их использование на удаленном хосте идеальны, но для этого я и собираюсь использовать этот скрипт (установка ключей в нужном месте и т. Д.).
Это насколько я получил "самостоятельно" с кучей помощи от сообщества SO. Я немного застрял, проверяя, завершен ли дочерний псевдотерминал, выполняя то, что должен или нет. То есть я могу сказать, что SSH завершен или нет, потому что он будет работать до тех пор, покаrun()
функция работает.
(мойpid_exists
вернусьTrue
до тех пор, пока он находится внутри операции run (). И если я выйдуrun()
чтобы быстро сессия SSH не успела сделать то, что должна была сделать)
#!/usr/bin/python
import pty, sys
from subprocess import Popen, PIPE, STDOUT
from time import sleep
from os.path import expanduser, abspath
from os import walk, setsid, fork, waitpid, execv, read, write, kill
def pid_exists(pid):
"""Check whether pid exists in the current process table."""
if pid < 0:
return False
try:
kill(pid, 0)
except (OSError, e):
return e.errno == errno.EPERMRM
else:
return True
class ssh():
def __init__(self, host, execute='echo "done" > /root/testing.txt', user='root', password=b'SuperPassword'):
self.exec = execute
self.host = host
self.user = user
self.password = password
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)
while True:
output = read(child_fd, 1024).strip()
print(output)
lower = output.lower()
# Write the password
if b'password:' in lower:
write(child_fd, self.password + b'\n')
break
elif 'are you sure you want to continue connecting' in lower:
# Adding key to known_hosts
write(child_fd, b'yes\n')
elif 'company privacy warning' in lower:
pass # This is an understood message
else:
print('Error:',output)
sleep(5)
print(pid_exists(pid))
ssh('10.10.10.1')
Я не могу найти много (или любой) информации о том, как получить процесс выполнения псевдопсевдотерминала, который Python открывает и передает мне. Могу ли я задействовать подпроцесс, как описано здесь:https://stackoverflow.com/a/12235442/929999 или есть другой способ?