Expect安装
expect是交互性很强的脚本语言,可以帮助运维人员实现批量管理成千上百台服务器操作,是一款很实用的批量部署工具!
expect依赖于tcl,而linux系统里一般不自带安装tcl,所以需要手动安装
下载:expect-5.43.0.tar和tcl8.4.11-src.tar
下载地址:https://pan.baidu.com/s/1kVyeLt9
提取密码:af9p
将expect和tcl的软件包下载放到/usr/local/src目录下
(1)解压tcl,进入tcl解压目录,然后进入unix目录进行编译安装
[root@xw4 src]# tar -zvxf tcl8.4.11-src.tar.gz
[root@xw4 src]# cd tcl8.4.11/unix
[root@xw4 unix]# ./configure
[root@xw4 unix]# make && make install
(2)安装expect
[root@xw4 src]# tar -zvxf expect-5.43.0.tar.gz
[root@xw4 src]# cd expect-5.43.0
[root@xw4 expect-5.43.0]# ./configure --with-tclinclude=/usr/local/src/tcl8.4.11/generic --with-tclconfig=/usr/local/lib/
[root@xw4 expect-5.43.0]# make && make install
(3)安装完成后进行测试
[root@xw4 ~]# expect
2.执行ssh登录
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd [lindex $argv 1]
spawn ssh -l root $host
expect "*password:"
send "$passwd\r"
linux下命令.
./scp.sh s101 12345
因为expect的参数从argv 0开始,
所以第一个是argv 0
scp.sh 是文件名称, #!/usr/bin/expect是expect的位置
whereis expect 查看expect命令位置
如果你想要继续交互的话 就在最后加上 interact
#!/usr/bin/expect
set host [lindex $argv 0]
set passwd [lindex $argv 1]
spawn ssh -l hadoop $host
expect "*password:"
send "$passwd\r"
interact
3.debug
如果发现运行错误可使用调试模式
#!/usr/bin/expect -d
set host [lindex $argv 0]
set passwd [lindex $argv 1]
spawn ssh -l hadoop $host
expect "*password:"
send "$passwd\r"
interact
在第一行末尾多了一个 -d
调试结果如下
4.远程scp文件
#!/usr/bin/expect
set timeout 10
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
set dest_file [lindex $argv 3]
set src_file [lindex $argv 4]
spawn scp $username@$host:$dest_file $src_file
expect {
"(yes/no)?"
{
send "yes\n"
expect "*assword:" { send "$password\n"}
}
"*assword:"
{
send "$password\n"
}
}
expect "100%"
expect eof
最后必须得有个expect 具体是expect eof 还是expect 别的都可以,否则不会执行scp命令
shell 命令(写入命令注意空格问题 )
./newscp.sh s101 root 123456 /home/hadoop/filetest /home/hadoop/bigdata
5.批量执行scp
#!/bin/sh
list_file=$1
src_file=$2
dest_file=$3
cat $list_file | while read line
do
host_ip=`echo $line | awk '{print $1}'`
username=`echo $line | awk '{print $2}'`
password=`echo $line | awk '{print $3}'`
echo "$host_ip"
./expect_scp $host_ip $username $password $dest_file $src_file
done
listfile.txt
192.168.28.133 hadoop hadoop
192.168.28.134 hadoop hadoop
192.168.28.135 hadoop hadoop
192.168.28.136 hadoop hadoop