利用expect传输命令到多台机器并执行

首先简单介绍一下expect:
  expect基于Tcl语言开发,主要应用于自动化交互式操作场合,借助Expect处理交互的命令,可以将交互 过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完。
expect语法:expect [选项] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]
expect中常用命令:

  • spawn:启动新的进程
  • send:用于向进程发送字符串
  • expect:从进程接收字符串
  • interact:允许用户交互
  • exp_continue:追加命令
    expect默认自动交互,如果需要人工交互,需要用interact。
    expect默认未安装,需要执行yum install -y expect安装,此包依赖于Tcl,所以也会附带安装Tcl。
    在这里插入图片描述
    在终端输入expect可开启一个交互式会话:
    单分支模式:
    在这里插入图片描述
    接收到expect后面添加的内容后,就自动发送send后的内容。
    多分支模式1:
    在这里插入图片描述
    多分支模式2:
    在这里插入图片描述
    默认没有换行,需要自己添加到send中。
    好了,看实际的例子:
    需求:能在10台机器上批量执行某个脚本。
    需求拆分:批量执行脚本需要需要将脚本复制到客户端,需要用到scp;而执行则需要登录到客户端,可用ssh。
    可分成三个文件:
    新建一个名为ip的文件,其中存放ip地址,便于管理。我这里就两台主机,所以这里就写了两行,如下:
192.168.10.10 root root
192.168.10.11 root rootyy

总共用到了三个文件:

  • 一个ip,如上所示,存放客户端的ip、用户名、密码;
  • 一个scripts.sh,要复制到目标主机的脚本文件(记得这边先添加好执行权限),
  • 另外一个就是具体跑的脚本auto_sc.sh了。
    依次贴出代码:
    #!/bin/bash
    cd /var/ 
    touch test_expect
    echo "it works!" > test_expect
#!/bin/bash
	
func(){
ip=$1 #接收IP的变量
user=$2 #接收用户名的变量
password=$3 #接收密码的变量
echo $ip
echo $user
echo $password
expect <<EOF
set timeout 10 
spawn scp /root/bin/scripts.sh $user@$ip:/var/
expect {
        "yes/no" {send "yes\n";exp_continue}
        "password" {send "$password\n"}

}
expect eof

spawn ssh $user@$ip
expect {
        "yes/no" {send "yes\n";exp_continue}
        "password" {send "$password\n"}
}
expect "]#" {send "cd /var\n"}
expect "]#" {send "./scripts.sh\n"}
send "exit\n"
expect eof
EOF
}


while read line;do
	IP=${line%% *}
	USER=`echo $line |cut -d' ' -f2`
	PAWD=${line##* }
	func $IP $USER $PAWD
done < ./ip

注:我这里是直接在脚本中调用expect,expect也可以单独写,它有自己的语法,文件后缀为.exp,首行为#!/usr/bin/expect
贴执行成功的结果:
在这里插入图片描述
复制的文件有了:
在这里插入图片描述
创建的文件也有了:
在这里插入图片描述
这里只做一个Demo,复杂应用自己结合实际用吧。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将另一个 Linux 机器执行命令的结果发送到微信,您需要进行以下步骤: 1. 在本地机器上安装 `expect` 工具,例如在 Ubuntu 上可以使用以下命令进行安装: ``` sudo apt-get install expect ``` 2. 编写一个 `expect` 脚本,用于在远程机器执行命令并将结果保存到本地机器上的一个临时文件中。例如,将以下脚本保存为 `remote_cmd.expect` 文件: ``` #!/usr/bin/expect # 设置远程机器的用户名、IP 地址和密码 set user username set host remote_machine_ip set password your_password # 设置要在远程机器执行命令 set command "command" # 登录远程机器执行命令,并将结果保存到本地机器上的一个临时文件中 spawn ssh $user@$host $command expect { "*password:*" { send "$password\r" } } set timeout -1 expect eof set result $expect_out(buffer) set file [open "/tmp/result.txt" "w"] puts $file $result close $file ``` 在脚本中,您需要设置远程机器的用户名、IP 地址和密码,以及要在远程机器执行命令脚本执行完毕后,结果将保存到本地机器上的 `/tmp/result.txt` 文件中。 3. 在本地机器执行以下命令,使用 `expect` 脚本登录远程机器执行命令: ``` expect remote_cmd.expect ``` 4. 使用 `curl` 命令将 `/tmp/result.txt` 文件中的内容上传到一个文件共享服务,例如 https://file.io,获取上传文件的 URL。 ``` curl -F "file=@/tmp/result.txt" https://file.io ``` 5. 将上传文件的 URL 发送到微信即可。 注意,为了保证安全性,您应该在远程机器上创建一个仅限于执行指定命令的用户,并使用该用户登录远程机器。另外,您需要确保本地机器和远程机器之间可以正常通信,并且远程机器可以访问互联网。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值