SCP 不在 crontab 中工作,但在命令行中工作

SCP not working in crontab but works on commandline

经过大量研究,我找不到解决方案,但 post 这个问题。

我有一台电脑A和B都是Ubuntu台式机。我想将文件从 A 复制到 B。我遵循的步骤。

1. ssh-keygen in computer A
2. Left password blank
3. Copied id_rsa.pub to computer B ~/.ssh/ from computer A
4. Renamed id_rsa.pub to authorized_keys in computer B
5. In computer A I did scp -i ~/.ssh/id_rsa -r /var/www/abc abc@ip:/home/abc/

如果我在命令行中执行第 4 步,它工作正常。但是当我在 crontab

中做同样的事情时
22 10 * * * root scp -i ~/.ssh/id_rsa -r /var/www/abc abc@ip:/home/abc

它什么都不做。

为什么不尝试将 scp 命令放入 bash 脚本并将 bash 脚本放入 cron,还记得将 shebang 放入 sh 脚本,如下所示: #! /bin/bash(通常是路径,通过在 shell 中输入 which bash 来确认)。还要 chmod a+x 你的 sh 脚本以使其可执行并尝试将 bash 中的 sh 脚本作为 ./script.sh 然后将其放入 crontab.

为什么 scp 命令在 crontab 中不起作用? 以下 post 很好地解释了 cron 作业面临的各种问题 - https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work

你的情况是环境问题。 Crontab 的环境与 bash 的不同。 希望这有帮助。

第5步不行,可能第3步和第4步不行。

3. Copied id_rsa.pub to computer B ~/.ssh/ from computer A
4. Renamed id_rsa.pub to authorized_keys in computer B

您应该使用命令 "ssh-copy-id" 来复制 .pub 文件。

在 crontab 中,您只执行了命令行,没有交互式 shell 的所有优点,即填充的 PATH 变量和所有其他 bash 技巧,例如 ~ 解释(不确定最后一个)。

所以规则是在 crontab 中总是使用完整路径:

22 10 * * * root /usr/bin/scp -i /home/username/.ssh/id_rsa -r /var/www/abc abc@ip:/home/abc

我已经尝试了几乎所有找到的与问题相关的答案。答案是不小心来的。

我输入的是用户名而不是 root,它起作用了。我不知道如何,但它奏效了。希望这对像我这样的人有所帮助。

2 10 * * * root /usr/bin/scp -i /home/username/.ssh/id_rsa -r /var/www/abc abc@ip:/home/abc

2 10 * * * username /usr/bin/scp -i /home/username/.ssh/id_rsa -r /var/www/abc abc@ip:/home/abc

这是我的解决方案。与 Jessie 在 Raspberry 中制作 OS。

使用 public 密钥修复与服务器的连接,没有密码。你可以到处找到教程。 事情是以创建 crontab 的同一用户的身份进行的。 在我的例子中,我将密钥设置为 PI(我的 Raspberry 上的用户)。确保您可以在服务器上免密码登录。

然后我创建了我的脚本,每 5 分钟将目录中的所有 txt 文件上传到服务器。 例如:

"#!/bin/bash scp /mnt/www/hus/*.txt xxxxxx.se@ssh.xxxxx.se:/www/images/hustemp"

在您的主目录中将其另存为 xxxxxxx.sh 并使其可执行 (chmod +x xxxxxxx.sh)。

那么是时候创建 cronjob 了。我认为您必须在家中 dir.Just 运行 crontab -e(前面没有 sudo)并编辑您想要的内容。就我而言: */5 * * * * /home/pi/upload.sh

效果完美!

祝你好运 安德斯

对于那些为这个问题苦苦挣扎的人,上面的所有答案都没有解决我的问题。实际上,您必须在终端中使用 root 帐户执行一次 scp,以便您收到此消息:

The authenticity of host 'XXXX (123.123.123.123)' can't be established.
ECDSA key fingerprint is SHA256:XXXXXXXXXXXxxxxXXXxxXXXxxXXxXxxXXX.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

然后你输入“是”,你的下一个 crons 就会像魅力一样工作。

  1. 创建一个shell脚本,在根目录下输入scp命令
  2. 使脚本可执行
  3. 将脚本放入crontab
PATH=/usr/bin
32 18 * * * cd /root/ ; (time ./infra.sh)