本文共 2043 字,大约阅读时间需要 6 分钟。
问题描述:
编写一个shell脚本,实现: (1)传入3个参数(主机ip、用户名和密码) (2)定时远程拷贝一个文件到指定主机的目录。 PS:可以将参数传给crontab,第一次运行时将3个参数放到txt文件中,后面每次运行时从文本文件中读入用户名和密码。一、实现远程拷贝:
/home/hadoop/remote_copy.sh#!/bin/bash #定义3个变量:主机ip,用户名,密码 echo "主机ip:$1" echo "用户名:$2" #远程拷贝 scp 源文件 用户名@目的地ip:目的地文件夹,例如: scp /home/hadoop/hello.sh $2@$1:/home/lxxinn
用如下命令执行脚本:
cd /home/hadoop.//remote_copy.sh
二、实现免密
上述scp在执行时需要手动输入密码进行交互,因此这步实现免密输入功能。通过查询资料,发现expect命令可以实现自动的交互式任务,而无需人工干预。1、安装expect:
expect是在Tcl基础上创建起来的,所以在安装expect前我们应该先安装Tcl。 (一)Tcl 安装主页:
下载地址: 1.下载源码包wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
2.解压缩源码包
tar xfvz tcl8.4.11-src.tar.gz
3.安装配置
cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
注意:
1)安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。2)暂时不要删除tcl源代码,因为expect的安装过程还需要用。
(二)ubuntu安装expect命令:
sudo apt-get install expect
查看expect是否安装成功:
hadoop@Master:~$ expectexpect1.1> exithadoop@Master:~$
(三)编写免密远程拷贝脚本
remote_copy.sh
#!/usr/bin/expect #上述语句为expect解释器的位置#设定3个需要手动输入的参数:主机ip,用户名,密码#如果在执行scp任务时遇到了代码中没有指定的异常,则在等待10秒后该脚本的执行会自动终止set timeout 10 set host [lindex $argv 0]set username [lindex $argv 1]set password [lindex $argv 2]#启动新的进程,spawn后的send和expect命令都是和使用spawn打开的进程进行交互spawn scp /home/hadoop/hello.sh $username@$host:/home/lxxinn #等待上述spawn打开的拷贝进程的反馈,根据该进程的反馈,再发送对应的交互命令expect {#进程询问(yes/no)? "(yes/no)?" {#向进程发送yes命令 send "yes\n" #*表示通配符? expect "*password:" {send "$password\n"} }#进程要求输入密码 "*password:" { send "$password\n" }}#拷贝完后,进程显示100%;若没有收到100%的消息,则一直等,等10秒过后还没收到消息,则自动终止脚本--前面设置的timeoutexpect "100%" #与spawn对应,表示捕获终端输出信息的终止expect eof
参考资料:
赋予脚本可执行权限:
sudo chmod +x remote_copy.sh
运行此expect脚本:
./remote_copy.sh 172.29.22.31 lxxinn 1234
三、为脚本添加定时执行
用命令crontab -e打开cron配置文件,添加如下内容:
01 * * * * /home/hadoop/remote_copy.sh
Note:每分钟执行一次脚本
一旦在cron配置文件配置文件中添加了此任务,保存关闭后,cron任务即开始执行。 PS:新创建的cron作业,不会马上执行,至少要过2分钟才执行。如果重启cron服务则会马上执行重启命令:service cron restart
使用下面的命令可以移除已经计划的cron作业:
crontab -r
使用下面的命令移除所有已计划的cron作业,且无需再次确认。
crontab -ir
参考:
用cron定时执行shell脚本:转载地址:http://mzegi.baihongyu.com/