while循环中碰到ssh的话,如何避免退出
先看一个例子:
#!/bin/sh . /root/.bash_profile cat /home/yejr/alldb|while read LINE do #取得IP和组号 IP=`echo $LINE | awk '{print $1}'` NU=`echo $LINE | awk '{print $2}' | awk -F '-' '{print $1}'` cnt=`ssh root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1"` echo "$IP $NU $cnt" done
看起来没有问题吧,实际上,执行的时候只循环了一次,就退出while循环了,为什么呢?
这是因为ssh需要从输入终端来读取数据,在第一次循环时ssh就把 read 读到的数据也给读取了,相当于是被他"吃"了.
解决办法是,指定 ssh 的输入终端,有3种方法:
ssh -f -f Requests ssh to go to background just before command execution. This is useful if ssh is going to ask for passwords or passphrases, but the user wants it in the background. This implies -n. The recommended way to start X11 programs at a remote site is with something like ssh -f host xterm.
或者:
ssh -n -n 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 automati- cally 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.)
或者,将ssh放到后台中执行. 以下是几种写法的综合:
#!/bin/sh . /root/.bash_profile cat /home/yejr/alldb|while read LINE do #取得IP和组号 IP=`echo $LINE | awk '{print $1}'` NU=`echo $LINE | awk '{print $2}' | awk -F '-' '{print $1}'` #-f #cnt=`ssh -f root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1"` #-n #cnt=`ssh -n root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1"` #放后台 #cnt=`ssh root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1" &` #指定输入设备 cnt=`ssh root@$IP "mysql -e 'select count(*) from yejr.tbl1'|tail -n 1" /null` echo "$IP $NU $cnt" done
不知道是否还有其他方法呢?
评论
左扬 (未验证)
周三, 2008/02/13 - 19:44
Permalink
way4: ssh root@IP <
way4:
ssh root@IP < /dev/null
yejr
周四, 2008/02/14 - 10:40
Permalink
请补充完整,谢谢 MySQ
请补充完整,谢谢
MySQL方案、培训、支持
MySQL 用户组
左扬 (未验证)
周四, 2008/02/14 - 13:16
Permalink
ssh root@IP "cmd" <
ssh root@IP "cmd" < /dev/null
利用重定向来关闭ssh的标准输入,这样ssh就不会吃东西了。
左扬 (未验证)
周四, 2008/02/14 - 13:18
Permalink
跟-n参数一个意思,表
跟-n参数一个意思,表现不同而已。
yejr
周四, 2008/02/14 - 22:00
Permalink
你没理解我上面事先
你没理解我上面事先设定好的前提,我以前也是这么用的,在循环情况下会退出,只循环一次。
MySQL方案、培训、支持
MySQL 用户组
左扬 (未验证)
周二, 2008/02/19 - 15:08
Permalink
我是说 ssh IP "cmd "
我是说
ssh IP "cmd " </dev/null
跟 ssh -n是一样的,
真纳闷,这里两次留言半角的</dev/null都没显示出来。
是不是后台把它“吃”了……
yejr
周二, 2008/02/19 - 20:25
Permalink
呵呵,是的,2者相同
呵呵,是的,2者相同效果。
估计是你留言时选择html代码模式导致被吃掉的 :)
MySQL方案、培训、支持
MySQL 用户组