Linux 权限与状态码1

Linux 权限与状态码1

我遇到了 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'})

相关内容