我有这个简单的脚本 /home/myuser/startup.sh
#!/bin/bash
# sin le pongo -x al final va tirando por pantalla todo lo que hace
echo "Finding PIDs of mysql processes..."
mysql_pid=$(sudo lsof -i -P -n | grep 'mysql' | awk 'NR==1{print $2}')
echo "Check if 'mysql_pid' is not empty"
if [ -n "$mysql_pid" ]; then
echo "MySQL PID found: $mysql_pid"
sudo kill "$mysql_pid"
echo "MySQL process killed."
else
echo "MySQL process not found."
fi
echo "Launching Docker Desktop..."
systemctl --user start docker-desktop
我不想每次运行时(每次启动时./startup.sh
)都手动输入密码,因此我在此文件 /etc/sudoers.d/startup 中添加了以下行:
myuser ALL=(ALL) NOPASSWD: /home/myuser/startup.sh
但每次我运行脚本时,它都会不断要求我输入密码,有什么想法吗?谢谢!
答案1
你的sudoers
路线允许你运行
sudo /home/myuser/startup.sh
无需输入密码,但不能
sudo lsof -i -P -n
或者
sudo kill
您的脚本实际运行的命令是哪些。因此sudo
会要求输入这些命令的密码。
一般来说,如果您sudo
在脚本中使用,则应该使用-n
或--non-interactive
选项来确保它不会要求输入密码,而如果不允许在没有密码的情况下继续,则会失败并显示适当的错误消息,这将有助于您查明问题。
您的lsof
命令行(包括grep
和awk
调用)可以替换为pgrep mysql
不需要 root 权限的,从而消除了sudoers
输入的需要。不过,您仍然需要一个kill
命令,这是一个非常强大的命令,可以为其提供这种综合权限。
或者,删除sudo
脚本中的所有调用,然后像下面这样运行整个root
脚本
sudo /home/myuser/startup.sh
正如您的线路所允许的sudoers
。您仍然应该lsof
按照pgrep
上面所述替换,因为它更强大、更高效,并且更接近最小特权原则。