記錄在shell指令碼中使用sudo echo x > 時,拋Permission denied錯誤

hackeruncle發表於2017-01-12
1.場景
在一個非root且帶有sudo許可權的使用者,使用shell指令碼(單獨手工執行命令不會拋錯,是成功的):會拋錯

點選(此處)摺疊或開啟

  1. #!/bin/bash -x

  2. DNS_SERVER=10.xx.xx.xx;
  3. echo "Add DNS Server";
  4. sudo chattr -i /etc/resolv.conf;
  5. sudo echo "nameserver $DNS_SERVER" > /etc/resolv.conf;
  6. sudo chattr +i /etc/resolv.conf

2.錯誤
 

點選(此處)摺疊或開啟

  1. [hadoop@emr-header-1 WNE-2280FFD89A744E81]$ ./init-emr-env.sh
  2. + DNS_SERVER=10.xx.xx.xx
  3. + echo 'Add DNS Server'
  4. Add DNS Server
  5. + sudo chattr -i /etc/resolv.conf
  6. + sudo echo 'nameserver 10.xxx.xx.xx'
  7. ./init-emr-env.sh: line 7: /etc/resolv.conf: Permission denied
  8. + sudo chattr +i /etc/resolv.conf
  9. + echo 'remove hive2.0'

 3.分析
在shell指令碼中,bash 拒絕這麼做,說是許可權不夠.
這是因為重定向符號 “>” 也是 bash 的命令。sudo 只是讓 echo 命令具有了 root 許可權,但是沒有讓 “>” 命令也具有root 許可權,所以 bash 會認為這個命令沒有寫入資訊的許可權。

4.解決方法
echo "nameserver $DNS_SERVER" | sudo tee /etc/resolv.conf;

利用管道和 tee 命令,該命令可以從標準輸入中讀入資訊並將其寫入標準輸出或檔案中,
具體用法如下:
echo a |sudo tee 1.txt
echo a |sudo tee -a 1.txt   // -a 是追加的意思,等同於 >>

tee 命令很好用,它從管道接受資訊,一邊向螢幕輸出,一邊向檔案寫入。


 

參考:http://blog.csdn.net/hejinjing_tom_com/article/details/7767127
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30089851/viewspace-2132326/,如需轉載,請註明出處,否則將追究法律責任。

相關文章