![sudo nohup 和重定向](https://linux22.com/image/136717/sudo%20nohup%20%E5%92%8C%E9%87%8D%E5%AE%9A%E5%90%91.png)
尝试找出 sudoers 文件的正确 Cmnd_Alias
无需任何密码即可运行的命令如下:
sudo /usr/bin/nohup /etc/init.d/axtty start >/dev/null 2>&1
我添加到 sudoers 文件中的行是:
## Cmnd alias specification
Cmnd_Alias AXTOOLTTYSTART = /usr/bin/nohup /etc/init.d/axtty start >/dev/null 2>&1
Cmnd_Alias AXTOOLTTYSTOP = /etc/init.d/axtty stop
Cmnd_Alias AXTOOLTTYSTATUS = /etc/init.d/axtty status
Cmnd_Alias AXTOOLINTCTLSTART = /sbin/initctl start ttyp?
Cmnd_Alias AXTOOLINTCTLSTOP = /sbin/initctl stop ttyp?
## This will disable password request for the axtools commands
%sudoaxtools ALL=(root) NOPASSWD: AXTOOLTTYSTART, AXTOOLTTYSTOP, AXTOOLTTYSTATUS, AXTOOLINTCTLSTART, AXTOOLINTCTLSTOP
Defaults!AXTOOLTTYSTART !requiretty
Defaults!AXTOOLTTYSTOP !requiretty
提到的命令在脚本 (axopen) 内运行,由 sudoaxtools 组的成员或 root 的 crontab 执行
/usr/local/bin/axopen
#!/bin/sh
SUDO=''
if (( $EUID != 0 )); then
SUDO='sudo'
fi
echo -n "Checking for open connections"
while netstat -d | grep -q axel
do
((c++)) && ((c==900)) && break
echo -n "."
sleep 4
done
echo "done"
echo "Starting axtty service.."
$SUDO /usr/bin/nohup /etc/init.d/axtty start >/dev/null 2>&1
sleep 4
$SUDO /etc/init.d/axtty status
当 axopen 通过 sudoaxtools 成员执行时,它仍然提示输入密码。我预计这是因为碎片>/dev/null 2>&1
。
中学
我使用 nohup 的原因是因为该服务由于某种原因不会启动,当简单地使用
sudo /etc/init.d/axtty start
因此,如果有人有想法来解决这个问题,那就太好了。
答案1
您不希望重定向作为 sudo 规则的一部分。 /etc/sudoers 包含执行的程序,并且重定向与 sudo 命令分开发生(在包含的 shell 级别):
(shell) sudo /usr/bin/nohup /etc/init.d/axtty start >/dev/null 2>&1
这会调用 sudo 并重定向输出; sudo 看到:
(sudo) /usr/bin/nohup /etc/init.d/axtty 启动
更改此 sudoers 行:
Cmnd_Alias AXTOOLTTYSTART = /usr/bin/nohup /etc/init.d/axtty start >/dev/null 2>&1
到:
Cmnd_Alias AXTOOLTTYSTART = /usr/bin/nohup /etc/init.d/axtty start
答案2
我最终将 nohup 脚本放入单独的 bash 脚本中。
/usr/local/bin/axttystart
#!/bin/sh
## Intermediate bashscript in order to sudo nohup properly
/usr/bin/nohup /etc/init.d/axtty start >/dev/null 2>&1
Cmnd_alias
然后将包含for的sudo'ers 行更改AXTOOLTTYSTART
为
Cmnd_Alias AXTOOLTTYSTART = /usr/local/bin/axttystart
更新的 axopen 脚本将代替直接 sudo 执行 nohup 行,sudoaxttystart
脚本
#!/bin/sh
[...]
echo "Starting axtty service.."
$SUDO /usr/local/bin/axttystart
sleep 4
$SUDO /etc/init.d/axtty status