私の息子(sudoerではない)がログインしています。彼のターミナル、時々インターネットのブロックを解除したい場合がありますiptables
(再起動後に再び表示される;))。
son$ su dad
<enter password>
dad$ sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT
<re-enter password>
1行にパスワードを一度だけ入力する方法はありますか?
私は同様のことを試しましたが、su dad -c "sudo iptables -D OUTPUT -m owner --uid-owner son -j REJECT"
成功しませんでしたsudo: no tty present and no askpass program specified
。
(おそらく.shを使用できますが、パスワードを2回入力する問題は解決しませんか?)
答え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
パスワードを読むのに役立ちます。スクリプト自体にパスワードを含めることは可能ですが、おそらく望ましくないでしょう。パスワードは一度読んで2回提供されます(send "$expect_out(1,string)\r"
)。
スクリプトは愚かで、提供されたパスワードが有効かどうかは関係ありません。必要に応じて改善してください。