![自动输入 SSH 密码,无需使用 SSH Key、'expect'、'sshpass' 或 Python](https://linux22.com/image/87586/%E8%87%AA%E5%8A%A8%E8%BE%93%E5%85%A5%20SSH%20%E5%AF%86%E7%A0%81%EF%BC%8C%E6%97%A0%E9%9C%80%E4%BD%BF%E7%94%A8%20SSH%20Key%E3%80%81'expect'%E3%80%81'sshpass'%20%E6%88%96%20Python.png)
我有一个小型设备,可以启动 PowerPC linux 的小型虚拟机,我需要通过 Yocto linux 小型版本上的脚本通过 SSH 访问该虚拟机。 PowerPC VM SSH 密码保持不变,但会重置最多其核心文件,包括每次重新启动时重新生成 ssh 密钥。
Yocto linux 安装没有“expect”命令,也无法安装“sshpass”。它的 Python 版本极其有限。
我希望能够仅使用 shell 脚本从基本的“ssh”提示符完成密码要求。这可能吗?
答案1
假设您想要一个在通过 ssh 登录时向远程发送密码的脚本,这里有一些非常小的 python 代码,不需要任何额外的库等。显然,这只是使用 os forkpty execlp read write 可以实现的功能的一个示例。
#!/usr/bin/python
# simplest builtin python pseudo-tty for ssh password. meuh
# http://unix.stackexchange.com/a/276385/119298
import os
def run(cmd,*args):
pid, fd = os.forkpty()
if pid==0: # child
os.execlp(cmd,*args)
while True:
data = os.read(fd,1024)
print data
if "password:" in data: # ssh prompt
os.write(fd,"mypassword\n")
elif data.endswith("$ "): # bash prompt for input
os.write(fd,"echo hello\n")
os.write(fd,"echo bye\n")
os.write(fd,"exit\n")
run("ssh", "ssh", "user@remote")
请注意,您需要输入“ssh”两次,一次用于 argv[0]。
答案2
嘿,谢谢你的小费!我需要做一个循环来在不同的设备上发送命令,并且我自定义您的代码:
#!/usr/bin/python
# simplest builtin python pseudo-tty for ssh password. meuh
# http://unix.stackexchange.com/a/276385/119298
import os
import subprocess
import getpass
addresses = open('IP_addresses.txt', 'r')
lines = addresses.readlines()
update_log = open('Update_Log.txt', 'w')
update_log.close()
password = getpass.getpass(prompt='Password: ', stream=None)
def ssh_connect():
global count
count = 0
for line in lines:
count += 1
print line.strip()
x = line.strip()
x = x.split(',')
def run(cmd,*args):
pid, fd = os.forkpty()
if pid==0: # child
os.execlp(cmd,*args)
while True:
data = os.read(fd,1024)
print data
if "Password:" in data: # ssh prompt
os.write(fd,password)
os.write(fd,"\n")
elif data.endswith("#"): # bash prompt for input
os.write(fd,"terminal l 0\n")
os.write(fd,"show version\n")
os.write(fd,"exit\n")
if "closed." in data: # connection closed for input
break
run("ssh", "ssh", '%s@%s' %(x[0], x[1]))
if not line:
break
print("Line{}: {}".format(count, line.strip()))
addresses.close()
print ssh_connect()
它没有按我想要的方式工作,因为我的命令“退出”阻止了循环。我将继续寻找解决方案。