linux信任主机批量执行,linux使用expect批量执行主机命令 · Annecoding’s Studio

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

现在有两台Linux主机A和B,如何从A主机ssh到B主机,然后在B主机上执行命令,如何使这个过程实现全程自动化?之前有用过ssh-copy-id免密钥的形式,这里是用第二种方式expect实现。

expect是什么

expect是一个免费的编程工具,用来实现自动的交互式任务,而无需人为干预。 说白了,expect就是一套用来实现自动交互功能的软件。

在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。 这就是expect!!!

1.安装expect1yum install expect -y

2.使用expect,基本上都是和以下四个命令打交道:命令作用send用于向进程发送字符串

expect从进程接收字符串

spawn启动新的进程

interact允许用户交互

send命令接收一个字符串参数,并将该参数发送到进程。

expect命令和send命令相反,expect通常用来等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令。

spawn命令用来启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互。

interact命令用的其实不是很多,一般情况下使用spawn、send和expect命令就可以很好的完成我们的任务;但在一些特殊场合下还是需要使用interact命令的,interact命令主要用于退出自动化,进入人工交互。比如我们使用spawn、send和expect命令完成了ftp登陆主机,执行下载文件任务,但是我们希望在文件下载结束以后,仍然可以停留在ftp命令行状态,以便手动的执行后续命令,此时使用interact命令就可以很好的完成这个任务。

ssh免密登录

1.实现ssh登录执行命令,脚本如下:1

2

3

4

5

6

7

8

9

10

11

12

13

14SERVER="192.168.1.241"

PASSWD=nf123456

expect -c "

set timeout -1;

spawn ssh $SERVER;

expect {

"yes/no" { send "yesr" ;exp_contine; }

"password:" { send "$PASSWDr"; }

};

expect "]#" { send "ls -la r" };

expect "]#" { send "exit r" };

expect eof;

"

上面的shell功能和expect脚本实现的功能一致,都是通过ssh登录进去后输入,执行ls -la命令,其中

set timeout -1设置超时时间

expect后面需要加上-c

expect命令用“双引号包围起来的,这点要注意,里面如果有”需要用”转义

ls -la代表命令结束后发送一个退出命令,一般需要加上,防止阻塞

expect eof匹配spawn结束

2.ssh批量免密demo,脚本如下:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21SERVERS="192.168.1.241 192.168.1.242"

PASSWD="123456"

function sshcopyid

{

expect -c "

set timeout -1;

spawn ssh-copy-id $1;

expect {

"yes/no" { send "yesr" ;exp_contine; }

"password:" { send "$PASSWDr";exp_continue; }

};

expect eof;

"

}

for server in $SERVERS

do

sshcopyid $server

done

批量执行主机命令

1.存储在host.info的主机信息如下1

2cat host.info

192.168.1.3 root 22 111111

2.linux下批量执行主机命令实现脚本1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23$ cat batch_host.sh

COMMAND=$*

HOST_INFO=host.info

# 不匹配文件中的注释

for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO);do

USER=$(awk -v ip=$IP 'ip=$1{print $2}' $HOST_INFO)

PORT=$(awk -v ip=$IP 'ip=$1{print $3}' $HOST_INFO)

PASS=$(awk -v ip=$IP 'ip=$1{print $4}' $HOST_INFO)

# expect -c执行自身的语句

# 因为外面有双引号,再次出现都需要转义

# 执行完命令要退出

expect -c "

spawn ssh -p $PORT $USER@$IP

expect {

"(yes/no)" {send "yesr"; exp_continue}

"password:" {send "$PASSr"; exp_continue}

"$USER@*" {send "$COMMANDr exitr"; exp_continue}

};

"

echo "--------------------------------------------"

done

其中exp_continue表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。

结合着expect "*password*" {send "$passwordr"}这句代码来说说“模式-动作”。简单的说就是匹配到一个模式,就执行对应的动作;匹配到password字符串,就输入密码。

执行结果如下:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18$ bash test.sh 'df -h'

Last login: Tue Sep 3 05:05:47 2019 from 192.168.1.2

Filesystem Size Used Avail Use% Mounted on

/dev/mapper/centos-root 14G 979M 13G 7% /

devtmpfs 3.9G 0 3.9G 0% /dev

tmpfs 3.9G 0 3.9G 0% /dev/shm

tmpfs 3.9G 49M 3.8G 2% /run

tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup

/dev/sda1 497M 125M 373M 25% /boot

tmpfs 783M 0 783M 0% /run/user/0

logout

Connection to 192.168.1.3 closed.

df -h

exit

--------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值