1.安装expect
expect用于shell脚本中自动交互,其是基于tcl编程语言的工具。所以安装expect首先安装tcl。本文中使用的是expect5.45和tcl8.6.6。
安装tcl
[root@tseg0 /]$ mkdir /tools [root@tseg0 /]$ tar -zxvf tcl8.6.6-src.tar.gz [root@tseg0 /]$ cd tcl8.6.6/unix/ [root@tseg0 /]$ ./configure [root@tseg0 /]$ make [root@tseg0 /]$ make install
- 1
- 2
- 3
- 4
- 5
- 6
安装expect
[root@tseg0 /]$ cd /tools [root@tseg0 /]$ tar -zxvf expect5.45.tar.gz [root@tseg0 /]$ cd expect5.45/ [root@tseg0 /]$ ./configure --with-tcl=/usr/local/lib/ --with-tcl include=/tools/tcl8.6.6/generic/ [root@tseg0 /]$ make [root@tseg0 /]$ make install
- 1
- 2
- 3
- 4
- 5
- 6
shell脚本实现scp传输
命令解释
-c 表示可以在命令行下执行except脚本;
spawn 命令激活一个unix程序来交互,就是在之后要执行的命令;
expect “aaa” 表示程序在等待这个aaa的字符串;
send 向程序发送字符串,expect和send经常是成对出现的,比如当expect“aaa”的时候,send“bbb”。
执行脚本
#! /bin/sh expect -c " spawn scp -r /home/tseg/hello $name@10.103.240.33:/home/$name/ expect { \"*assword\" {set timeout 300; send \"$pass\r\"; exp_continue;} \"yes/no\" {send \"yes\r\";} } expect eof"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
解释:
第二行: -c 表示可以不用与控制台交互;
第三行:spawn激活一个scp的unix程序;
第五行:expect期待含有“assword”的字符串,设置连接时间最大为300毫秒,如果出现这个字符串,就send 变量pass代表的密码字符串, exp_continue表示执行下面的匹配;
第六航:expect期待含有“assword”的字符串,设置连接时间最大为300毫秒,如果出现这个字符串,就send 变量pass代表的密码字符串;
第八行:表示结束。
####sample 1:
1.vi 1.sh
#! /bin/sh
export pass=123456
export name=root
expect -c " spawn scp -r /home/tseg/hello $name@10.103.240.33:/home/$name/ expect { \"*assword\" {set timeout -1; send \"$pass\r\"; exp_continue;} \"yes/no\" {send \"yes\r\";} } expect eof"
set timeout -1 ------->>>>>>注意此处的-1,-1表示永不超时,也就是:等 scp 命令正常执行完成之后,控制权会转移到下一行。
set timeout 300 ------->>>>>>300表示300秒后超时,在超时之后,控制权会转移到下一行;若在超时时间之内,程序运行完,则控制权也会转移到下一行。
2. nohup sh 1.sh
转自 http://blog.csdn.net/BlockheadLS/article/details/52980797
####sampe 2