所以我知道你可以使用Pexpect
來解決這個問題,但我不想依賴額外的庫來解決除Python3提供的問題以外的其他問題。Python + SSH密碼驗證(無需外部庫或公鑰/私鑰)?
我也知道生成公共密鑰並允許它們在遠程主機上是理想的,但這就是我打算使用此腳本(在正確位置設置密鑰等)的一種方式。
這是我從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或有其他方法嗎?