1つのコマンドでsu + sudoを実行する方法は?

1つのコマンドでsu + sudoを実行する方法は?

私の息子(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")。

スクリプトは愚かで、提供されたパスワードが有効かどうかは関係ありません。必要に応じて改善してください。

関連情報