Python Paramiko:将主机密钥永久添加到已知主机
这段代码帮助我建立ssh连接。我知道Python Paramiko:将主机密钥永久添加到已知主机,python,ssh,paramiko,Python,Ssh,Paramiko,这段代码帮助我建立ssh连接。我知道set_missing_host_key_policy在known_hosts中找不到密钥时会有所帮助。但是它的行为与实际的ssh不同,因为在我第一次运行此代码之后,我假设host\u key将添加到known\u hosts中,并且我不再需要函数set\u missing\u host\u key\u policy()。但是,我错了(paramiko.ssh\u exception.SSHException)。如何使用paramiko将host\u键永久添加
set_missing_host_key_policy
在known_hosts
中找不到密钥时会有所帮助。但是它的行为与实际的ssh
不同,因为在我第一次运行此代码之后,我假设host\u key
将添加到known\u hosts
中,并且我不再需要函数set\u missing\u host\u key\u policy()
。但是,我错了(paramiko.ssh\u exception.SSHException)
。如何使用paramiko
将host\u键永久添加到known\u主机
?(由于后端代码的某一部分是用“C”编写的,需要在已知的\u主机中找到主机键
)
还是我误解了什么?我需要一些关于这方面的指导
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=str(host),username =str(user),password=str(pswd))
从软件包文档中,比较
client.load\u system\u host\u密钥(filename=None)
从系统(只读)文件加载主机密钥。主机密钥读取与
“保存主机密钥”不会将此方法保存回。
与
client.load\u host\u密钥(文件名)
从本地主机密钥文件加载主机密钥。主机密钥与此一起读取
方法将在通过“加载系统主机密钥”加载密钥后进行检查,
但将通过“保存主机密钥”保存回来(以便可以修改)。
缺少的主机密钥策略“.AutoAddPolicy”将密钥添加到此集合,并且
在连接到以前未知的服务器时保存它们。
因此,要让Paramiko存储任何新的主机密钥,您需要使用加载主机密钥
,而不是加载系统主机密钥
。例如
client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
但是通常避免使用AutoAddPolicy
,这是一个好主意,因为它会使您对中间人攻击开放。我最后做的是在与脚本相同的文件夹中生成一个本地已知的\u hosts
:
ssh-o GlobalKnownHostsFile=/dev/null-o UserKnownHostsFile=./known_主机user@host
然后加载此文件:
client.load_host_keys(os.path.join(os.path.dirname(__file__), 'known_hosts'))
通过这种方式,我可以将已知的_主机
与脚本一起分发,并在不同的机器上运行它,而不必接触这些机器上的实际已知的_主机。##使用paramiko远程添加用户ssh
import paramiko
import os
ssh= paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.10.49', port=22,username='root', password='abc@123')
def addnewuser():
uname=input("Type your new Create userName")
upass=input("Enter Password")
os.system("useradd -m -p "+upass+" "+uname)
addnewuser()
如果要在运行时添加一个特定密钥(无任何文件):
从paramiko导入密钥
从paramiko.py3compat导入解码字节
client=SSHClient()
#已知主机密钥
know_host_key=“”
keyObj=RSAKey(数据=解码字节(know\u host\u key.encode())
#添加到主机密钥
client.get\u host\u keys().add(hostname=host,keytype=“ssh rsa”,key=keyObj)
#登录到ssh主机名
client.connect(主机名=主机,端口=端口,用户名=用户)。。。
来源:如果您使用ssh
生成known_hosts
,它基本上与使用AutoAddPolicy
生成它相同(当然,我的意思是,如果您自己生成,然后随脚本一起分发)+1我发现使用路径库有点简单:hostkeys=Path.cwd()/“已知的\u主机”客户端。加载\u主机\u密钥(hostkeys)这如何回答“将主机\u密钥永久添加到已知的\u主机”的问题?这是ssh。当服务器仅允许基本sftp连接时,如何设置已知的_主机?