在 crontab 脚本中使用多个用户,更改用户时会默默失败

在 crontab 脚本中使用多个用户,更改用户时会默默失败

我正在尝试在 centos 服务器上运行 bash 脚本。我以 root 用户身份运行该脚本(两者都用于文件权限),但我还需要使用属于服务帐户的 aws 服务权限。我们决定不授予 root 帐户对 AWS 环境的访问权限。

如果我手动运行脚本,./disk-arcive.sh它就可以正常工作。当我从 crontab 运行它时,在切换到 时它会默默失败aws-cli-user。没有错误消息,并且只有通过 cron 启动时才会出现。

它在 Crontab 中是如何被调用的sudo crontab -e

0 20 * * * /bin/sh /etc/disk-arcive.sh

shell文件概要:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin    <<Same as root

find (old stuff) >> /old-stuff.temp 
while read line; do
    /opt/bin/encryption-tool "$line">> /encrypt_logfile.log     << key access requires root permission
done < /old-stuff.temp

while read line; do
    sudo -u aws-cli-user /usr/local/bin/aws s3 mv "$line.pgp" s3://mybucket"$line.pgp" >> /bucket_logfile.log     #<< switch to user fails, user needed for s3 permissions
    sudo -u aws-cli-user echo "User is now aws-cli-user" >> /bucket_logfile.log   #<< added for debugging, does not work
    echo "looks like $line is done" >> /bucket_logfile.log   #<< added for debugging, Works
done < /old-stuff.temp

exit

更新1 我已将“用户切换”行更新为以下内容。它似乎以不同的方式失败,但是,如果我使用任何 aws-s3 选项(即 --sse 或 --acl),这些选项将被读取为选项的一部分su

    su -l aws-cli-user -c '/usr/local/bin/aws s3 mv "$line.pgp" s3://mybucket"$line.pgp" --sse >> /bucket_logfile.log'     #<< switch to user fails, user needed for s3 permissions
    su -l aws-cli-user  -c 'echo "User is now aws-cli-user $(whoami)" >> /bucket_logfile.log'   #<< added for debugging, does not work. enters a blank line into the log file

该行的输出echo表明,当用户切换时,$line 现在正在被传递。

答案1

好的,一切正常,需要进行一些修改

su -l username -c command这允许用户在 cron 中进行更改下一步是使用单引号和双引号来正确“编译”命令,我只找到对此的一个引用,所以我的术语可能不正确。

su -l aws-cli-user -c '/usr/local/bin/aws s3 mv "$line.pgp" s3://mybucket"$line.pgp" --sse >> /bucket_logfile.log'

单引号让用户“编译”该命令,但它不知道 $line 变量是什么,因此该命令无法找到文件引用。

su -l aws-cli-user -c "/usr/local/bin/aws s3 mv '$line.pgp' s3://mybucket'$line.pgp' --sse >> /bucket_logfile.log"

现在,使用双引号,Root 用户编译工作(包括 $line 变量),然后将完成的命令传递给其他用户运行。因此,root即使其他用户正在以其权限执行命令,使用 $(whoami) 也始终会显示。

相关内容