Shell

如何為這些命令創建可執行的 bash 腳本?

  • May 25, 2014

我希望創建一個可執行的 bash 腳本,它將以 root 身份執行以下命令,即使用 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

有人可以糾正上述內容並使其可行嗎?

Shell 腳本與在終端上鍵入並不完全相同。

這裡要發生的是iptables-save等待sudo su完成,然後執行。你想要的是iptables-savesudo.

其次,sudo su是行列中“無用”的例子。適當的等價物是

sudo -i

您可以採取 2 種方法來解決此問題。

方法一

sudo -i <<'EOF'
iptables-save | awk '/^[*]/ { print $1 } 
                /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }
                /COMMIT/ { print $0; }' | iptables-restore
EOF

這基本上啟動了一個 root shell 並通過 shell 發送該命令。

我們不只是在and命令sudo前面添加 a 的原因是它會同時啟動 2 s。如果他們最終都嘗試提示輸入密碼,這將無法正常工作。 因此,此解決方案僅通過啟動單個.iptables-save``iptables-restore``sudo
sudo

一行

根據您的評論中的要求,您可以在一行中執行此操作,但它變得更難閱讀。

sudo -i sh -c 'iptables-save | awk '\''/^[*]/ { print $1 }; /^:[A-Z]+ [^-]/ { print $1 " ACCEPT" ; }; /COMMIT/ { print $0; }'\'' | iptables-restore'

 

方法二

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以絕對確定這一點。如果嘗試它會拋出錯誤)。

引用自:https://unix.stackexchange.com/questions/131866