Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Paramiko:将主机密钥永久添加到已知主机_Python_Ssh_Paramiko - Fatal编程技术网

Python Paramiko:将主机密钥永久添加到已知主机

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键永久添加

这段代码帮助我建立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键永久添加到
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连接时,如何设置已知的_主机?