免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8438 | 回复: 3
打印 上一主题 下一主题

[文本处理] 批量ssh远程服务器执行命令 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-07 18:26 |只看该作者 |倒序浏览
本帖最后由 rushm 于 2012-11-07 18:29 编辑

我有一个服务器list列表如下,想逐行去远程IP,然后在后面的目录下grep下内容:
# cat list.txt
  1. 192.168.0.133 /tmp/xtrabackup
  2. 192.168.0.63 /data/xtrabackup
  3. 192.168.1.84 /raid5/xtrabackup_3306
  4. 192.168.1.84 /raid5/xtrabackup_3307
  5. 192.168.0.189 /data/xtrabackup_3330
复制代码
执行脚本如下:
# cat xtrabackup-monitor.sh
  1. #!/bin/bash
  2. temp_path=$(dirname "$0")
  3. cd $temp_path
  4. pwd
  5. DATE=`date +%Y-%m-%d`
  6. cat list.txt | while read line
  7. do
  8.         ip=`echo "$line" | awk '{print $1}'`
  9.         directory=`echo "$line" | awk '{print $2}'`
  10.         echo $ip
  11.         echo $directory
  12.         ssh  -o StrictHostKeyChecking=no  -o GSSAPIAuthentication=no  $ip " grep OK $directory/*$DATE*"       --------这里注释掉,list.txt就可以都遍历。用ssh命令就只能远程第一行的ip
  13. done
复制代码
执行后,只对第一行进行远程。后面的都不执行了。
# sh xtrabackup-monitor.sh  
/root/liuhaizhong/xtrabackup-monitor
192.168.0.133
/tmp/xtrabackup
           prints "completed OK!".
121107 09:31:13  innobackupex-1.5.1: completed OK!
如果我把ssh那一行注释掉,就能输出所有:
  1. #sh xtrabackup-monitor.sh  
  2. /root/liuhaizhong/xtrabackup-monitor
  3. 192.168.0.133
  4. /tmp/xtrabackup
  5. 192.168.0.63
  6. /data/xtrabackup
  7. 192.168.1.84
  8. /raid5/xtrabackup_3306
  9. 192.168.1.84
  10. /raid5/xtrabackup_3307
  11. 192.168.0.189
  12. /data/xtrabackup_3330
  13. 192.168.0.189
  14. /data/xtrabackup_3331
  15. 192.168.0.189
  16. /data/xtrabackup_3332
  17. 192.168.0.189
  18. /data/xtrabackup_3333
复制代码
我试过用两个脚本去调用,结果也不行。有人说用数组,但是不知道如何用??求指点~~~

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
2 [报告]
发表于 2012-11-07 18:42 |只看该作者
本帖最后由 reyleon 于 2012-11-07 18:54 编辑

ssh 会吃掉后面的行,所以while循环只能遍历一行。

改下脚本

  1. #!/bin/bash
  2. temp_path=$(dirname "$0")
  3. cd $temp_path
  4. pwd
  5. DATE=`date +%Y-%m-%d`

  6. exec 5<list.txt
  7. while read line <&5
  8. do
  9.         ip=`echo "$line" | awk '{print $1}'`
  10.         directory=`echo "$line" | awk '{print $2}'`
  11.         echo $ip
  12.         echo $directory
  13.         ssh  -o StrictHostKeyChecking=no  -o GSSAPIAuthentication=no  $ip " grep OK $directory/*$DATE*"       --------这里注释掉,list.txt就可以都遍历。用ssh命令就只能远程第一行的ip
  14. done
复制代码
SHELL版新手导航: http://bbs.chinaunix.net/thread-674903-1-1.html 关于while read 只读一行的问题

为什么只读了一行: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=769040 给了解释

论坛徽章:
0
3 [报告]
发表于 2012-11-08 10:06 |只看该作者
楼上正解!这个就是ssh的重定向问题,我记得在ssh那行末尾加上 < /dev/null应该也是可以的。或者楼主把while循环改成for循环应该就可以了。

论坛徽章:
0
4 [报告]
发表于 2012-11-08 11:08 |只看该作者
谢谢楼上两位,学习了···
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP