Shell
如何為這些命令創建可執行的 bash 腳本?
我希望創建一個可執行的 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-save
在sudo
.其次,
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
以絕對確定這一點。如果嘗試它會拋出錯誤)。