从远程服务器拷贝数据文件到指定的服务器上,估计是需要同学都遇到过的问题。scp 和rsync 都可以实现,rsync俺还没玩过,不过应该也比较简单吧。如果用scp来实现自动拷贝文件,但是需要用户来输入的密码,否则无法实现,怎么办?听说expect可以解决这个问题。
1。首先确认expect的包是否安装。
[root@lamp100 opt]$ rpm -qa | grep expect
如果没有则需要下载安装,可以参考:
编译安装:http://www.lamp100.com/333
rpm安装:expect-5.42.1-1.x86_64.rpm 和 expect-devel-5.42.1-1.x86_64.rpm 这个安装相对简单些
rpm下载地址:
http://mirrors.163.com/centos/5/os/i386/CentOS/
http://mirrors.163.com/centos/5/os/x86_64/CentOS/
安装过后会显示:
[root@lamp100 opt]$ rpm -qa | grep expect
expect-5.43.0-5.1
expect-devel-5.42.1-1
2.查看expect的路径,可以用
[root@lamp100 opt]$ which expect
/usr/bin/expect
[root@lamp100 opt]$ vim auto_cp_data.sh
3。确定脚本有可执行权限
chmod +x auto_cp_data.sh
1 | #!/usr/bin/expect //这个expect的路径就是用which expect 查看的结果 |
2 |
3 | set date [ exec date "+%y_%m_%d" ] |
4 |
5 | spawn scp root@10.3.32.57:/opt/htdocs/search_data/ "$date" _raw_food.xml /opt/sourcedata/ |
6 |
7 | expect "password:" //匹配password |
8 |
9 | send "123456\r" //发送密码 |
10 |
11 | interact //执行完毕 |
另外需要注意的是:
不能按照习惯来用sh auto_cp_data.sh来这行expect的程序,会提示找不到命令,如下:
auto_cp_data.sh: line 3: spawn: command not found
couldn’t read file “password:”: no such file or directory
auto_cp_data.sh: line 5: send: command not found
auto_cp_data.sh: line 6: interact: command not found
因为expect用的不是bash所以会报错。执行的时候直接./auto_cp_data.sh就可以了。~切记!
参考链接:http://blog.youkuaiyun.com/zhuying_linux/article/details/6657020