Paramiko连接而不询问ssh键

时间:2014-11-03 11:08:41

标签: python linux ssh paramiko ssh-keys

这是我连接到服务器的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 个答案:

答案 0 :(得分:1)

我的建议是生成没有密码短语的密钥 - 只需在创建密钥时要求输入密码时按Enter键。

此密钥应专门用于您的脚本 - 避免重复使用您用于其他目的的密钥(例如用户的交互式登录),因为它会使密钥撤销和访问控制更加困难。

与在脚本中硬编码密码相比,无密码短语具有一些优势:

  • 无密码密钥的存在使任何人都可以在任何人访问密钥时立即泄露密钥。将密码与密钥分开可隐藏此事实,而无需提供任何额外的安全性。
  • 它可以避免您意外地将密码发布到源代码控制(源代码和访问控制凭据的分离)
  • 可能会减少重复使用任何现有用户的ssh密钥并使用正确的密码短语。

一些安全考虑事项:

请记住,有权访问该密钥的任何人都可以访问远程系统。您可以考虑对密钥文件设置限制性权限,并为脚本创建单独的用户以便在远程系统中登录(如果可能的话)。

如果您的脚本是单一目的,您还可以考虑限制远程系统上用户可用的shell命令列表

如果您在存储密钥的系统上没有物理安全性(例如:笔记本电脑或台式机位于不受信任的位置),您可能还需要使用全盘加密,阻止设备加密(LUKS)或文件级加密(encfs)。

答案 1 :(得分:1)

您可以将指纹添加到每个服务器的known_hosts。对于单个用户:

cat ~/.ssh/known_hosts
echo "$SERVER,$PORT ssh-rsa $SERVER_KEY_FINGERPRINT" >> ~/.ssh/known_hosts

将您的连接主机IP添加到known_hosts然后它不会要求任何问题,例如 您确定要继续连接(是/否)吗? 或者如果你想要禁用密码,请检查此链接 http://www.linuxproblem.org/art_9.html https://www.debian.org/devel/passwordlessssh

答案 2 :(得分:1)

我解决了这个问题

ssh-copy-id root@192.168.43.133

归功于http://sshmenu.sourceforge.net/articles/key-setup.html

答案 3 :(得分:0)

我遇到了同样的问题。我认为这里的其他答案没有意识到问题的实质。这是一个古老的问题,但是我想帮助像谷歌搜索后来到这里的其他人。

您需要禁用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)