我正在尝试在由 cron 运行的 bash 脚本中使用 scp(我在 Ubuntu 10.0.4 LTS 上运行该脚本)。
当我从命令行运行该脚本时,它运行良好(即,将 file1 和 file2 传输和复制到远程服务器/从远程服务器复制。但是,当我将脚本作为 cron 作业运行时,它会失败。
脚本如下所示:
#!/bin/bash
cd /home/oompah/scripts/tests/
scp -P 12345 file1 [email protected]:~/uploads
if scp -P 12345 [email protected]:/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
为什么会发生这种情况?我该如何解决?
[编辑]
我使用 -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).
答案1
我猜:
您有一个受密码保护的 SSH 密钥对,当您登录时,GNOME Keyring 会自动加载该密钥对。但是,您cron
无法访问密钥环,也ssh
无法要求输入密码(因为没有 tty)。
引用ssh
您添加的日志:
调试1:提供公钥:/home/oompah/.ssh/id_rsa
debug1:服务器接受密钥:pkalg ssh-rsa blen 277
debug1:PEM_read_PrivateKey 失败
debug1:读取PEM私钥完成:输入
debug1:read_passphrase:无法打开/dev/tty:没有这样的设备或地址
答案2
听起来 scp 没有从你的 ~/.ssh 目录中获取你的公钥/私钥对。
尝试添加
HOME=/home/oompah
放到你的 crontab 文件的顶部(它应该已经自动设置了)
您也可以尝试添加
echo "DEBUG: My home dir is $HOME"
进入你的脚本以确保它获得正确的值。
另一个选择是指定 scp 的 -i 参数以强制使用特定的密钥对:
scp -i /home/oompah/.ssh/id_rsa ...
例如。
答案3
cron 以哪个用户身份运行?看起来该用户无权访问您的公钥。
答案4
虽然在这种情况下不是问题,但是 cron 将百分号 ( %
) 解释为换行符,因此必须对其进行转义 ( \%
),否则您最终会得到半个命令,想知道为什么 cron 什么都不做(尽管它会在 syslog 中抱怨)。
/bin/date
如果您正在使用 crontab进行工作,这可能会造成麻烦。