linux sh脚本 while,Linux shell脚本使用while循环执行ssh的注意事项
原標(biāo)題:Linux shell腳本使用while循環(huán)執(zhí)行ssh的注意事項
如果要使用ssh批量登錄到其它系統(tǒng)上操作時,我們會采用循環(huán)的方式去處理,那么這里存在一個巨大坑,你必須要小心了。
一、場景還原:
我現(xiàn)在是想用一個腳本獲取一定列表服務(wù)器的運行時間,首先我建立一個名字為ip.txt的IP列表(一個IP一行),再建好密鑰實現(xiàn)不用密碼直接登錄。然后寫腳本如下:
#!/bin/bash
whileread ips;
do
echo $ips;
done< ip.txt
腳本實現(xiàn)了逐行讀取列表中的IP,但是:
#!/bin/bash
whileread ips;
do
echo $ips;
upt=`ssh root@$ips "uptime"`;
echo $upt;
done< ip.txt
腳本只對第一個IP做了檢測,就直接跳出來了。
二、問題分析:
while使用重定向機制,ip.txt文件中的信息都已經(jīng)讀入并重定向給了整個while語句,所以當(dāng)我們在while循環(huán)中再一次調(diào)用read語句,就會讀取到下一條記錄。問題就出在這里,ssh語句正好回讀取輸入中的所有東西。為了禁止ssh讀所有東西增加一個< /dev/null,將ssh 的輸入重定向輸入。
三、解決策略:
1、使用for循環(huán)代表while,因為for沒有一次把文件內(nèi)容緩存獲取過來,代碼段修改如下:
forips in`cat ip.txt`; do
echo ${ips};
upt=`ssh root@${ips} uptime`;
echo $upt;
done
2、若堅持使用while循環(huán),那么需要對ssh增加-n參數(shù),為什么增加了-n參數(shù)也可以解決問題呢?通過man ssh查看-n參數(shù)的說明:
Redirects stdin from /dev/null (actually, prevents reading from stdin)
這就和
修改后的代碼如下:
#!/bin/bash
whileread ips;
do
echo $ips;
upt=`ssh -n root@$ips "uptime"`;
echo $upt;
done< ip.txt返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的linux sh脚本 while,Linux shell脚本使用while循环执行ssh的注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go linux环境搭建,Linux 下
- 下一篇: linux 其他常用命令