免费注册 查看新帖 |

Chinaunix

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

[系统管理] shell 循环执行sshpass,执行记录不全 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-09 20:25 |只看该作者 |倒序浏览
本帖最后由 ontherd 于 2016-05-09 20:31 编辑

我现在有个需求,需要在多台服务器执行一条命令,我采用shell多线程执行sshpass,但是我通过下面脚本无法实现效果,假如我要执行100台服务器,最终结果也只是执行1台服务器。
具体代码如下:
不知道如果解决这个问题,在线等大牛点拨。
  1. # /bin/bash

  2. IP_PASS_LIST="ip_pass.list"
  3. SSHPASS=`which sshpass`

  4. thead_num=5
  5. tmp_fifo_file=/tmp/$.fifo
  6. mkfifo $tmp_fifo_file
  7. exec 9<>$tmp_fifo_file
  8. rm -f $tmp_fifo_file

  9. # exec_func(passwd, host, exec_cmd)
  10. function exec_func() {
  11.     $SSHPASS -p "$1" ssh -o StrictHostKeyChecking=no root@$2 "$3"
  12. }

  13. for ((i=0; i<$thead_num; i++)); do
  14.     echo ""
  15. done >&9

  16. while read remote_ip pass; do
  17.     read -u9
  18.     {
  19.       exec_func $pass $remote_ip w
  20.       sleep 2
  21.       echo "" >&9
  22.     } &
  23. done < $IP_PASS_LIST

  24. wait
  25. exec 9>&-
  26. exit
复制代码

论坛徽章:
0
2 [报告]
发表于 2016-05-09 23:25 |只看该作者
以前遇到过while循环体中出现ssh之类的东西时,循环只执行一次的情况。
貌似跟while中read读取的东西被ssh命令读取走了有关系。
可以试着把14行改为:
$SSHPASS -p "$1" ssh -o StrictHostKeyChecking=no root@$2 "$3" </dev/null
试试看。

论坛徽章:
0
3 [报告]
发表于 2016-06-16 10:08 |只看该作者
回来准备发新帖才发现自己以前的求助帖还没有close。
自己做下总结,对于sshpass使用while循环执行只运行一行的情况,可以使用for循环规避,当初如何测试的现在已经记不清了。
直接上脚本吧。
  1. # /bin/bash
  2. ######################################################
  3. #Description:
  4. #  this script modity file /etc/sudoers
  5. #Author:
  6. #Date: 2016-5-9
  7. #Verison: 1.0
  8. #Processname: chsudoers.sh
  9. ######################################################
  10. export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin"

  11. # check input paramters
  12. if [ $# -ne 1 ]; then
  13.     echo "sh `basename $0` file"; exit 1
  14. fi

  15. FILE_NAME=$1
  16. LOG_NAME=change_sudoers_log.txt
  17. Date=$(date +%Y%m%d)
  18. SSHPASS=`which sshpass`
  19. #exec_cmd="cp -a /etc/sudoers /etc/sudoers.${Date}; sed -i '/LOGVIEWER =/ s@\$@&, /bin/netstat@' /etc/sudoers"
  20. exec_cmd="cp -a /etc/sudoers /etc/sudoers.${Date}"

  21. thead_num=50
  22. tmp_fifo_file=/tmp/$.fifo
  23. mkfifo $tmp_fifo_file
  24. exec 9<>$tmp_fifo_file
  25. rm -f $tmp_fifo_file

  26. # exec_ssh(passwd, host, exec_cmd)
  27. function exec_ssh() {
  28.     $SSHPASS -p "$1" ssh -o StrictHostKeyChecking=no root@$2 "$3"
  29. }

  30. # exec_scp(passwd, local_file, host, remote_dir/file)
  31. function exec_scp() {
  32.     $SSHPASS -p "$1" scp -o StrictHostKeyChecking=no $2 root@$3:$4
  33.     if [ $? -eq 0 ]; then
  34.         echo "auto_scp device $3 step 1; upload $2 to $4 success!" | tee -a $LOG_NAME
  35.     else
  36.         echo "auto_scp device $3 step 1; upload $2 to $4 failed!" | tee -a $LOG_NAME
  37.     fi
  38. }

  39. # check_ping(host)
  40. function check_ping() {
  41.     ping $1 -c 2 -w 2 > /dev/mull
  42.     if [ $? -ne 0 ]; then
  43.         echo "HOST:$1 connection failed!" | tee -a $LOG_NAME
  44.         continue
  45.     fi
  46. }

  47. for ((i=0; i<$thead_num; i++)); do
  48.     echo
  49. done >&9

  50. # exclude while execution
  51. IFS=\n'
  52. for line in `cat $FILE_NAME`; do
  53.     remote_ip=$(echo $line | awk '{print $1}')
  54.     pass=$(echo $line | awk '{print $2}')
  55.     read -u9
  56.     {
  57.         check_ping $remote_ip
  58.         os_ver=$(exec_ssh $pass $remote_ip uname)
  59.         if [ "$os_ver" = "Linux" ]; then
  60.             exec_ssh $pass $remote_ip $exec_cmd
  61.             exec_scp $pass ./sudoers.default $remote_ip /etc/sudoers
  62.         else
  63.             echo "HOST:$remote_ip non [Linux] system!" | tee -a $LOG_NAME
  64.         fi
  65.         sleep 2
  66.         echo >&9
  67.     } &
  68. done

  69. wait
  70. exec 9>&-
  71. exit 0
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2016-06-16 10:15 |只看该作者

论坛徽章:
0
5 [报告]
发表于 2016-06-16 10:22 |只看该作者
本想把自己遇到的问题给个解决办法,没想到还获得了版主额外的技术贴, 回复 4# Shell_HAT


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP