Python+;SSH密码验证(没有外部库或公钥/私钥)?

Python+;SSH密码验证(没有外部库或公钥/私钥)?,python,ssh,pty,Python,Ssh,Pty,因此,我知道您可以使用Pexpect来解决这个问题,但我不希望依赖Python3提供的库以外的其他库来解决这个问题 我也知道生成公钥并允许它们在远程主机上运行是理想的,但这正是我打算使用此脚本的目的(在正确的位置设置密钥等) 这是我在SO社区的帮助下“靠自己”做到的。 我在检查分叉子伪终端是否执行了它应该执行的操作。这意味着我可以判断SSH是否执行完毕,因为只要run()函数在运行,SSH就会继续运行 (我的pid_exists将返回True,只要它在run()操作中。如果我退出run()以快速

因此,我知道您可以使用
Pexpect
来解决这个问题,但我不希望依赖Python3提供的库以外的其他库来解决这个问题

我也知道生成公钥并允许它们在远程主机上运行是理想的,但这正是我打算使用此脚本的目的(在正确的位置设置密钥等)

这是我在SO社区的帮助下“靠自己”做到的。 我在检查分叉子伪终端是否执行了它应该执行的操作。这意味着我可以判断SSH是否执行完毕,因为只要
run()
函数在运行,SSH就会继续运行

(我的
pid_exists
将返回
True
,只要它在run()操作中。如果我退出
run()
以快速运行,SSH会话将没有足够的时间执行它应该做的事情)

#/usr/bin/python
导入pty,系统
从子流程导入Popen、PIPE、STDOUT
从时间上导入睡眠
从os.path导入expanduser,abspath
从操作系统导入walk、setsid、fork、waitpid、execv、read、write、kill
def pid_存在(pid):
“”“检查当前进程表中是否存在pid。”“”
如果pid<0:
返回错误
尝试:
杀死(pid,0)
除(o错误,e)外:
返回e.errno==errno.EPERMRM
其他:
返回真值
类ssh():
def\uuuu init\uuuuu(self,host,execute='echo“done”>/root/testing.txt',user='root',password=b'SuperPassword'):
self.exec=execute
self.host=host
self.user=用户
self.password=密码
self.run()
def运行(自):
命令=[
“/usr/bin/ssh”,
self.user+'@'+self.host,
'-o','NumberOfPasswordPrompts=1',
self.exec,
]
#对于子对象,PID=0;对于父对象,PID为子对象的PID
pid,child_fd=pty.fork()
如果不是pid:#子进程
#用SSH进程替换子进程
execv(命令[0],命令)
尽管如此:
输出=读取(child_fd,1024).strip()
打印(输出)
lower=输出。lower()
#写密码
如果在下方显示“密码”:
写入(child\u fd,self.password+b'\n')
打破
elif“您确定要继续连接吗”在下方:
#将密钥添加到已知的\u主机
写入(child\u fd,b'yes\n')
下方的elif“公司隐私警告”:
这是一条可以理解的信息
其他:
打印('错误:',输出)
睡眠(5)
打印(pid_存在(pid))
ssh('10.10.10.1')
我找不到太多(或任何)关于如何获取Python打开的伪伪终端的执行过程的信息,并将其传递给我。 我是否可以或应该像这里解释的那样涉及子流程:或者有其他方法吗?

叹气。。再多一个谷歌就可以省去所有人的麻烦了

os.waitpid(pid, 0)

os.waitpid(pid, 0)