linux shell脚本用while read逐行读取文本的问题
我现在是想用一个脚本获取一定列表服务器的运行时间。首先我建立一个名字为ip.txt的IP列表(一个IP一行),再建好密钥实现不用密码直接登录。然后写脚本如下:#!/bin...
我现在是想用一个脚本获取一定列表服务器的运行时间。首先我建立一个名字为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的检测,就直接跳出来了。大神,求救!!! 展开
#!/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的检测,就直接跳出来了。大神,求救!!! 展开
2个回答
展开全部
1、while使用重定向机制,ip.txt文件中的信息都已经读入并重定向给了整个while语句。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,ssh语句正好回读取输入中的所有东西。为了禁止ssh读所有东西增加一个< /dev/null,将ssh 的输入重定向输入
while read ips;
do
echo $ips;
upt=`ssh root@${ip1} uptime < /dev/null;`;
echo $upt;
done < ip.txt;
2、用for
for ips in `cat ip.txt`; do
echo ${ips};
upt=`ssh root@${ips} uptime`;
echo $upt;
done
while read ips;
do
echo $ips;
upt=`ssh root@${ip1} uptime < /dev/null;`;
echo $upt;
done < ip.txt;
2、用for
for ips in `cat ip.txt`; do
echo ${ips};
upt=`ssh root@${ips} uptime`;
echo $upt;
done
追问
高手啊,讲解得非常透彻非常专业。我还想问你个问题:
1、为什么用</dev/null重定向就可以禁止ssh读取所有东西呢?/dev/null是不是把远程的值重置为空呢?这个问题有点抽象。
2、兄弟提到for语句,也写得很精辟。for语句怎么不存在while语句刚才的那个问题?
3、刚才楼上有个兄弟提到用-n参数,我试过也是可以的,你可以帮他回答一下为什么这个-n也可以的吗?
追答
1、< /dev/null是告诉ssh如果要获取就从/dev/null获取,避免了获取while缓存
2、for没有一次把文件内容缓存获取过来
3、看一下man ssh -n参数 Redirects stdin from /dev/null (actually, prevents reading from stdin).和</dev/null道理一样。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ssh 后面加 -n 在循环里面做ssh操作的时候需要这样做,原理我忘了,你自己百度一下吧,但这样能解决你的问题了。
追问
这里就是百度啊,大哥,就你了!
追答
大哥,你问的是你的循环会跳出来,我提出解答,而且解答是正确的就行啦。我也不是大神啊,看到了你的问题,我刚好知道,以前是看过为什么要用 -n 来解决,但是我都工作那么久了,哪记得那么多的。
收集了一下,ssh的命令解释:Redirects stdin from /dev/null (actually, prevents reading from stdin). This must be used when ssh is run in the background. A common trick is to use this to run X11 programs on a remote machine. For example, ssh -n shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi, and the X11 connection will be automatically forwarded over an encrypted channel. The ssh program will be put in the background. (This does not work if ssh needs to ask for a password or passphrase; see also the -f option.)
也就是防止stdin阅读到空的内容,标准输入的内容有了保障,那么你的循环就会循环到你的标准输入到没有为止。可以供你参考一下。
ssh是一个加密通道命令,以我的理解来看,就是会把你之前的那些stdin给加密没了,循环也就继续不下去了。加入了-n就防止了这种情况发生。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询