我的儿子(不是 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"
)。
该脚本很愚蠢,并不关心提供的密码是否有效。如果需要的话进行改进。