bash:在 cron 作业中使用 scp 失败,但从命令行运行时运行成功

oom*_*pah 9 ssh bash cron scp ubuntu

我正在尝试在由 cron 运行的 bash 脚本中使用 scp(我在 Ubuntu 10.0.4 LTS 上运行它)。

该脚本工作正常(即,当我从命令行运行它时,向/从远程服务器传输和复制 file1 和 file2。但是,当我将脚本作为 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
Run Code Online (Sandbox Code Playgroud)

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

ERROR: transfer failed
Run Code Online (Sandbox Code Playgroud)

我发送到我的邮件收件箱的错误消息是:

Permission denied (publickey).
lost connection
Run Code Online (Sandbox Code Playgroud)

为什么会发生,我该如何解决?

[编辑]

我用 -i 命令修改了第一个 scp 命令(如 M Jenkins 建议的那样),我还添加了 -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).
Run Code Online (Sandbox Code Playgroud)

use*_*686 8

我猜:

您有一个受密码保护的 SSH 密钥对,它会在您登录时由 GNOME Keyring 自动加载。但是,cron无法访问密钥环,ssh也不能要求输入密码(由于缺少 tty)。

引用ssh您添加的日志:

debug1:提供公钥:/home/oompah/.ssh/id_rsa
debug1:服务器接受密钥:pkalg ssh-rsa blen 277
debug1:PEM_ read_PrivateKey 失败
debug1:读取 PEM 私钥完成:键入
debug1:read_passphrase:无法打开 / dev/tty : 没有这样的设备或地址