我正在为自己编写一个包装器,vim
它可以检测用户何时尝试编辑不属于他们的文件,并建议使用sudoedit
或visudo
。我想使用sudoedit
而不是sudo vim
,因为我相信这是最佳实践。
问题是,当用户运行 时sudo vim FILENAME
,我无法让它sudoedit
表现得像由用户调用一样。我的意思是,编辑文件的临时副本应该属于调用者而不是 root,而且我假设还存在更微妙的安全策略差异。
以下是我的脚本的一部分 - 假设它被称为vim
:
#!/bin/bash
# check if script ran by root
if [[ $# -eq 1 ]] && [ -f $1 ] && [ "$EUID" -eq 0 ]
then
# warning: root has to be a sudoers to be able to run the sudo command
if [[ $(realpath $1) == "/etc/sudoers" ]]
then
echo "Using visudo to edit $1"
# using a heredoc makes vim throw:
# Vim: Warning: Input is not from a terminal
# and vim takes a full 2 seconds to open
sudo -i -u USERNAME bash << EOF
# two password prompts for USERNAME are displayed
# user's cached auth is not used
sudo visudo
EOF
exit 0
else
echo "Using sudoedit to edit $1"
# the temp file still belongs to root:
# the -u argument does not do anything
sudo -u USERNAME -e "$1"
exit 0
fi
fi
# default behavior
vim "$@"
- 使用 heredoc
sudoedit
以用户身份运行似乎在安全策略方面具有正确的效果,但从用户的角度来看我不喜欢这种行为 - 以用户身份运行
sudo -e
实际上并不是以用户身份运行
我想到另一个选择是sudo
在我的 .bashrc 中创建一个函数,以便在调用时sudo vim
,正确的命令由正确的用户调用 - 请参阅这个答案中的最后一条建议。但是,我不确定包装sudo
/改变其行为是否是个好主意。
有人能建议我该如何做我想做的事,或者我是否应该这样做吗?