次のコマンドをrootとして実行する実行可能なbashスクリプトを作成したいです(例:sudo suを使用)。
iptables-save | awk '/^[*]/ { print $1 }
/^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
/COMMIT/ { print $0; }' | iptables-restore
Bashスクリプトの最初の試みは次のとおりです。
#!/bin/bash
sudo su
iptables-save | awk '/^[*]/ { print $1 }
/^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
/COMMIT/ { print $0; }' | iptables-restore
sleep 3;
exit 0
誰かが上記の内容を修正して機能させることができますか?
答え1
シェルスクリプトは、端末に入力するのとまったく同じではありません。完了するまで
待っiptables-save
てからsudo su
実行されます。あなたが望むものiptables-save
はにありますsudo
。
第二に、sudo su
「役に立たない使用」の例です。正しい値はです
sudo -i
。
この問題を解決するために取ることができるアプローチには2つあります。
方法1
sudo -i <<'EOF'
iptables-save | awk '/^[*]/ { print $1 }
/^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
/COMMIT/ { print $0; }' | iptables-restore
EOF
これはデフォルトでルートシェルを起動し、そのシェルを介してコマンドを送信します。 and コマンドの前に a を追加し
ない理由は、同時に 2 秒間開始されるからです。sudo
このアプローチは、誰もがパスワードを求めるメッセージを表示しようとすると正しく機能しません。したがって、解決策は1つだけ開始することです。iptables-save
iptables-restore
sudo
sudo
一行
あなたの意見で要求どおりにこれを1行で実行できますが、読みにくくなります。
sudo -i sh -c 'iptables-save | awk '\''/^[*]/ { print $1 }; /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }; /COMMIT/ { print $0; }'\'' | iptables-restore'
方法2
sudo -v
sudo -n iptables-save | awk '/^[*]/ { print $1 }
/^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
/COMMIT/ { print $0; }' | sudo -n iptables-restore
ソリューションはsudo
コマンドなしで初めて実行されます-v
。sudo
セッションが期限切れになると、パスワードの入力を求められます。そのセッションの有効期限ウィンドウ内で実行されるすべてのコマンドにパスワードは必要ありません。したがって、sudo
2つを同時に実行することはどちらもメッセージを表示しないため、もはや問題になりません(-n
これを保証するために追加しました。しようとするとエラーが発生します)。