私の息子(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回入力する問題は解決しませんか?)
@roaimaのコメントのおかげで、rootのパスワードを作成しました(Ubuntuではデフォルトで無効になっています):Sudo passwd root
、そして私はこの単純な方法を使うことができます:
su -c "iptables -D OUTPUT -m owner --uid-owner son -j REJECT"
<enter password only once>
この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"
)。
スクリプトは馬鹿げており、提供されたパスワードが機能するかどうかを気にしません。必要に応じて改善してください。