为什么这个脚本不像手动运行时那样从 crontab 成功?

为什么这个脚本不像手动运行时那样从 crontab 成功?

该脚本在执行时有效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

我还将输出文件名分配给一个变量,这意味着我们不必每次都需要引用它whoamihostname

我已经删除了每个命令的条件执行,而是选择让脚本继续清理临时目录。

相关内容