【问题标题】:Why does this bash script work at console but fails when run as a cron job?为什么这个 bash 脚本在控制台上工作,但在作为 cron 作业运行时失败?
【发布时间】:2011-07-26 20:39:36
【问题描述】:

我有以下 bash 脚本,它在 CLI 上运行没有问题,但在作为 cron 作业运行时失败。

#!/bin/bash

cd /home/oompah/scripts/tests/
scp -P 12345 file1 oompah@someserver.com:~/uploads

if scp -P 12345 oompah@someserver.com:/path/to/file2.dat local.dat >&/dev/null ; then 
    echo "INFO: transfer OK" ; 
else 
    echo "ERROR: transfer failed" ; 
fi

当我将它作为 cron 作业运行时收到的错误消息(重定向到日志文件)是:

ERROR: transfer failed

我在邮件收件箱中收到的错误消息是:

Permission denied (publickey).
lost connection

第一个 scp(复制)也失败了(尽管我没有检查它)。有谁知道为什么会发生这种情况,以及我该如何解决?

顺便说一句:我在 Ubuntu 10.0.4 LTS 上运行它

[编辑]

我在 scp 中添加了 -i 选项(脚本中的第一个命令),还添加了调试(使用 v 选项)。这是完整的调试跟踪:

Executing: program /usr/bin/ssh host 12.34.56.78, user oompah, command scp -v -t ~/uploads
OpenSSH_5.3p1 Debian-3ubuntu6, OpenSSL 0.9.8k 25 Mar 2009
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to 12.34.56.78 [12.34.56.78] port 12345.
debug1: Connection established.
debug1: identity file /home/oompah/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3p1 Debian-3ubuntu3
debug1: match: OpenSSH_5.3p1 Debian-3ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.3p1 Debian-3ubuntu6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host '[12.34.56.78]:12345' is known and matches the RSA host key.
debug1: Found key in /home/oompah/.ssh/known_hosts:3
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/oompah/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 277
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
debug1: read_passphrase: can't open /dev/tty: No such device or address
debug1: No more authentication methods to try.
Permission denied (publickey).
lost connection
Permission denied (publickey).

希望这能提供更多线索

【问题讨论】:

  • 在服务器上尝试 chmod 644 ~/.ssh/authorized_keys

标签: ubuntu ssh cron scp


【解决方案1】:

如果您不更改用户帐户,这通常是环境问题。您可以通过运行 env 和/或设置并将输出重定向到文件,比较来自 cli 和 cron 的结果来检查。在这种情况下,看起来 cron 在运行您的脚本之前正在执行set -x,因此第一个错误会导致脚本退出。

两种可能的解决方案。将|| true 添加到任何可能失败且没有任何问题的命令。或者您可以在脚本顶部执行 set +x 以恢复您在命令行中的行为。


编辑:从头开始。我虽然你的脚本在第一个 scp 上死了,直到我重读你的问题。这很可能是您的环境有问题。将env &gt;/path/env.out 放在脚本顶部,然后比较 cli 与 cron 结果。


编辑:另一种想法,您是否加密主目录,如果是,您是否在此 cron 脚本运行时登录?如果您没有使用加密的目录登录,您将无法运行它。出于这个原因,我只加密我将始终登录的桌面上的主目录。

【讨论】:

【解决方案2】:

您可能正在使用ssh-agent 运行,或者专门验证了您的私钥。当您在cron 中运行时,您没有会话,并且您没有任何与会话相关的东西,例如ssh-agentttys 来读取密码。

创建一个无密码密钥并将公钥添加到~target/.ssh/authorized_keys下的目标帐户。然后,您将能够使用您刚刚使用scp 创建的密钥来验证并复制文件。

仅供参考:您可能需要阅读command keys 上的 ssh 服务器手册页以及密钥访问和身份验证的工作原理。

【讨论】:

    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2013-11-29
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    相关资源
    最近更新 更多