今天需要做一个定时任务脚本将最新的数据包文件传到远程的服务器上,虽然有密钥但也是要求输入密码的那种,所以只能另想办法实现让脚本自动输入密码了。
从网上查到使用expect可以,简单研究了一下,效果不错。
因为我的操作系统没有安装expect,所以直接"yum -y install expect",你可以根据你的操作系统安装expect,或者源码编译。
安装好之后就可以使用了,这里有几种方法:
一、单独写一个脚本
如 auto_scp.sh:
#!/usr/bin/expect
#使用第一个参数
set server_ip [lindex $argv 0]
#后面的也可以用参数[lindex $argv n]
set server_port 22
set server_dir /home/test
set server_user test
set server_pswd test
set scp_file auto_scp.sh
# 设置超时时间
set timeout 60
spawn scp -P $server_port $scp_file $server_user@$server_ip:$server_dir
expect {
"passphrase"
{
send "$server_pswd\n";
}
"password"
{
send "$server_pswd\n";
}
"yes/no"
{
send "yes\n";
exp_continue;
}
}
expect eof
我这里的变量都是随意设置的,你可以根据你的情况进行选择,保存退出之后,对该文件加上可执行权限,运行
"./auto_scp.sh 2.2.2.2"就可以了,"2.2.2.2"就是传入的第一参数。
"passphrase"和"password"等就是要监测的输入提示的一部分,send "$server_pswd\n"就是要执行的命令。
二、在脚本中使用----我比较喜欢这个
我这里使用的是Here document方法。
......
......
expect <<!!
set timeout 60
spawn scp -P $server_port $scp_file $server_user@$server_ip:$server_dir
expect {
"passphrase"
{
send "$server_pswd\n";
}
"password"
{
send "$server_pswd\n";
}
"yes/no"
{
send "yes\n";
exp_continue;
}
}
expect eof
!!
......
变量都是我从配置文件中获取的,这里不再赘述了。
三、在脚本中使用
也是在脚本使用,但是不是用的Here document方法,而是使用expect -c 参数书,"-c"选项后面的字符串填充的就是命令。但是要注意本身字符串的转义符。
更多使用方法,请参看"man手册"。
文摘归档
- 2017年11月(2)
- 2017年07月(1)
- 2017年03月(1)
- 2015年11月(1)
- 2015年05月(1)
- 2014年09月(3)
- 2014年05月(5)
- 2014年04月(11)
- 2014年03月(20)
- 2014年02月(9)
阅读排行榜
- java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken (661)
- kubernetes(k8s)集群部署文档-官方文档 (367)
- 获取weblogic访问IP前十和瞬时访问量前十方法 (295)
- docker镜像里提取代码和配置文件 (288)
- linux获取前一天时间的方法 (187)
- 怎样看待百度首页改版? (168)
- linxu标准目录结构 (165)
- Shell脚本Ping监测主机存活状态 (155)
- linux文件系统只读原因和监控脚本监控文件系统只读 (154)
- linux系统文件管理-创建/复制/移动/删除等命令详解 touch,mkdir,cp,mov,rm命令详解 (148)