我遇到了 linux(ubuntu 16.04)权限和命令执行的问题。
/etc/sudoers 文件:
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d (this dir is empty)
jenkins ALL=(deployer) NOPASSWD: ALL
deployer ALL=NOPASSWD:/etc/init.d/php7.0-fpm reload,/bin/kill,/bin/ps,/bin/grep,/usr/bin/awk,/usr/bin/xargs
我需要运行这个命令,我以用户 jenkins 身份登录:
sudo -u deployer kill -9 $(ps aux | grep /data/web/test1 | grep -v grep | awk {'print $2'})
此命令必须终止 2 个进程。但是当我这样运行它时,我得到的退出状态是 1。我不知道为什么,也找不到任何记录的错误消息...
当我以部署者用户身份登录并运行此命令时,一切正常:
kill -9 $(ps aux | grep /data/web/test1 | grep -v grep | awk {'print $2'})
我需要终止的进程如下:
www-data 48689 0.0 1.6 306184 33872 ? Ss 14:26 0:00 /usr/bin/php /data/web/test1/xxx
www-data 48690 0.0 1.6 306184 34108 ? Ss 14:26 0:00 /usr/bin/php /data/web/test1/yyy
我发现问题只出在 kill 命令上,但我真的不知道为什么。
答案1
您的问题是,该进程以“www-data”身份运行,而您正在切换到“部署者”用户。唯一可以终止不属于自己的进程的“用户”是 root。
在 sudoers 中尝试以下命令
jenkins ALL=(www-data) NOPASSWD: ALL
然后按照你的命令
sudo -u www-data pkill --signal 9 -f /data/web/test1
我能想到的另一件事是你的部署者 sudo 规则
deployer ALL=NOPASSWD:/etc/init.d/php7.0-fpm reload,/bin/kill,/bin/ps,/bin/grep,/usr/bin/awk,/usr/bin/xargs
该规则转化为
/etc/init.d/php7.0-fpm reload
/bin/kill
/bin/ps
/bin/grep
/usr/bin/awk
/usr/bin/xargs
您的 kill 命令没有任何选项。您需要
deployer ALL=NOPASSWD:/etc/init.d/php7.0-fpm reload,/bin/kill *,/bin/ps,/bin/grep,/usr/bin/awk,/usr/bin/xargs
答案2
尝试使用 -s 开关。如下所示:
sudo -u deployer -s kill -9 $(ps aux | grep /data/web/test1 | grep -v grep | awk {'print $2'})