我有一个bsh脚本,执行ssh远程机器,并执行一个命令,如:
ssh -nxv user@remotehost echo "hello world"
当我从命令行执行命令时,它工作正常,但作为crontab的一部分执行时失败(errorcode = 255 – 无法build立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密钥和凭据ssh到crond机器和脚本连接到的任何其他机器。
Bash命令检查在Linux上是否安装了Oracle或OpenJDK Java版本
在bash中可变增量
一线FTP服务器
如何在shell脚本中使用curl?
PS。 请不要问/抱怨/评论说,以root身份执行任何事情是坏的/错误的/等 – 这不是这个问题的目的。
剥离whitspace并将小写字母缩写为连字符 – 文件名
将数据从java传递给cupsfilter
我猜测,通常当你从本地机器ssh到运行crond的机器,你的私钥加载到ssh-agent并通过连接转发。 所以当你从命令行执行命令时,它会在ssh-agent中找到你的私钥并使用它登录到远程机器。
当crond执行命令时,它不能访问ssh-agent,所以不能使用你的私钥。
您将不得不在运行crond的机器上为root创建一个新的私钥,并将其公有部分复制到想要crond登录到的远程机器上相应的authorized_keys文件中。
keychain
以无痛的方式解决这个问题。 这是在Debian / Ubuntu的回购:
sudo apt-get install keychain
也许还有很多其他的发行版(它看起来像是源自Gentoo)。
如果没有任何程序正在运行,这个程序将启动一个ssh-agent ,并提供可以作为source d的shell脚本,并将当前shell连接到这个特定的ssh-agent 。
对于bash ,使用名为id_rsa ,将以下内容添加到.profile :
keychain --nogui id_rsa
这将启动一个ssh-agent并在重新启动后的第一次登录时添加id_rsa密钥。 如果密钥被密码保护,它也会要求密码。 不再需要使用不受保护的密钥! 对于后续登录,它将识别代理,而不再要求密码。
. ~/.keychain/$HOSTNAME-sh
这将让shell知道到达由keychain管理的SSH代理的位置。 确保.bashrc来源于.profile 。
但是, cron作业似乎还没有看到这一点。 作为补救措施,请在实际的命令之前在crontab包含上面的行:
* * * * * . ~/.keychain/$HOSTNAME-sh; your-actual-command
不要使用密码来暴露您的SSH密钥。 改为使用ssh-cron ,它允许您使用SSH代理来安排任务。
所以我有一个类似的问题。 我来到这里,看到了各种答案,但在这里的一些实验是如何使用sshkeys与密码,ssh-agent和cron。
首先,我的SSH设置在我的bash init脚本中使用了以下脚本。
# JFD Added this for ssh SSH_ENV=$HOME/.ssh/environment # start the ssh-agent function start_agent { echo "Initializing new SSH agent..." # spawn ssh-agent /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 600 "${SSH_ENV}" . "${SSH_ENV}" > /dev/null /usr/bin/ssh-add } if [ -f "${SSH_ENV}" ]; then . "${SSH_ENV}" > /dev/null ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } else start_agent; fi
当我登录时,我输入一次密码,然后再使用ssh-agent自动验证。
ssh-agent的详细信息保存在.ssh / environment中。 以下是该脚本的外观:
SSH_AUTH_SOCK=/tmp/ssh-v3Tbd2Hjw3n9/agent.2089; export SSH_AUTH_SOCK; SSH_AGENT_PID=2091; export SSH_AGENT_PID; #echo Agent pid 2091;
关于cron,你可以通过各种方式设置一个普通用户的工作。 如果以root用户身份运行crontab -e,它将设置一个root用户cron。 如果以crontab -u davis -e的形式运行,它将以userid davis的形式添加一个cron作业。 同样,如果以用户davis的身份运行并执行crontab -e,它将创建一个以userid davis身份运行的cron作业。 这可以通过以下条目进行验证:
30 * * * * /usr/bin/whoami
这将每隔30分钟将whoami的结果邮寄给用户戴维斯。 (我做了一个crontabe -e用户davis。)
如果您尝试查看用户戴维斯使用的密钥,请执行以下操作:
36 * * * * /usr/bin/ssh-add -l
它会失败,通过邮件发送的日志会说
To: [email protected] Subject: Cron <davis@hostyyy> /usr/bin/ssh-add -l Could not open a connection to your authentication agent.
解决方案是为上面的ssh-agent提供env脚本。 这是最终的cron条目:
55 10 * * * . /home/davis/.ssh/environment; /home/davis/bin/domythingwhichusesgit.sh
这将在10:55运行脚本。 注意领先。 在脚本中。 它说在我的环境中运行这个脚本类似于.bash初始化脚本。
昨天我有类似的问题…
我有一台服务器,在其他服务器上启动一些行动,使用ssh的cron作业…问题是用户权限和密钥…
在crontab我有
* * * * * PHP /path/to/script/doSomeJob.PHP
而它根本没有工作(没有权限)。 我尝试运行cron作为特定的用户,这是连接到其他服务器
* * * * * user PHP /path/to/script/doSomeJob.PHP
但没有效果。
* * * * * cd /path/to/script/; PHP doSomeJob.PHP
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。