Вы можете добавить свой скрипт в/etc/sudoers
(желательно с помощью `visudo ), чтобы он был доступен пользователю.
user ALL= /path/to/script
Тогда пользователь сможет выполнить path/to/script
без sudo.
С этим expect
скриптом:
#!/usr/bin/expect
log_user 0
spawn /bin/su - dad
expect "*: "
stty -echo
send_user "Password: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
send "$expect_out(1,string)\r"
send "sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT; echo done\r"
expect "*: "
send "$expect_out(1,string)\r"
expect "done\n"
Подробнее см. man 1 expect
. Строки между stty -echo
и stty echo
отвечают за чтение пароля. Можно включить пароль в сам сценарий, но вы, вероятно, этого не хотите. Пароль читается один раз и предоставляется дважды (send "$expect_out(1,string)\r"
).
Сценарий тупой, и ему все равно, работает ли предоставленный пароль. При необходимости улучшите.
Благодаря комментарию @roaima я только что создал пароль для root (, отключенный по умолчанию в Ubuntu ):sudo passwd root
, а затем я мог просто использовать этот простой метод:
su -c "iptables -D OUTPUT -m owner --uid-owner son -j REJECT"
<enter password only once>