Linux 4.4.0-34-generic #53-Ubuntu SMP 7 月 27 日星期三 16:06:39 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
我使用该脚本来启动 ssh-agent 并启动其他脚本(正在使用预计将密码发送给代理)。
#!/bin/bash
eval `ssh-agent -s`
/root/script2
/根/脚本2:
#!/usr/bin/expect -f
spawn ssh-add /root/.ssh/key
expect "Enter passphrase for /root/.ssh/key:"
send "passphrase\n";
interact
所有脚本均为 +x 密码短语有效 100%
开始第一个脚本后我得到:
Agent pid 3985
spawn ssh-add /root/.ssh/key
Enter passphrase for /root/.ssh/key:
Identity added: /root/.ssh/key (/root/.ssh/key)
如你所见,代理已启动和添加身份但是当我尝试“ssh-添加-l“我得到:
Error connecting to agent: No such file or directory
但进程仍在使用 3985 PID 运行。为什么它告诉我添加身份但ssh-添加-l没用? :(
好的,我尝试手动 eval ssh-agent 并添加密钥文件:
root@:~# eval `ssh-agent -s`
Agent pid 4063
root@:~# ssh-add -l
The agent has no identities.
root@:~# ssh-add /root/.ssh/key
Enter passphrase for /root/.ssh/key:
Identity added: /root/.ssh/key (/root/.ssh/key)
root@:~# ssh-add -l
4096 SHA256:FxPiCFYOiRree0ogNPpo81DTDUqmr1Brlo0LFnFK12o /root/.ssh/key (RSA)
为什么当我尝试手动运行它时它会起作用?如何解决这个问题?我想将其添加到 rc.local 中,以便在 PC 启动时自动启动它。
UPD 如果我尝试只运行脚本2手动,它可以工作(密钥添加到代理)。所以我认为问题出在 eval sh-agent 上,但我不知道出了什么问题
答案1
首先,让我们解决这个问题:在任何情况下,您都不应该使用expect
或类似的东西将密码输入到ssh-add
.由于您已经将密码以明文形式存储在磁盘上,因此您可能只拥有一个没有密码的密钥。您可以自动将这样的密钥添加到代理中,而无需使用expect
任何黑客手段。
当然,仅将此类无密码密钥用于需要通过 SSH 触发特定操作的自动化,并严格限制允许使用 SSH 强制命令调用此类密钥的操作。
现在,您的解决方案不起作用的原因是:
#!/bin/bash
eval `ssh-agent -s`
/root/script2
这个脚本(没有 bash-isms,所以你也可以使用#!/bin/sh
更便携的)启动一个代理并将其详细信息保存到它的环境中,然后运行你的其他脚本,然后退出。当脚本停止运行时,保存代理详细信息的环境变量也会停止运行。
你需要跑
eval `ssh-agent -s`
在您实际想要保存(并重新使用)代理连接详细信息的 shell 中。
不管怎样,既然你的钥匙是无密码的,你真的需要代理人吗?做起来不太复杂:
ssh -i ~/place/where/the/key/lives -l username server restricted-command
这样ssh
客户端就可以直接读取密钥,而不需要通过代理。
最后,看起来您可能以 root 身份执行所有这些操作。除非有充分的理由,在非特权角色帐户中完成所有这些工作。
答案2
请不要遵循通过删除密码来降低私钥安全性的建议。与 Windows 不同,显然 Linux 变体不提供允许安全地永久存储私钥的 ssh-agent 版本,这是非常不幸的,但这并不是遵循糟糕建议的借口,建议您从任何不这样做的人那里完全删除密码短语。 Linux在这方面的失败还没有解决方案。这里有很多关于如何完成您想要的事情的示例,例如:如何启动并使用 ssh-agent 作为 systemd 服务?。针对不同场景更好、更深入的是:如何在没有密码提示的情况下自动运行 ssh-add?。