Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux cron作业内的ssh代理转发_Linux_Ssh - Fatal编程技术网

Linux cron作业内的ssh代理转发

Linux cron作业内的ssh代理转发,linux,ssh,Linux,Ssh,我想知道为什么ssh代理转发在cron作业中不起作用。我有一个简单的脚本,例如: ssh -A remote_host "ls ~" 我可以在不键入任何密码的情况下运行此脚本,但在将其放入cron作业后,它总是失败,原因是: Permission denied, please try again. Received disconnect from ip_of_remote_host: 2: Too many authentication failures for myuser 谁能告诉我如

我想知道为什么ssh代理转发在cron作业中不起作用。我有一个简单的脚本,例如:

ssh -A remote_host "ls ~"
我可以在不键入任何密码的情况下运行此脚本,但在将其放入cron作业后,它总是失败,原因是:

Permission denied, please try again.

Received disconnect from ip_of_remote_host: 2: Too many authentication failures for myuser
谁能告诉我如何解决这个问题


非常感谢

启动SSH代理时,需要将SSH\u AGENT\u PID或SSH\u AUTH\u SOCK存储在一个env文件中,并在SSH脚本中获取它的源代码

这是我使用的一个脚本,很久以前从网络上抓取的

SSH_ENV=$HOME/.ssh/environment
function start_agent {
     echo "Initialising new SSH agent..."
     /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
     echo succeeded
     chmod 600 ${SSH_ENV}
     . ${SSH_ENV} > /dev/null
     ssh-add id_rsa
}
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
如果密钥受passphase保护,则手动运行它,它将存储在$HOME/.ssh/环境中,类似于

SSH_AUTH_SOCK=/tmp/ssh-KldGwK6643/agent.6643; export SSH_AUTH_SOCK;
SSH_AGENT_PID=6644; export SSH_AGENT_PID;
在你的crontab中 . $HOME/.ssh/environment&&ssh-A blabla


如果您的服务器重新启动,您需要再次手动运行start_agent scrit

您必须在SSH客户端上设置环境变量
SSH_AUTH_SOCK
,以便启用SSH代理功能(crontab不为您设置)


确保当crontab运行时
代理sock文件
存在

作业多久运行一次?很多吗?我怀疑问题出在环境上。运行在中的环境cron作业与正常环境非常不同。它是同一个用户帐户吗?例如,如果cron作业是以root用户身份运行的,那么它将无法为无密码ssh提供您的私钥。这听起来可能很傻,但是您确定shell获得了传递给它的正确命令吗?它应该是同一个用户帐户?至少在执行脚本时,我使用相同的用户帐户创建了cron作业。顺便说一句,如何检查这一点?我实际上在cron作业中通过使用命令
whoami
确认执行用户是相同的,您使用的是什么分布?我在XUbuntu 12.4上做这样的事情没有问题。您确定“ls~”周围的引号被正确解析了吗?默认情况下,该命令将在主文件夹中运行,因此您也应该能够执行
ssh-A远程\u主机ls
。另外,看看是否可以通过将-v/-vv/-vvv中的一个传递给ssh来获得更多信息。我做了一些调试,它说
debug3:不是RSA1密钥文件/home/myuser/.ssh/id\u dsa。
我觉得这很可疑,只是因为OP的评论说它试图在正确的主文件夹中查找密钥。有更好的方法吗,例如将.ssh文件夹复制到远程计算机?最简单的方法是删除ssh密钥的密码阶段。您必须利用安全性和便利性。是否有更好的方法,例如将.ssh文件夹复制到远程计算机?
*/x * * * * SSH_AUTH_SOCK=agent-sock-file ssh remote "command"