譯者:Nica < nicaliu at gmail dot com >
.
若你有在用 Sudo,應該已經知道多一道權限確認的手續僅在於第一個輸入的命令,不擴及其它輸出/入的重導,像這樣:
sudo iptables -L > /etc/iptables
你會收到 Permission denied 的錯誤訊息,因為 shell 直譯第一個命令 (用 sudo),然後透過 pipe 傳到第二個命令 (沒有用 sudo)。
.
解決這個狀況的方式之一就是直接用 su 切換為 root 的使用者 shell。但這樣作可以說是無視一開始決定必須使用 sudo 的眾多理由 (為了留下紀錄、降低突然作了什麼蠢事的風險等等)。
.
較好的解決方式是用 sudo 執行 bash,只輸入
sudo bash
是不行的,因為這無疑與使用 su 是一樣意思。若使用 -c 選項,就能執行單一指令,然後回傳至你原始的 shell 上:
sudo bash -c ‘iptables -L > /etc/iptables’
.
另一個選擇是使用 echo,再加上第二個 pipe:
echo ‘iptables -L > /etc/iptables’ | sudo bash
若你建構的是比較複雜的命令時,此種方式可確實繼承指令本身,它可以讓你進一步確認自已作了什麼。輸入
echo ‘iptables -L > /etc/iptables’
就會在螢幕上看到這個指令會回傳什麼。此舉可確保不會發生一些非預期之中的事。接下來再召回先前的命令,並加入| sudo bash (或 | sudo sh,看你高興) 就可以了。
.
這真的很有用。尤其是當你忘了一些重導時的規矩,直到看到錯誤訊息你才想起來的時侯,這樣只要簡單修改前面那行指令的方法,確實簡單多了。
.
原文出處
