gpt4 book ai didi

bash - 为什么 ssh 从 crontab 失败但从命令行执行时成功?

转载 作者:行者123 更新时间:2023-11-29 08:44:02 25 4
gpt4 key购买 nike

我有一个 bash 脚本,可以通过 ssh 连接到远程机器并在那里执行命令,例如:

ssh -nxv user@remotehost echo "hello world"

当我从命令行执行命令时,它工作正常,但当它作为 crontab 的一部分执行时失败(错误代码=255 - 无法建立 SSH 连接)。详情:

...
Waiting for server public key.
Received server public key and host key.
Host 'remotehost' is known and matches the XXX host key.
...
Remote: Your host key cannot be verified: unknown or invalid host key.
Server refused our host key.
Trying XXX authentication with key '...'
Server refused our key.
...

在本地执行时,我以 root 身份执行,crontab 也以 root 身份运行。从 crontab 和命令行执行“id”给出完全相同的结果:

$ id
> uid=0(root) gid=0(root) groups=0(root),...

我从某台本地机器通过 ssh 连接到运行 crond 的机器。我有 ssh key 和凭据,可以通过 ssh 连接到 crond 机器和脚本连接到的任何其他机器。

附言。请不要询问/提示/评论以 root 身份执行任何操作是不好的/错误的/等等 - 这不是这个问题的目的。

最佳答案

keychain

以无痛的方式解决了这个问题。它在 Debian/Ubuntu 的存储库中:

sudo apt-get install keychain

也许还有许多其他发行版(看起来它起源于 Gentoo)。

如果没有运行,这个程序将启动一个ssh-agent,并提供可以是sourced的shell脚本,并将当前shell连接到这个特定的 ssh 代理.

对于 bash,使用名为 id_rsa 的私钥,将以下内容添加到您的 .profile:

keychain --nogui id_rsa

这将启动一个 ssh-agent 并在重启后的第一次登录时添加 id_rsa key 。如果 key 受密码保护,它也会要求输入密码。 无需再使用未 protected key !对于后续登录,它将识别代理并且不再要求输入密码。

此外,将以下内容添加到 .bashrc 的最后一行:

. ~/.keychain/$HOSTNAME-sh

这将使 shell 知道从哪里到达由 keychain 管理的 SSH 代理。确保 .bashrc 来自 .profile

不过,cron jobs 好像还是看不到这个。作为一种补救措施,请在 crontab 中的实际命令之前包含上面的行:

* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command

关于bash - 为什么 ssh 从 crontab 失败但从命令行执行时成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/869589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com