Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用cron和rsync将文件从远程服务器传输到本地路径_Linux_Ssh_Cron_Crontab_Rsync - Fatal编程技术网

Linux 如何使用cron和rsync将文件从远程服务器传输到本地路径

Linux 如何使用cron和rsync将文件从远程服务器传输到本地路径,linux,ssh,cron,crontab,rsync,Linux,Ssh,Cron,Crontab,Rsync,我正在寻找一些知识来帮助我理解为什么在使用rsync将文件从远程服务器传输到本地路径时使用cron失败 我的目标是在设定的时间运行一个定时cron作业,并成功地执行我的传输脚本 从众多谷歌搜索中,我组合了以下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

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

我的目标是在设定的时间运行一个定时cron作业,并成功地执行我的传输脚本

从众多谷歌搜索中,我组合了以下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生成存储在授权密钥文件中的公钥来请求密码。我使用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的问题

任何帮助都将不胜感激


littlejeem

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

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


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

你有一些东西需要你的终端。也许您的ssh代理位于/etc/cron.d中,或者直接与root用户的crontab-e联系,以避免必须使用sudoHey@quazardous,我没有想到(root的crontab),我将尝试并报告它。感谢您的快速响应。@quazardous我将所需的cron作业移到了根crontab。从命令中删除sudo。我还为root用户生成了一个rsa公钥,今晚正在测试。将更新。您好@coolparadox感谢您抽出时间写下答案。明天我将检查并查看从
env | sort>/tmp/environment.log
获得的信息。我怀疑我在我所做的事情中做出了一些假设,这些假设阻碍了成功的结果。