我已经在 ubuntu 服务器计算机上设置了 openSSH 服务器,并将其配置为使用公钥/私钥(无密码)。我想在客户端连接到服务器时要求密码和密钥检查,因此我使用密码创建了私钥。问题是,仅在客户端第一次尝试连接到服务器时才需要密码,并且任何连续的连接(来自同一客户端)都会自动连接,而无需再次询问密码。一个例外是当客户端的计算机重新启动时,但这不是我想要的。
我对客户端的机器有完全的控制权,所以我决定使用命令“ssh-add -D”添加一个 cron 作业,这会删除客户端计算机上 ssh 代理的所有身份,这意味着客户端下次尝试时为了连接,他会被要求输入密码,就像第一次一样。我将此命令添加到一个 cron 作业中,每小时运行一次(这会让我满意,即使这意味着并非每次尝试连接都需要密码)。
不幸的是,当作业执行时它似乎没有做任何事情。我检查了该作业是否实际执行并添加了更多命令 - 虽然所有命令都按预期工作,但只有 ssh-add 似乎出现故障。
我添加了带有以下几行的 cron 作业:
user@ubuntu:~$ crontab -u user -e
然后我选择 vim 进行编辑,并添加了以下行:
* * * * * ssh-add -D
已保存。
我究竟做错了什么?
顺便说一句:我对 Linux 很陌生(使用 ubuntu),所以我可能不理解一些高级概念。如果您的答案很简单,我将不胜感激:)
答案1
通常,如果程序从 cron 运行,环境变量会有所不同,因此ssh-add
找不到任何 ssh-agent。
而是调用以下脚本来尝试所有代理并$SSH_AUTH_SOCK
正确设置:
#!/bin/sh
for agent in /tmp/ssh-*/agent.*; do
export SSH_AUTH_SOCK=$agent
if ssh-add -l 2>&1 > /dev/null; then
# working ssh-agent found
ssh-add -D # delete all identities
fi
done
答案2
也许添加就足够了
AddKeysToAgent yes
到客户的.ssh/config
?
答案3
乔费尔的回答和吉尔的评论引导我这样做
echo $SSH_AUTH_SOCK
从命令行,显示:
/run/user/1000/keyring/ssh
所以,当从 crontab 运行时,这对我有用:
export SSH_AUTH_SOCK=/run/user/1000/keyring/ssh && ssh-add -D