【问题标题】:How to use cron and rsync to transfer files from remote server to local path如何使用 cron 和 rsync 将文件从远程服务器传输到本地路径
【发布时间】:2016-04-06 22:58:16
【问题描述】:

我正在寻找一些知识来帮助我理解为什么在使用 rsync 将文件从远程服务器传输到本地路径时使用 cron 失败。

我的目标是在设定的时间运行计划的 cron 作业并成功执行我的传输脚本

从众多 Google 搜索中,我整理了以下 rsync 命令:

rsync --protect-args --remove-source-files --chmod=Du=rw,Dgo=rw,Fu=rw,Fog=r -apvzrc pi@192.168.0.10:/media/pi/USBSTORAGE32/ /media/Data_1/"James' Files"/

我已经设置了远程服务器,因此它不会通过使用 ssh-keygen rsa 来生成存储在 authorised_keys 文件中的公钥来要求输入密码。我使用 SSH 登录到“本地”机器,然后输入命令将文件从远程服务器“拉”到本地机器。

一旦我测试了上面的 rsync 命令,我认为我已经完成了,所以将它弹出到一个脚本中,然后通过 crontab 添加到 cron。我添加的行是这样的

55 * * * * sudo /home/jlivin25/bin/myscripts/sync.sh > /var/log/james/cronsync.log 2>&1

我的脚本是这样的:

#!/usr/bin/env bash
rsync --protect-args --remove-source-files --chmod=Du=rw,Dgo=rw,Fu=rw,Fog=r -apvzrc pi@192.168.0.10:/media/pi/USBSTORAGE32/ /media/Data_1/"James' Files"/

计划任务未能按预期运行,cron 尝试运行脚本但我的日志文件中记录了以下错误消息:

sudo: no tty present and no askpass program specified

此时我被困住了,因为通过“谷歌搜索”上述消息,我得到了很多不同的原因,即我所做的事情不起作用。我不确定将错误追到哪里,这是我使用 cron、ssh 或 rsync 的问题。

任何帮助将不胜感激。

小吉姆

【问题讨论】:

  • 接缝你有东西需要你的终端。也许你的 ssh 代理
  • 尝试在 /etc/cron.d 中或直接使用 root 用户的 crontab -e 来避免必须 sudo
  • 嘿@quazardous,我没想到(根的crontab)我会试一试并报告。感谢您的快速响应。
  • @quazardous 我将所需的 cron 作业移至根 crontab。从命令中删除了 sudo。我还为 root 用户生成了一个 rsa 公钥,今晚正在测试。会更新。

标签: linux ssh cron crontab rsync


【解决方案1】:

所以cron 很可能是由用户cron 在您的系统中执行的守护进程。当cron 守护进程决定运行一个cronjob 时,它以cron 用户的身份运行。但很可能cron 用户不允许在您的系统中使用 sudo,因此这导致了提到的 sudo 错误(通常为 sudo在禁止使用时要求输入密码,但在这种情况下,没有终端或密码请求程序供cron 用户获取)。

确认这一点的一种方法是在脚本的开头运行类似env | sort >/tmp/environment.log 的内容,并在执行后检查关键变量(例如USERHOME)。您甚至可以将环境与手动执行脚本时的环境进行比较。

我相信这里的一种方法显然是配置 sudo 以允许cron 以“正确”用户身份运行您的脚本。另一种方法是让您的脚本源(或复制)“正确”用户的一些环境,因此不需要 sudo。我不知道哪一个对你的目标更有效。

【讨论】:

  • 您好@coolparadox 感谢您抽出宝贵的时间来写一个答案。明天我会检查并看看我从env | sort >/tmp/environment.log 得到什么。我怀疑我在所做的事情中做了几个假设,阻碍了成功的结果。
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
相关资源
最近更新 更多