分发系统、expect脚本、构建文件分发系统、批量远程执行命令

 

20.27 分发系统介绍
20.28 expect脚本远程登录
20.29 expect脚本远程执行命令
20.30 expect脚本传递参数
20.31 expect脚本同步文件
20.32 expect脚本指定host和要同步的文件
20.33 构建文件分发系统
20.34 批量远程执行命令
扩展:
shell多线程  http://blog.lishiming.net/?p=448
给你提供一本电子书 链接:http://pan.baidu.com/s/1mg49Taw 密码:yk4b
shell习题做一下  http://www.apelearn.com/study_v2/chapter15.html#shll

 

一、分发系统介绍

如今一些比较大的企业,大都使用了负载均衡,而有时因为一些程序要更改,或者有些bug要修改,快速更新代码等,如果仅是几台server的话,很简单,把已经改好的程序拷过去,或者rsync远程推送,再或者网上NFS共享一下就可以了;但如果有几十台几百台,那样的方法会太繁琐,此时就可以用expect来批量实现分发任务。

  • expect:一个实现自动交互功能的软件套件,基于Tcl的一种脚本语言,具有简单的语法;

  • 功 能 :实现自动登录远程机器,并自动执行命令;和shell脚本结合,可以实现完全自动化;

  • 注 意:若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时只知道对方机器的账号和密码可以通过expect脚本实现登录和远程命令。

二、expect脚本远程登录

 

001上进入/usr/local/sbin/,创建一个expect脚本,如果带有注释写入脚本会报错

#! /usr/bin/expect
set host "192.168.183.33" #设置连接主机,定义变量host
set passwd "qwertyuiop" #设置密码,定义变量passwd
spawn ssh root@$host #执行命令
expect {
"yes/no" { send "yes\r"; exp_continue} #假如第一次登陆,需要yse,然后回车,继续执行
"password:" { send "$passwd\r" } #输入密码
}
interact #结束执行

代码解释: #! /usr/bin/expect 这一行告诉操作系统脚本里的代码使用那一个shell来执行。

  • 在expect下 定义变量,用 set,比如 定义变量a为1 :set a 1

  • expect 使用expect语句进行交互

  • \r表示回车

  • exp_continue 表示继续 \r 表示换行 interact 继续停留在这台机器,不退出。

  • interact表示继续交互,会继续停留在远程的机器上不退出,如果使用expect eof,会在远程机器上暂停1-2秒在退出

上面脚本中的yes或no,即表示下面操作

c08952320ffc67956c5015e3fa70b98206d.jpg

如果登陆过就不在提示输入yes或no,需要在vim /root/.ssh/known_hosts删除对应机器的ip就会在远程登陆时出现提示

或者    > /root/.ssh/known_hosts //清空

54beb94023b36d7327d63b8f18fd237c87f.jpg

给脚本执行权限: chmod a+x 1.expect

./1.expect 执行脚本后,即可自动连接到002

c033aecb594407fba6c1e06e0ed28478989.jpg

不清空known_hosts下次连接则不提示yes或no

b251d5688da38f80a346eeb65155d591374.jpg

三、 expect脚本远程执行命令

自动远程登录后,执行命令并退出,给执行权限chmod a+x 2.expect

#!/usr/bin/expect
set user "root"            设置用户为 root
set passwd "qwertyuiop"    root的密码
spawn ssh $user@192.168.183.33        连接远程机器002

expect {                                    expect脚本内容
"yes/no" { send "yes\r"; exp_continue}
"password:" { send "$passwd\r" }
}
expect "]*"                                遇到右侧方括号执行下面命令,root用户时是'#',普通用户是'$',此处用'*',不做区分
send "touch /tmp/12.txt\r"                 在/tmp下创建12.txt;回车
expect "]*"                                上一语句执行完,遇到右侧方括号,执行下面
send "echo 1212 > /tmp/12.txt\r"           把1212写入12.txt,回车
expect "]*"
send "exit\r"                              输入exit,退出,回到001机器

执行脚本,到002查看,文件和内容都执行,创建时间也没问题

dd7a442acad913555cc48115bc741a47970.jpg

bbeb9e31f6da2256b8e95f27480db7a8254.jpg

四、expect脚本传递参数

expect脚本传递过来的参数可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个….参数

#!/usr/bin/expect

set user [lindex $argv 0]        第一个参数
set host [lindex $argv 1]        第二个参数
set passwd "qwertyuiop"          
set cm [lindex $argv 2]          第三参数
spawn ssh $user@$host

expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

给予可执行权限,并定义参数后执行脚本

chmod a+x 3.expect
./3.expect root 192.168.183.33 "ls"

8cb30a1878cbe854d608b0b9b7a53c074d5.jpg

参数中可以定义多个命令:如执行pwd、w、ls -l、vmstat 1等,命令之间用分号隔开

./3.expect root 192.168.183.33 "pwd;w;ls -l;vmstat 1"

479d95f33ead8e94a37f483c45a788e6508.jpg

也可以都使用参数代替,但是执行的时候要定义对应参数后执行脚本

07598e50e6094026bc9b58234382a57cba8.jpg

五、expect脚本同步文件

在一台机器上把文件同步到多台机器上;核心命令,就是用的rsync服务

#!/usr/bin/expect
set passwd "qwertyuiop"
spawn rsync -av root@192.168.183.33:/tmp/12.txt /tmp/
expect {
"yes/no" { send "yes\r"}
"password:" { send $passwd\r}
}
expect eof

expect eof 语句解释:

  • spawn执行的命令结果,会被expect捕捉到。因为spawn会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,eof和timeout。

  • 在这里eof是必须去匹配的,在spawn进程结束后会向expect发送eof,如果expect没有匹配,那么会立即退出远程登录,即操作失败。

chmod a+x 4.expect

同步完成

8f44716d20c8251b5363ac698681b231ba4.jpg

六、expect脚本指定host和要同步的文件

set timeout 定义超时时间(单位为 秒) -1 为永远不超时

这里要同步的文件,必要要写绝对路径

此脚本只能同步单个文件

#!/usr/bin/expect
set passwd "qwertyuiop"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -av $file root@$host:$file
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof

chmod a+x 5.expect

e488f236dc21295d670a23fd53dac3d5de3.jpg

七、构建文件分发系统

需求背景
对于大公司而言,肯定时不时会有网站或者配置文件更新,而且使用的机器肯定也是好多台,少则几台,多则几十甚至上百台。所以,自动同步文件是至关重要的。

实现思路
首先要有一台模板机器,把要分发的文件准备好,然后只要使用expect脚本批量把需要同步的文件分发到目标机器即可。  

核心命令
rsync -av --files-from=list.txt / root@host:/
使用rsync 的 --files-from参数,可以实现调用文件里面的列表,进行多个文件远程传输,进而实现文件分发文件分发系统的实现。

编写rsync.expect 脚本, chmod a+x rsync.expect

#!/usr/bin/expect
set passwd "jiangbin"
set host [lindex $argv 0]
set file [lindex $argv 1]
spawn rsync -avR --files-from=$file / root@$host:/        # 上传文件的列表是$file,需要在list当中去定义; --file-from指定文件列表路径 -R表示同步时会把不存在的目录进行创建
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect eof

创建file.list 需要同步的文件列表

/tmp/file.list

0a8e8469b2a2fdd76be66d338fe5a3c305c.jpg

因为实现分发系统,是因为需要分发的机器数量过大,所以,定义好了  list 文件列表以后, 还需要配置 ip 的列表文件

几台机器的密码要相同,如果设置了秘钥,可以把输入密码的步骤省略

/tmp/ip.list    把本地的数据同步到列表中的两台机器上

3b62011c636e8e93f45d91830f68d2b193e.jpg

创建一个rsync的shell脚本,脚本的目的:遍历所有的server和list中的文件可以同步到每台服务器。

#!/bin/bash
for ip in `cat /tmp/ip.list`
do
echo $ip
./rsync.expect $ip /tmp/file.list
done

此时查看下发数据的两台机器,已经有了下发的数据,并且会把两台机器上不存在的目录进行创建,新创建目录中的文件也会下发

e0f81d9329c0a7d1c28a3ec21cbeeb52237.jpg

八、批量远程执行命令

当同步完代码后有可能需要批量地重启服务,因此还需要批量远程执行命令,类似于自动化。 这里是用expect编写执行命令的脚本并用shell脚本来批量调用它。

创建exe.expect,chmod a+x exe.expect

#!/usr/bin/expect
set host [lindex $argv 0]
set passwd "jiangbin"
set cm [lindex $argv 1]
spawn ssh root@$host
expect {
"yes/no" { send "yes\r"}
"password:" { send "$passwd\r" }
}
expect "]*"
send "$cm\r"
expect "]*"
send "exit\r"

再新建exe.sh的shell脚本,用来调用exe.expect脚本

#!/bin/bash
for ip in `cat /tmp/ip.list`
do
    ./exe.expect $ip "ls"   调用exe.expect脚本,此处只执行ls命令,可以写成"w;free -m;ls /tmp"执行多个命令
done

19dd64847e5c6473b1fa4856a8cc4de76ab.jpg

转载于:https://my.oschina.net/u/4093217/blog/3063691

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 答: 可以使用shell脚本批量分发文件,请参考下面的示例:#!/bin/bashfor i in `ls *.txt` do scp $i user@host:/destination done ### 回答2: 编写Shell脚本可以用来批量分发文件。以下是一个简单的示例: ```bash #!/bin/bash # 输入要分发文件名 read -p "请输入要分发文件名:" filename # 输入远程服务器的IP地址和用户名 read -p "请输入远程服务器的IP地址:" ip read -p "请输入远程服务器的用户名:" username # 遍历所有IP地址,分发文件 for address in "${ip[@]}" do # 使用scp命令将文件分发远程服务器 scp $filename $username@$address:/ done echo "文件分发完成" ``` 该脚本首先要求用户输入要分发文件名,然后要求输入远程服务器的IP地址和用户名。接下来,使用一个循环遍历所有的远程服务器IP地址,使用`scp`命令将文件分发远程服务器的根目录中。 请注意,在实际使用中,可能需要对脚本进行一些修改,以满足实际需求,例如输入多个IP地址或文件路径等。 希望这个简单的示例对你有所帮助! ### 回答3: 编写Shell脚本可以批量分发文件,可以按照以下步骤进行操作: 首先,需要创建一个包含目标主机列表的文本文件,每行表示一个目标主机的IP地址或主机名。 然后,可以编写一个Shell脚本来读取此文本文件,并使用SSH命令将文件复制到每个目标主机上。脚本的大致步骤如下: 1. 使用read命令读取目标主机列表文件,将每行的主机名称或IP地址存储在一个变量中。 2. 使用scp命令将要分发文件复制到目标主机。例如,可以使用以下命令:`scp 文件路径 目标主机用户名@目标主机IP或主机名:目标目录`。可以使用循环结构将文件复制到每个目标主机上。 3. 如果需要输入密码,可以使用expect命令来实现自动化密码输入。例如:`expect -c "spawn scp 文件路径 目标主机用户名@目标主机IP或主机名:目标目录 expect \"password:\" send \"密码\n\"; interact"`。可以根据需要自定义密码和期望字符串。 4. 对目标主机进行逐一循环,直到复制到所有目标主机为止。 5. 可以根据需要添加错误处理和日志记录,以确保脚本的可靠性和稳定性。 通过编写上述Shell脚本,可以方便地批量分发文件到多个目标主机,提高工作效率。可以根据具体需求自定义脚本的功能和操作步骤。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值