foo.sh
我正在尝试通过运行备份脚本cron
。代码如下:
#!/bin/bash
export PASSPHRASE=password123
duplicity ../learningbash file://../../../media/kingston
unset PASSPHRASE
然后我在“crontab -e”中添加以下行:
58 07 * * * /home/ashish/learningbash/foo.sh
当我使用 从终端运行它时,它运行完美./foo.sh
。但它无法从 运行cron
。此外,如果我将“foo.sh”编辑为以下代码,第一行可以从 完美执行cron
。但备份脚本不会运行。
#!/bin/bash
touch hello.txt
export PASSPHRASE=bacteria99
duplicity ../learningbash file://../../../media/kingston
unset PASSPHRASE
答案1
这是因为您在脚本中使用了相对路径:
duplicity ../learningbash file://../../../media/kingston
这是从终端进行的,因为您位于正确的目录中,您应该在那里正确地解释相对路径。
cron
个人用户将用户的主目录设置为PWD
。
要解决该问题,请使用绝对路径,例如:
duplicity /bar/learningbash file:///foo/bar/media/kingston
答案2
我最终安装了 expect,并在 localhost 上设置了受信任的 root ssh 登录以使其正常工作。cron 调用 duplicity.expect,其中包含:
#!/usr/bin/expect -f
# run duplicity backups script with a tty
set timeout 7200
spawn ssh -tt localhost /opt/backups/bin/duplicity.sh
expect {
timeout {
puts "Connection timed out"
}
eof {
puts "EOF reached"
}
"yes/no" {
send "yes\r"
exp_continue
}
}
duplicity.sh 包含要运行的实际 duplicity 备份命令,以及 GPG 将用于加密所有命令的 PASSPHRASE 环境变量。