为什么在rc.local中使用sudo时不需要密码?

我已经添加了

sh /home/victor/startupAP.sh 

/etc/rc.localstartupAP.sh包含需要sudo语句:

 $ cat startupAP.sh #!/bin/bash sudo hostapd -B /etc/hostapd/hostapd.conf 2>&1 >/home/victor/startupap.log #sudo ifconfig wlan1 192.168.0.1 netmask 255.255.255.0; sudo dhcpd wlan1 -pf /var/run/dhcp-server/dhcpd.pid; sudo bash -c "echo 1 >/proc/sys/net/ipv4/ip_forward"; sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo ifconfig wlan1 192.168.0.1 netmask 255.255.255.0 2>&1 >>/home/victor/startupap.log sudo dhcpd wlan1 -pf /var/run/dhcp-server/dhcpd.pid 2>&1 >>/home/victor/startupap.log sudo bash -c "echo 1 >/proc/sys/net/ipv4/ip_forward" 2>&1 >>/home/victor/startupap.log sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 2>&1 >>/home/victor/startupap.log 

如果我在终端上运行这个脚本,它需要密码,

 $ sudo ./startupAP.sh [sudo] password for victor: 

但如果我重新启动,这个脚本运行并按预期工作,没有密码,为什么?

正如Javier在评论中指出的那样,rc.local(和init.d)中包含的脚本由root运行,然后其中一些删除权限或更改用户,因为使用root帐户运行服务通常是一个安全漏洞。 如果您希望您的脚本在root用户运行时即使手动调用它们,也可以使用SETUID :

 sudo chown root /home/victor/startupAP.sh sudo chmod +s /home/victor/startupAP.sh 

但请记住, 如果使用shebang,则会忽略setuid 。