我正在尝试备份我的项目、数据库和 nginx 环境。为此,我从主服务器进行备份并将其放在 /home/backup/ 中。主服务器上一切正常。
然后,从我的第二台服务器,我创建一个 cron 来通过 SCP 获取该文件。
这是我的命令:
0 13 * * * sudo sshpass -p MyPassword sudo scp -P 40511 -r [email protected]:/home/backup /home
我使用端口 40511 作为 SSH。如果手动启动,该命令可以工作,但使用 cron 则不行。
MyPassword 包含“!”。我尝试过带和不带双引号的情况。
我做错什么了?
不可否认,这有一点猜测,因为我不知道你的所有 SSH 和 askpass 是如何设置的,但是,因为这很容易回答这里 90% 的与 crontab 相关的问题:
当您从 crontab 运行某些内容时,环境与您从会话中运行它时的环境不同。这是 crontab 的架构限制;它只是不启动交互式登录 shell,而只是以您的用户身份运行指定的命令,这是不一样的。
考虑到您正在进行两次用户更改(通过双击
sudo
),我猜想scp
/ssh
查看了错误的配置文件,或者无法读取它们。其实这并不重要:您确实希望在没有和sshpass
没有sudo的情况下执行此操作:sudo
毫无疑问地表明了这一点。因此,这应该是 root 的 crontab,而不是您的用户的 crontab。这完全消除了对 的需要sudo
。ps -AF
)。我认为现在密码已被泄露,强烈建议您立即更改密码。特别是因为您只告诉我们密码的一个字符,这使得任何感兴趣的人都可以轻松确保他们找到了正确的密码。此外,请确保您的密码是安全生成的,而不仅仅是“用户名密码!”之类的密码或其他易于自动尝试的组合。(引导)暴力破解密码仍然是一件事情。用户 root 的无密码公钥身份验证非常容易设置(
sudo -i -H ssh-keygen
只需按 Enter 接受默认值,不指定密码;然后,输入一次密码,完成)。您想以 root 身份执行此操作,因为您希望这些密钥(仅!)可供 root 用户使用,而不是您的普通本地用户(普通本地用户在不知道密码的情况下无法登录)。没有任何借口。sudo -H -i ssh-copy-id [email protected]
systemd-timer
s。(这有很多优点,因为环境更像是一个交互式会话,但你还可以获得更好的日志记录,能够说“好的,在每个工作日的 00:13:00 +- 随机 10 分钟获取备份,并在 nginx 运行之前每次启动时获取备份”之类的话。如果你有兴趣让它工作,而这个说明没有帮助(并且你在这里找不到现有的答案),请打开一个新的问题帖子!scp
总的来说,您的解决方案似乎很糟糕:它会复制整个备份,无论所有文件(或任何文件)是否更改,重置修改时间(顺便说一句,这会将修改nginx
时间传递给客户端,这意味着您每天都在使其缓存无效,从而给您的服务器带来不必要的负载),并且不小心处理文件属性。至少在这里,您会使用rsync
而不是scp
。但更现实的是:除了更改您的身份验证方法(您确实必须在这里执行此操作)以及更改尝试下载备份的用户之外,老实说,您可能应该以不那么“今天为您工作(或不为您工作)的定制脚本”的方式来考虑这个问题。
我已经写下了在您的情况下我会做的事情,请参阅我的回答:
如何自动进行每日备份和每次关机时备份,并在每天和启动时将它们恢复到其他地方?