ssh权限仅在cron作业中被拒绝


13

有一个非常奇怪的问题。我创建了一个小的bash脚本,该脚本通过ssh(使用公共密钥身份验证)在远程主机上运行命令。

当我从命令行手动运行此脚本时,它可以正常工作,但是当放置在/etc/cron.hourly中时,它将失败并显示Permission denied, please try again.错误。

  • 我使用ssh -i /root/.ssh/id_rsa user@remote "command";在脚本中显式设置了密钥。
  • 该脚本以root身份运行(我在echo `id` > /tmp/whoami.log复查中添加了a );和
  • ssh密钥不受密码保护...

该系统是Ubuntu 12.04服务器,我在远程端没有太多访问权限来进行故障排除,但是正如我所说,手动运行ssh或从命令行运行相同的bash脚本即可。

知道为什么会这样或如何解决吗?

更新

原来我弄错了,并且ssh密钥密码保护(通过钥匙串加载ssh-agent),因此为什么它从脚本失败而不是从bash会话运行时失败。将. ~/.keychain/$HOSTNAME-sh脚本添加到我的脚本即可解决问题(感谢@grawity指出了正确的方向并提供了完整的答案)。


您确定使用特定密钥手动运行它吗?取消设置SSH_AUTH_SOCKKRB5CCNAME环境变量后再次测试。
user1686

谢谢你的建议。不确定我是否完全理解您。我非常确定它正在使用该特定键,因为手动运行时,我能够在远程主机上连接/运行命令。取消设置这些变量后,我应该再次测试什么?
Yoav Aner

另外-我没有使用ssh-agent,所以不确定如何SSH_AUTH_SOCK关联(尽管我很乐意尝试任何事情)。我正在直接访问密钥文件,并且密钥文件没有密码保护。作为KRB5CCNAME一个快速搜索表明,这是事做使用Kerberos。再次-没有看到与此问题的联系,但也许我在这里错过了一些东西……
Yoav Aner 2012年

当然,请测试您的脚本。除非您这样做,否则不能“完全确定它正在使用该特定键”,因为cron作业在与交互式命令不同的环境中运行。如果您向该命令添加了一个-v选项,那就更好了ssh……
user1686

但是我这样做。ssh -i在这两种情况下,我都明确使用key using 命令。。。我将尝试在脚本中取消设置那些变量,然后看看。要添加的好建议-v-我也会添加。
Yoav Aner 2012年

Answers:


11

交互式命令和cron作业在不同的环境中运行-尤其是,交互式会话可能正在运行SSH代理或存储了Kerberos TGT。由于ssh订购身份验证方法的方式不同,您不能仅由于添加了-i选项就确定使用了密钥。

  • 如果SSH代理正在运行,则ssh客户端使用任何明确指定的密钥之前始终尝试使用代理密钥。

  • 如果网络使用Kerberos且存在Kerberos TGT,则OpenSSH将尝试公共密钥身份验证之前使用它。

我对您的环境一无所知,但是这两种可能性都很容易检查:

  1. 在命令前添加unset SSH_AUTH_SOCK和,然后手动运行修改后的脚本。unset KRB5CCNAMEssh

    这将防止脚本看到代理或Kerberos票证,并且将仅使用显式指定的密钥。

  2. -v选项添加到ssh。这将显示有关身份验证如何发生的更多详细信息。

您也可以添加-oIdentitiesOnly=yesssh命令;这将强制其使用指定的密钥


如果您添加了有关从cron访问代理的提示-甚至更好

通常不建议这样做,因为代理通常与您的交互式登录会话紧密相关。特别是,它仅在您登录时才启动,而在您注销时便被杀死–并且它需要您的密码才能真正解锁SSH密钥(假设它们已受密码保护)。

您提到“钥匙串”-这是OS X程序还是Linux脚本?(我对Mac OS X的架构了解不多,但是AFAIK使得从cronjob访问用户的ssh-agent 变得更加困难...)


1
您可以使用ssh-cron设置计划的SSH连接来保护服务器安全,而无需暴露SSH密钥,而是使用SSH代理。superuser.com/questions/463540/...
Luchostein

5

解决此问题的另一种方法是将cron设置为ssh到本地框,从而依次运行ssh命令,而不是通过其本地绝对路径运行文件或命令。这将缓存KRB5CCNAME,并且在/ path / command不在的地方工作。

# Fails:
0 * * * * /home/user/sshscript.sh

# Works:
0 * * * * /usr/bin/ssh user@localhost /home/user/sshscript.sh

#!/bin/bash
# Works:
unset SSH_AUTH_SOCK
unset KRB5CCNAME
/usr/bin/ssh user@localhost /home/user/sshscript.sh

1

您可以使用ssh-cron设置到安全服务器的计划SSH连接,而无需暴露SSH密钥,而是使用SSH代理。


依赖项在Homebrew上不可用,因此安装似乎很复杂。我猜无密码的密钥…:-/
Charlie Gorichanaz

-1

您可以在crontab中运行脚本或命令,例如:

0 * * * * bash -c -l“ /home/user/sshscript.sh”

要么

0 * * * * bash -c -l“ ssh root @ yourhost'echo $ HOSTNAME'”


1
OP已经尝试通过运行脚本cron;因此,这似乎并没有提供答案。
bertieb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.