轉自:https://zhidao.baidu.com/question/432126157616850964.html html
問題:緩存
我如今是想用一個腳本獲取必定列表服務器的運行時間。首先我創建一個名字爲ip.txt的IP列表(一個IP一行),再建好密鑰實現不用密碼直接登陸。而後寫腳本以下:
#!/bin/bash
while read ips;
do
echo $ips;
done < ip.txt
腳本實現了逐行讀取列表中的IP,可是:
#!/bin/bash
while read ips;
do
echo $ips;
upt=`ssh root@$ips "uptime"`;
echo $upt;
done < ip.txt
腳本實現了一個IP的檢測,就直接跳出來了。大神,求救!!!bash
大神解答:服務器
一、while使用機制,ip.txt文件中的信息都已經讀入並給了整個while語句。因此當咱們在while循環中再一次調用read語句,就會讀取到下一條記錄。問題就出在這裏,ssh語句正好回讀取輸入中的全部東西。爲了禁止ssh讀全部東西增長一個< //null,將ssh 的輸入輸入 while read ips; do echo $ips; upt=`ssh root@${ip1} uptime < //null;`; echo $upt; done < ip.txt; 二、用for for ips in `cat ip.txt`; do echo ${ips}; upt=`ssh root@${ips} uptime`; echo $upt; done
高手啊,講解得很是透徹很是專業。我還想問你個問題: 一、爲何用</dev/null重定向就能夠禁止ssh讀取全部東西呢?/dev/null是否是把遠程的值重置爲空呢?這個問題有點抽象。 二、兄弟提到for語句,也寫得很精闢。for語句怎麼不存在while語句剛纔的那個問題? 三、剛纔樓上有個兄弟提到用-n參數,我試過也是能夠的,你能夠幫他回答一下爲何這個-n也能夠的嗎?
追答ssh
一、< /dev/null是告訴ssh若是要獲取就從/dev/null獲取,避免了獲取while緩存 二、for沒有一次把文件內容緩存獲取過來 三、看一下man ssh -n參數 Redirects stdin from /dev/null (actually, prevents reading from stdin).和</dev/null道理同樣。