首页 > 其他 > 详细

shell中while循环引用ssh命令的坑

时间:2014-07-30 12:30:44      阅读:379      评论:0      收藏:0      [点我收藏+]

原理shell代码如下:

#!/bin/sh

cat ../androidsrc | while read line
do
        ip=$(echo $line | awk ‘{print $1}‘)
        srcdir=$(echo $line | awk ‘{print $2}‘)
        destdir=$(echo $line | awk ‘{print $3}‘)
        user=$(echo $line | awk ‘{print $4}‘)
        port=$(echo $line | awk ‘{print $5}‘)
        build=$(echo $line | awk ‘{print $6}‘)

        echo $ip"   "$srcdir"   "$destdir"    "$user"    "$port"    "$build

        #rsync -av $srcdir "-e ssh -p $port" $user@$ip:$destdir
        ssh -p $port $user@$ip sh $build
done

androidsrc文件如下

xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame-ios/src/ sggame 61693 /data/build/buildgame2.sh
xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame2/src/ sggame 61693 /data/build/buildgame2.sh
xxx.yyy.zzz.zzz  /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz  /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz  /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz /data/build/xgame2/src/ /data/build/xgame/src/ sggame 61693 /data/build/buildgame.sh
xxx.yyy.zzz.zzz  /data/build/xgame2/src/ /data/build/xgame/src/ root 22 /data/build/buildgame.sh

其中,xxx.yyy.zzz.zzz表示IP地址

    问题来源:在执行这个脚本之后,发现只执行了第一次,循环就中断了。

    问题解析:经过查询,发现经过管道或重定向的androidsrc文件内容,被ssh -p $port $user@$ip sh $build提前吃掉了。

    

最终修改之后如下:

#!/bin/sh

cat ../androidsrc | while read line
do
        ip=$(echo $line | awk ‘{print $1}‘)
        srcdir=$(echo $line | awk ‘{print $2}‘)
        destdir=$(echo $line | awk ‘{print $3}‘)
        user=$(echo $line | awk ‘{print $4}‘)
        port=$(echo $line | awk ‘{print $5}‘)
        build=$(echo $line | awk ‘{print $6}‘)

        echo $ip"   "$srcdir"   "$destdir"    "$user"    "$port"    "$build

        #rsync -av $srcdir "-e ssh -p $port" $user@$ip:$destdir
        ssh -p $port $user@$ip sh $build < /dev/null
done

    

结论:while read时,如果遇到处理标准输入的命令cat,mail,ssh,grep,sed,awk等等,都应该考虑到这个问题。否则写shell的时候就是个坑




本文出自 “技术成就未来” 博客,谢绝转载!

shell中while循环引用ssh命令的坑,布布扣,bubuko.com

shell中while循环引用ssh命令的坑

原文:http://jishuweiwang.blog.51cto.com/6977090/1532643

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!