如何在一个命令中执行 su + sudo?

如何在一个命令中执行 su + sudo?

我的儿子(不是 sudoer)已登录,并且从他的终端,我有时想iptables删除互联网阻止(重启后会再次出现;))。

son$ su dad
<enter password>
dad$ sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT
<re-enter password>

有没有办法在一行中完成此操作,并且可能只输入一次密码?

我尝试过类似的事情su dad -c "sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT"(但没有成功sudo: no tty present and no askpass program specified)。

(也许使用 .sh 但这不能解决两次输入密码的问题?)

答案1

感谢@roaima的评论,我刚刚为root创建了一个密码(Ubuntu默认禁用):,sudo passwd root然后我可以使用这个简单的方法:

su -c "iptables -D OUTPUT -m owner --uid-owner son -j REJECT"
<enter password only once>

答案2

使用这个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")。

该脚本很愚蠢,并不关心提供的密码是否有效。如果需要的话进行改进。

相关内容