我有一个简单的脚本,它会在不需要的时候要求我提供通行证

我有一个简单的脚本,它会在不需要的时候要求我提供通行证

我有这个简单的脚本 /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命令行(包括grepawk调用)可以替换为pgrep mysql不需要 root 权限的,从而消除了sudoers输入的需要。不过,您仍然需要一个kill命令,这是一个非常强大的命令,可以为其提供这种综合权限。

或者,删除sudo脚本中的所有调用,然后像下面这样运行整个root脚本

sudo /home/myuser/startup.sh

正如您的线路所允许的sudoers。您仍然应该lsof按照pgrep上面所述替换,因为它更强大、更高效,并且更接近最​​小特​​权原则。

相关内容