![以不同用户身份运行 shell 脚本](https://linux22.com/image/489070/%E4%BB%A5%E4%B8%8D%E5%90%8C%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%20shell%20%E8%84%9A%E6%9C%AC.png)
以不同用户身份运行 shell 脚本的好方法是什么?我正在使用 Debian etch,我知道我想模拟哪个用户。
如果我手动执行此操作,我会这样做:
su postgres
./backup_db.sh /tmp/test
exit
因为我想自动化这个过程,我需要一种方法来以 postgres 的形式运行 backup_db.sh(继承环境等)
谢谢!
答案1
要以另一个用户身份运行脚本作为一个命令,请运行:
/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres
Breaking it down:
/bin/su : switch user
-c "/path/to..." : command to run
- : option to su, make it a login session (source profile for the user)
postgres : user to become
我建议在这样的脚本中始终使用完整路径 - 您无法始终保证在执行 su 时处于正确的目录中(也许有人更改了您的主目录,谁知道呢)。我还始终使用 su 的完整路径 (/bin/su),因为我比较偏执。可能有人会编辑您的路径并导致您使用受损版本的 su。
答案2
如果要运行的目标用户定义了nologin shelll,那么您可以使用-s选项来指定shell:
/bin/su -s /bin/bash -c '/path/to/your/script' testuser
请参阅以下问题: 以没有登录 shell 的用户身份运行脚本
答案3
要按计划自动执行此操作,您可以将其放入用户的 crontab 中。虽然 Cron 作业不会获得完整的环境,但无论如何,最好将您需要的所有环境变量都放入脚本本身中。
要编辑用户的 crontab:
sudo crontab -u postgres -e
答案4
尝试 su 手册页:
su-c script_run_as_postgres.sh-postgres
另外,您可以使用 sudo 以允许自己以 postgres 身份运行该命令而无需密码。不过,这需要在 /etc/sudoers 中进行一些设置。