
考慮以下場景
2 個虛擬機器 - 192.168.229.131、192.168.229.132
/etc/hosts
兩個虛擬機器的檔案中的 IP 均為 192.168.229.151 和 192.168.229.152
假設有大約 50 個虛擬機,就像我上面所說的。但到目前為止,我只考慮以上2個。
我將 2 個虛擬機器的 ip 儲存在名為 server 的檔案中
#cat server
192.168.229.131
192.168.229.132
下面是腳本
#!/bin/bash
cat server | while read line
do
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@$line << EOF
echo successfully logged in $line
MYIP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
for i in 151 152
do
echo 192.168.229.\$i >> errips
done
for data in `cat errips`
do
echo data currently has $data
grep $data /etc/hosts
if [ $? -eq 0 ]
then
sed -i "s/$data/$MYIP/g" /etc/hosts
echo "completed"
unset MYIP
rm -rf errips
exit 0
fi
done
EOF
done
下面是輸出
root@master:~# ./script
cat: errips: No such file or directory
successfully logged in 192.168.229.131
cat: errips: No such file or directory
successfully logged in 192.168.229.132
為什麼登入伺服器後的for循環會在登入之前執行?
我嘗試使用下面的內容而不是“for”
cat errips |while read line
echo line currently has $line
在這種情況下,我發現該行仍在本地主機中的伺服器檔案中獲取IP,而它應該從我遠端登入的伺服器的errips檔案中讀取它。
輸出為
line currently has 192.168.229.131
line currently has 192.168.229.132
而我期望它應該讀取文件“errips”中的值並且輸出應該如下所示
line currently has 192.168.229.151
line currently has 192.168.229.151
現在,我嘗試了以下命令
cat errips |while read data
echo data currently has $data
在這種情況下,值資料的輸出為空
data currently has
data currently has
我如何逐行讀取遠端伺服器中的檔案“errips”,並 grep 查找 /etc/hosts 中的行,然後執行 if 循環,這將用正確的 ip 替換錯誤的 ip?
答案1
您需要單引號您的此處文件限製字串,否則將啟用參數替換。這應該有效:
#!/bin/bash
cat server | while read line
do
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@$line <<'EOF'
echo successfully logged in $line
MYIP=$(ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p')
for i in 151 152
do
echo 192.168.229.$i >> errips
done
for data in `cat errips`
do
echo data currently has $data
grep $data /etc/hosts
if [ $? -eq 0 ]
then
sed -i "s/$data/$MYIP/g" /etc/hosts
echo "completed"
unset MYIP
rm -rf errips
exit 0
fi
done
EOF
done
請注意 EOF 周圍的單引號。為了進一步闡明,請嘗試以下操作:
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> 'k=1; echo $k'
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> "k=1; echo $k"
/usr/bin/sshpass -e ssh -t -q -o StrictHostKeyChecking=no root@<your_ip> "k=1; echo \$k"