问题描述:
编写一个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 安装
主页: http://www.tcl.tk
下载地址: http://www.tcl.tk/software/tcltk/downloadnow84.tml
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:~$ expect
expect1.1> exit
hadoop@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秒过后还没收到消息,则自动终止脚本--前面设置的timeout
expect "100%"
#与spawn对应,表示捕获终端输出信息的终止
expect eof
参考资料:https://www.cnblogs.com/lixigang/articles/4849527.html
赋予脚本可执行权限:
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脚本: https://blog.csdn.net/sanyaoxu_2/article/details/78893563