Я добавил
sh /home/victor/startupAP.sh
в /etc/rc.local
, и startupAP.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:
, но если я перезагружаюсь, этот скрипт запускается и работает, как и ожидалось, без пароля, почему?
Как отметил Хавьер в комментариях, скрипты, включенные в rc.local (и init.d), запускаются root
, а затем некоторые из них отбрасывают привилегии или меняют пользователей, так как запуск служб с учетной записью root обычно дыра в безопасности. Если вы хотите, чтобы ваш скрипт выполнялся пользователем root, даже при вызове их вручную, вы можете использовать SETUID :
sudo chown root /home/victor/startupAP.sh
sudo chmod +s /home/victor/startupAP.sh
Но помните, что setuid игнорируется, если вы используете shebang .