web-dev-qa-db-ja.com

これを1つのコマンドでsu + Sudoする方法は?

私の息子(sudoerではない)がログインしており、his端末から、インターネットブロッキング(iptables)を削除したい場合があります(これは再起動後に再び戻ります;))。

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

これを1行で行う方法はありますか。パスワードを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回入力する問題は解決しませんか?)

2
Basj

@roaimaのコメントのおかげで、rootのパスワードを作成しました(Ubuntuではデフォルトで無効になっています):Sudo passwd root、そして私はこの単純な方法を使うことができます:

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

この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_の間の行は、パスワードの読み取りを担当します。スクリプト自体にパスワードを含めることは可能ですが、おそらくこれは望ましくありません。パスワードは1回読み取られ、2回提供されます(send "$expect_out(1,string)\r")。

スクリプトは馬鹿げており、提供されたパスワードが機能するかどうかを気にしません。必要に応じて改善してください。

2