Paramiko连接时不询问SSH密钥
这是我用来连接服务器的Python脚本。但是当我运行这个脚本时,它让我输入我的SSH密码短语。我该怎么做才能不再被要求输入这个SSH密码短语呢?
host = '192.168.43.3'
user = 'root'
passwd = 'ppawd'
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=passwd)
transport = ssh.get_transport()
channel = transport.open_session()
channel.setblocking(1)
channel.settimeout(30)
command = "ls -a"
ssh.exec_command(command)
4 个回答
你可以把每个服务器的指纹添加到已知主机列表中。对于单个用户来说:
cat ~/.ssh/known_hosts
echo "$SERVER,$PORT ssh-rsa $SERVER_KEY_FINGERPRINT" >> ~/.ssh/known_hosts
把你的连接主机的IP地址添加到已知主机列表里,这样就不会再问你像“你确定要继续连接吗(是/否)?”这样的问题了。如果你还想禁用密码提示,可以查看这些链接:
http://www.linuxproblem.org/art_9.html https://www.debian.org/devel/passwordlessssh我的建议是生成一个没有密码的密钥——在创建密钥时,当系统问你要输入密码时,直接按回车就可以了。
这个密钥应该专门用在你的脚本上——尽量不要重复使用你用在其他地方的密钥(比如用户的登录密钥),因为这样会让撤销密钥和控制访问变得更麻烦。
没有密码的密钥相比于在脚本中硬编码密码有一些好处:
- 没有密码的密钥让任何人都能清楚地知道,一旦有人获取了这个密钥,它就被泄露了。把密码和密钥分开隐藏了这个事实,但并没有提供额外的安全性。
- 这样可以避免你不小心把密码发布到源代码管理系统中(源代码和访问控制凭证分开)。
- 可能会让你不那么想重复使用任何已有的带有正确密码的用户ssh密钥。
一些安全方面的考虑:
记住,任何能访问这个密钥的人都能进入远程系统。你可以考虑给密钥文件设置严格的权限,并在远程系统上为你的脚本创建一个单独的用户,如果可能的话。
如果你的脚本是单一用途的,你也可以考虑限制远程系统上用户可以使用的命令列表。
如果存储密钥的系统没有物理安全措施(比如:在不可信的地方的笔记本电脑或台式机),你可能还想使用全盘加密、块设备加密(LUKS)或文件级加密(encfs)。
我解决这个问题的方法是:
ssh-copy-id root@192.168.43.133
感谢这个网站:http://sshmenu.sourceforge.net/articles/key-setup.html
我也遇到过同样的问题。我觉得这里其他的回答可能没有理解这个问题的真正意图。这是一个老问题,但我想帮助像我一样通过搜索找到这里的其他人。
你需要关闭ssh代理功能,也就是把allow_agent设置为False,这样就不会再提示你输入密码了。Paramiko正在尝试连接ssh代理,我猜它是想读取密钥。我还添加了look_for_keys=False,这样就会禁用查找私钥的功能。
示例:
client.connect(server, port=port, username=username, password=password, look_for_keys=False, allow_agent=False)