我有一个可以进出使用 sudo 的脚本。某些命令必须以 $USER 身份执行,某些命令必须以 root 身份执行。
目前,我正在后台运行一个循环以保持 sudo 活动状态,以便您执行脚本,输入密码一次,脚本 sudos 它需要的命令(以普通用户身份运行其余部分),然后后台循环在以下情况终止:脚本确实如此。该脚本仅在非常受控的环境中运行,我并不担心 sudo 访问在此过程中保持打开状态。
但是,我还尝试将此脚本记录在一个以后不会被清理的地方。以下是脚本的相关部分:
#!/bin/bash
logFile="path/to/log/file"
main () {
# some getopts
}
getOptExample () {
sudoFunction
# do some other stuff that takes a really long time
# and bounces back and forth between sudo and not sudo
cleanUp
}
getOptOtherExample () {
sudoFunction
# do some other stuff that takes a really long time
# and bounces back and forth between sudo and not sudo
cleanUp
}
sudoFunction () {
sudo -v
while true;
do
sudo -n true
sleep 60
kill -0 "$$" || exit
done 2>/dev/null &
}
cleanUp () {
# remove script file
# remove tmp dir that we're working in
# reboot computer to apply all changes
}
(main "$@") 2>&1 | tee $logFile
我无法写入 /var/log ,因为脚本的最后一行发生在调用 sudo 函数之前,因此它仅具有执行用户的权限。我也无法写入我的 tmp 目录,因为它变得混乱,我需要在脚本完成后删除其中的文件。此外,在脚本自动化的工作完成后,该目录没有理由继续存在。
- 我确实有一个帐户,其主目录不受影响,但该用户无权在该主目录中创建文件。
- 这个脚本正在 mac 操作系统上运行,但是,我试图让它与其他/未来/非 mac 的东西兼容(坚持 bash,试图坚持 posix,地狱,甚至试图坚持 Linus 的指导方针)用于添加到 Linux 内核)。
- 我需要日志文件在至少一次重新启动后持续存在
我应该在哪里转储该脚本的日志文件,即:
- 容易找到(直观)
- 用户无需 sudo 可写
- 不写入用户的主目录
- 重启时不会被删除
或者我有更好的方法来做到这一点(如果需要,我可以发布整个庞大的脚本)?
答案1
使用基本文件权限或 ACL 来完成此操作。
例如,有一个group
权限部分,以及一个用于newgrp
切换主要组的命令。还要考虑SGID
使用该位,例如nobody
作为所有者。
不确定 ACL 在 OSX 上是否可用,但我希望它在那里。只需用于setfacl
允许user|group
访问和写入日志文件。
通常/var/log/
应用于日志文件。例如,设置一个具有适当权限的文件夹/var/log/yourscripname
。