これらのコマンドに対して実行可能なbashスクリプトをどのように作成できますか?

これらのコマンドに対して実行可能なbashスクリプトをどのように作成できますか?

次のコマンドを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-saveiptables-restoresudo
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コマンドなしで初めて実行されます-vsudoセッションが期限切れになると、パスワードの入力を求められます。そのセッションの有効期限ウィンドウ内で実行されるすべてのコマンドにパスワードは必要ありません。したがって、sudo2つを同時に実行することはどちらもメッセージを表示しないため、もはや問題になりません(-nこれを保証するために追加しました。しようとするとエラーが発生します)。

おすすめ記事