2017-05-03 71 views
0

我試圖將行追加到由root擁有的現有文件,並且必須使用大約100臺服務器執行此任務。所以我創建了servers.txt與所有的IP和ntp.txt文件,將有我需要追加的行。我正在執行下面的腳本,我沒有達到我想要的。有人可以提出什麼需要改正嗎?使用sudo訪問附加到文件

!/bin/bash 
servers=`cat servers.txt`; 
for i in $servers; 
do 
    cat ntp.txt | ssh [email protected]${i} sudo sh -c "cat >>ntp.conf"" 
done 
+1

爲什麼你需要使用sudo如果你已經以root身份登錄? – user2141130

+1

你想追加到根目錄的主目錄中的'ntp.conf',還是想追加到'/ etc/ntp.conf'? –

+0

除了文件路徑外,看起來確實如此。雖然你可以做'ssh root @ $ i「cat >> /path/to/ntp.conf」 ilkkachu

回答

1

這裏有一些問題;不知道我找到了他們全部。

  1. shebang line缺少#這是重要的和關鍵的。
  2. 沒有必要將服務器名稱讀入變量,除了浪費內存之外,您還面臨許多潛在的問題;請參閱https://mywiki.wooledge.org/DontReadLinesWithFor
  3. Unless you specifically require the shell to do whitespace tokenization and wildcard expansion on a value,將其放在雙引號中(或者甚至是單引號,但是這會抑制您仍想要的可變擴展)。
  4. 如果您登錄爲root,則無需明確sudo
  5. ssh爲你運行一個shell;不需要明確sh -c你的命令。
  6. 另一方面,如果可以,您希望避免運行root shell。爲了能夠重定向而添加文件而不必生成shell的常見方法是使用tee -a(只需將-a覆蓋而不是附加)。將文件打印到標準輸出也是不理想的效果(有些人會說主效應而不是tee的副作用,但我們不會去那裏),所以您經常重定向到/dev/null以避免文本溢出到屏幕上。
  7. 如果僅僅是爲了避免有人指出它沒用,你可能想要避開useless use of cat
#!/bin/bash 
while read -r server; do 
do 
    ssh [email protected]"$server" sudo tee -a /etc/ntp.conf <ntp.txt >/dev/null 
done <servers.txt 

我改變了代碼登錄爲you,但它當然是你需要調整,以適應您的環境。 (如果你登錄爲你自己,你通常只是ssh server沒有明確指定一個用戶名。)

按照您的評論,我還增加了一個完整路徑目標文件/etc/ntp.conf

更嚴格的方法對服務器配置是使用類似CFengine2的東西來管理配置。