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 

我需要运行这个命令,我作为用户jenkinslooged:

 sudo -u deployer kill -9 $(ps aux | grep /data/web/test1 | grep -v grep | awk {'print $2'}) 

这个命令必须杀死2个进程。 但是,当我这样运行,我得到退出状态1.我不知道为什么,我找不到任何logging的错误消息…

当我以部署用户身份login并运行此命令时,一切正常:

 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 

我发现问题是只有杀死命令,但我真的不知道为什么。

你的问题是这个过程是以“www-data”的forms运行的,而你正在切换到“部署者”用户。 可以杀死不属于他们的进程的唯一“用户”是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 

尝试使用-s开关。 像那样:

 sudo -u deployer -s kill -9 $(ps aux | grep /data/web/test1 | grep -v grep | awk {'print $2'})