该脚本在执行时有效doas ./backup_cron_root.sh
#!/usr/bin/bash
/usr/bin/crontab -l> "/tmp/cron.$(whoami).$(hostname)" && /bin/date>>"/tmp/cron.$(whoami).$(hostname)" &&
/usr/bin/doas -u joanna /usr/bin/cp -f "/tmp/cron.$(whoami).$(hostname)" "/home/joanna/pCloudDrive/backups" &&
/usr/bin/rm "/tmp/cron.$(whoami).$(hostname)"
其中./backup_cron_root.sh
是脚本的名称。当同一个脚本被安排为 cronjob 时
doas crontab -e
,* * * * * /home/joanna/backup_cron_root.sh >/tmp/cronjob.log 2>&1
它会创建/tmp/cron.root.joanna-ONE-AMD-M4
其所有者,root
但由于某种原因,它无法成功将其复制到/home/joanna/pCloudDrive/backups
.为什么这样?为什么这个脚本不像手动运行时那样从 crontab 成功?
我的内容/etc/doas.conf
是
permit joanna as root
permit root as joanna
以下是我的尾巴grep CRON /var/log/syslog
:
Feb 26 17:17:01 joanna-ONE-AMD-M4 CRON[747796]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Feb 26 17:17:01 joanna-ONE-AMD-M4 CRON[747797]: (root) CMD (/home/joanna/backup_cron_root.sh)
Feb 26 17:17:01 joanna-ONE-AMD-M4 CRON[747792]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:17:01 joanna-ONE-AMD-M4 CRON[747791]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:17:01 joanna-ONE-AMD-M4 CRON[747794]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:17:01 joanna-ONE-AMD-M4 CRON[747793]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:17:22 joanna-ONE-AMD-M4 CRON[747795]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:18:01 joanna-ONE-AMD-M4 CRON[751555]: (root) CMD (/home/joanna/backup_cron_root.sh)
Feb 26 17:18:01 joanna-ONE-AMD-M4 CRON[751551]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:18:01 joanna-ONE-AMD-M4 CRON[751550]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:18:01 joanna-ONE-AMD-M4 CRON[751553]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:18:01 joanna-ONE-AMD-M4 CRON[751552]: (CRON) info (No MTA installed, discarding output)
Feb 26 17:18:22 joanna-ONE-AMD-M4 CRON[751554]: (CRON) info (No MTA installed, discarding output)
的内容/tmp/cronjob.log
是
doas: Authentication failed
答案1
问题似乎是您不允许 root 用户joanna
在配置中切换到没有密码的用户doas
。
您可以使用文件nopass
中的选项来执行此操作doas.conf
:
permit nopass root
(阻止 root 用户使用doas
更改为其他用户没有什么意义,所以我删除了该as joanna
位。)
您还可以选择使用su
以下内容代替doas
:
su joanna -c 'cp "$1" ~/pCloudDrive/backups/" sh "$tmpfile"
或者,以 root 身份复制该文件,然后更改其所有权chown
。
您的脚本也可能会有所简化:
#!/bin/sh
tmpfile=/tmp/crontab.$(whoami).$(hostname)
{ crontab -l; date; } >"$tmpfile"
doas -u joanna cp "$tmpfile" ~joanna/pCloudDrive/backups/
rm -f "$tmpfile"
我已经删除了过度使用绝对路径名。如果从 cron 执行此脚本时/usr/bin
和/bin
不在,则说明您的设置中有问题。$PATH
我还将输出文件名分配给一个变量,这意味着我们不必每次都需要引用它whoami
。hostname
我已经删除了每个命令的条件执行,而是选择让脚本继续清理临时目录。