如何在Python Fabric中提供公钥密码短语

4 投票
1 回答
5185 浏览
提问于 2025-04-30 08:33

我写的简单代码是:

env.host_string = '15.21.18.24'
with settings(user=user, key_filename='/home/amby/.ssh/id_rsa.pub'):
    put(local_path, remote_path)

现在我有了公钥的密码短语。我该怎么把这个密码短语写进代码里呢?我希望这个过程能够自动化。

现在它还在要求输入密码短语。

amby@amby-laptop:~/Desktop$ python fabric_test.py
[15.21.18.24] Passphrase for private key:
暂无标签

1 个回答

12

关于术语的简单说明。密码短语是用来保护私钥的,正如提示所示。ssh密钥对由两个部分组成——私钥需要安全保管,绝对不能离开ssh会话。而公钥是可以安全分享的,可以自由传输。

当你想要自动化ssh操作,并且需要提供密码短语时,如果你考虑把这个密码短语存储在脚本或配置文件中,那么这个密码短语就不再是秘密了,你不如直接不设置密码短语


你可以尝试的几件事:

1) 不用担心设置密码短语!它是可选的。可以生成一个没有密码短语的密钥,供你的脚本使用。显然,这种方式比有密码短语的密钥安全性低,所以你需要采取额外的措施来保护它。

你可以通过在远程主机的authorized_keys文件中添加额外的参数,来限制这个ssh密钥可以执行的命令。这样,即使有人获取了你的私钥,也能限制他们造成的损害。

你可以使用ssh-keygen生成一个新的密钥对。给它一个新的文件名,当提示输入密码短语时直接按回车,这样就能得到一个新的私钥/公钥对,可以在脚本中使用,而不需要输入密码短语。

authorized_keys文件需要存在于远程主机上远程用户账户的~./ssh目录中。一个典型的密钥条目看起来像这样(我为了清晰省略了密钥指纹)。如果那里还没有,你可以新建一个。你需要将新密钥对中的公钥文件的文本添加到这个文件中。这个文件的扩展名是.pub。公钥文本的格式如下:

ssh-rsa AAAAB3NzaC1yc... user@mycomputer.local

它由几个字段组成,全部在一行中,用空格分隔。第一个字段是密钥类型。后面那串长长的字母和数字编码了密钥对的公钥。最后一个字段是注释,用来帮助人类识别这个密钥,通常包含生成密钥的用户和主机名。你可以选择在密钥条目的前面添加一个选项字段。这个字段包含一组以逗号分隔的选项值,适用于通过这个密钥对启动的会话。

你可以在authorized_keys的选项字段中添加一个command参数,以指定这个密钥允许执行的特定命令。这可以用来限制没有密码短语的密钥对可以做的事情。

command="/usr/bin/ls" ssh-rsa AAAAB3NzaC1yc... user@mycomputer.local

这个密钥对只能远程执行'ls'命令。


2) 使用ssh-agent。如果你在执行脚本时,shell环境中有一个经过认证的代理,它会在你每次执行时提供ssh密钥凭证,而不需要你每次都输入密码短语。

典型用法:

你在shell中运行

eval `ssh-agent`

来启动代理守护进程。这个eval表达式会在shell环境中设置代理会话的环境变量。

现在你可以运行

ssh-add ~/.ssh/my-passphraseless-private-key.rsa 

将私钥加载到代理中。代理会询问你输入密码短语来解锁密钥。然后它会在shell的生命周期内缓存这些凭证。所以你可以运行使用这个密钥的脚本,而不需要提示输入密码短语。

撰写回答