linux跨机器运行命令,通过expect自动登录到30台linux机器运行相同命令

一、用以下expect脚本可以同时对200台机器执行同一个命令,

比如:打补丁(expect remote.exp)

#!/user/bin/expect -f

for {set i 1} {$i<=200} {incr i} {

spawn ssh -p 1022 -l root 192.168.6.$i

expect "*password: "

sleep 3

send "123456\r"

expect "username\r"

send "su -\r" #SSH普通用户名密码登录

expect "Password:"

send "123456\r" #SSH的root用户名密码登录

expect -timeout 1

expect "root"

#send "find / -name sambafeng.txt\r"

send "patch -R -p1 patching file prj0name\r"

#interact 中断调试

}

二、用ssh密钥方式

#!/bin/bash

#============author sambafeng===================

#==============INIT=============================

deployDir=/opt/fordeploy

backup=/opt/backup

scriptDir=/opt/script

#=============IP Partten=================================================

#url="$1"

#url_1=${url//\\//}

#url_2=${url_1#*94}

#dir="/opt/share"$url_2

#appname=$(ls -l ${dir}/|grep "\."|awk '{printf $9 "\n"}')

#cp $dir/$appname $deployDir

#=============eli the version====================

x=0

for filename in $deployDir/*;

do

fullname=$(basename $filename)

p_name=$(echo $fullname|awk -F "-[0-9]" '{print $1}'|awk -F "-stage2" '{print $1}'|awk -F "." '{print $1}')

p_type=$(echo $fullname| rev | cut -c 1-3 | rev)

PackageName="$p_name"."$p_type"

mv -f $deployDir/$fullname $deployDir/$PackageName

array[$x]=$PackageName

let x+=1

done

#===============Remote deploy===================================================

echo "please select the package for deploy"

select var in ${array[@]}

do

for n in $(cat /opt/script/map.properties |grep "${var}")

do

list=($(echo $n | awk -F',' '{printf("%s %s %s %s",$1,$2,$3,$4)}'))

echo "==PackageName:${list[0]}==serverIp:${list[1]}==NodeName:${list[2]}==appName:${list[3]}========"

echo -n "Are sure begin deploy?(Y/N)"

read YES_OR_NO

case $YES_OR_NO in

y|Y|yes|YES)

scp $deployDir/${list[0]} oracle@${list[1]}:$deployDir

ssh ${list[1]} "sh $scriptDir/redeploy.sh ${list[2]} ${list[3]} ${list[0]};exit;"

;;

n|N|no|NO)

echo "canceled"

;;

*)

echo "Error ,you should input[Y|N]"

exit 1

;;

esac

done

rm -f $deployDir/${list[0]}

echo "$var deploy finished"

done

三、python实现ssh批量登陆执行命令 #!/usr/bin/env python import pexpect def ssh_cmd(ip, passwd, cmd): ret = -1 ssh = pexpect.spawn('ssh root@%s "%s"' % (ip, cmd)) try: i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5) if i == 0 : ssh.sendline(passwd) elif i == 1: ssh.sendline('yes\n') ssh.expect('password: ') ssh.sendline(passwd) ssh.sendline(cmd) r = ssh.read() print r ret = 0 except pexpect.EOF: print "EOF" ssh.close() ret = -1 except pexpect.TIMEOUT: print "TIMEOUT" ssh.close() ret = -2 return ret #!/usr/bin/python import paramiko import threading def ssh2(ip,username,passwd,cmd): try: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(ip,22,username,passwd,timeout=5) for m in cmd: stdin, stdout, stderr = ssh.exec_command(m) # stdin.write("Y") #简单交互,输入 ‘Y’ out = stdout.readlines() #屏幕输出 for o in out: print o, print '%s\tOK\n'%(ip) ssh.close() except : print '%s\tError\n'%(ip) if __name__=='__main__': cmd = ['cal','echo hello!']#你要执行的命令列表 username = "" #用户名 passwd = "" #密码 threads = [] #多线程 print "Begin......" for i in range(1,254): ip = '192.168.1.'+str(i) a=threading.Thread(target=ssh2,args=(ip,username,passwd,cmd)) a.start()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
昨天一个网友问如何能够将输入密码的工作在shell里面自动完成,研究了一下,发现这种交互式的工作,普通的shell实现不了,据说可以借助expect来搞定,所以初步学习了一下expect,成果和大家分享一下: 应用一: 实现从普通用户“test”切换到root用户,自动输入root的密码,不用在终端提示符下执行密码输入操作。 步骤: (1)vi autosu.sh (2)#! /usr/bin/expect -f //指定expect工具的路径,如果不清楚具体路径,可以用"which expect"命令来查看。 spawn su - // 在expect 中用"spawn"关键字来调用命令“su - ” expect ":" //在执行了su - 命令之后,提示输入密码的提示符。例如你在执行了su - 命令之后,终端里面会出现提示“口令:”,那么你就可以在这里写expect ":",或者expect -exact "口令:" send "rootpasswd\r" //这里expect用send将你的root密码自动输入到上面的提示符之后。 interact //操作完成。 注意:这里强调一下执行脚本时要注意的地方,不能按照习惯来用sh ***.sh来这行expect的程序,会提示找不到命令,因为expect用的不是bash所以会报错。执行的时候直接./***.sh就可以了。~切记! 应用二: 从普通用户切换到root之后,执行“ls”操作,调用执行aaa.sh,返回执行结果,间隔10S。 #/usr/bin/expect -f spawn su - // 在expect 中用"spawn"关键字来调用命令“su - ” expect ":" //在执行了su - 命令之后,提示输入密码的提示符。例如你在执行了su - 命令之后,终端里面会出现提示“口令:”,那么你就可以在这里写expect ":",或者expect -exact "口令:" send "rootpasswd\r" //这里expect用send将你的root密码自动输入到上面的提示符之后。 expect "#" //当遇到提示符以#结尾时,即为root权限时; send "ls\r" //expect 用spend方法调用ls 命令,并且回车(“\r”) expect "#" send "sh aaa.sh\r" //调用sh aaa.sh,即执行一个脚本文件aaa.sh。 expect "#" send "echo $?\r" sleep 10 interact
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值