我正在编写一个简单的脚本(嗯,我认为这很简单)来收集并记录使用 sudo 的“原因”。根据我发现的另一篇文章,该部分的工作非常简单(https://community.unix.com/t/sudo-prompt-for-comment-text/265046/4)。
但是,如果用户在命令中使用 PIPE ( | ),我的脚本就会崩溃,例如
mysudo.sh cat /var/log/syslog | grep -i something
使用上面的命令,脚本将有效地在管道处暂停,并且在您按 Enter/Return 之前不执行任何操作,然后它会绕过 if 语句,只是“坐在那里”并带有空白光标。当您按 Enter 键时,它将运行输入的 sudo 命令,但不会记录任何内容。
如果我使用类似的东西:
./mysudo.sh ls -lh /var/log/syslog
if 语句被触发,如果用户位于 GROUP 组中,则会提示输入原因,记录事件,然后正确运行 sudo 和命令。
我想做的是将“mysudo.sh”之后的所有数据捕获为字符串,然后在我的脚本中使用它。有人有办法做到这一点吗?最终目标是将这个新脚本符号链接到 sudo,以便最终用户不知道包装器,除了现在必须在满足某些条件时输入原因。我的想法是将参数(包括管道后面的内容)捕获到字符串中,将两个 sudo 行(和原因字符串)更改为以下内容:
ENTEREDCOMMAND=<the string of arguements, including the pipe and other data> ... sudo ${ENTERETEDCOMMAND}
(以这个问题为例)
ENTEREDCOMMAND would equal "cat /var/log/syslog | grep -i something" ... sudo ${ENTERETEDCOMMAND}
脚本如下:
任何帮助,将不胜感激!
logFile=/path/to/log.log
shopt -s nocasematch
clear
GROUP=$(groups | grep -i "GROUP")
if [[ ${GROUP} =~ "GROUP" ]];
then //if user is GROUP capture the reason for sudo, then proceed with sudo
echo '
Enter the reason for executing the command with elevated privileges (include a ticket # is possible): '
read response
echo "$USER" 'executed "'${*}'" at '"$(date)"' with a reason of "'${response}'".' >> $logFile
sudo $*
else
sudo $* //if the user is NOT in the GROUP above, run sudo as normal
fi