linux 定时传送文件 scp脚本实现自动输密码并传送

2024-03-11 16:06:48 浏览数 (2)

注: 1、目的:实现在每天2点将服务器上的数据库文件通过scp发送到另一台服务器,同时自动输入密码; 2、相关插件下载地址(expect tcl 与本文配套):https://download.csdn.net/download/weixin_42184538/85143246

一、expect的安装

expect是在tcl的基础上发展起来的,所以在安装expect之前务必要先安装tcl

1、安装 tcl

1、将下载的tcl安装包上传到服务器(tcl8.4.11为例)<下载链接在本文最上方> 2、按顺序执行下面的命令进行安装

代码语言:javascript复制
[root@fqdn soft]tar -zxf tcl8.4.11-src.tar.gz
[root@fqdn soft]cd tcl8.4.11/unix
[root@fqdn soft]./configure --prefix=/usr/tcl --enable-shared
[root@fqdn soft]make
[root@fqdn soft]make install
[root@fqdn soft]cp tclUnixPort.h ../generic/

注意: 1、安装完毕以后,进入tcl源代码的根目录,把子目录unix下面的tclUnixPort.h copy到子目录generic中。

2、暂时不要删除tcl源代码,因为expect的安装过程还需要用。

2、安装 expect(需tcl的库)

将下载的expect安装包上传到服务器(expect-5.43.0为例)<下载链接在本文最上方>

代码语言:javascript复制
[root@fqdn soft]tar -zxf expect-5.43.0.tar.gz
[root@fqdn soft]cd expect-5.43
[root@fqdn soft]./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic
[root@fqdn soft]make
[root@fqdn soft]make install
[root@fqdn soft]ln -s /usr/expect/bin/expect /usr/bin/expect

3、验证 expect

代码语言:javascript复制
[root@fqdn soft]expect

若提示命令找不到请尝试下面的命令,确认安装正常后,参考本文最后的错误处理调整一下即可!

代码语言:javascript复制
[root@fqdn soft]/usr/expect/bin/expect

显示如下图即为安装正常(出现 expect1.1)

二、expect的使用

示例:例如定时将数据库备份文件发送到另一台服务器

1、编写脚本

脚本一:用于传参数到第二个脚本<假定放置路径为/home/soft>

比如:sendMysql.sh,脚本内容如下

代码语言:javascript复制
#!/bin/bash
# 设置文件名
 date=$(date  "%d-%b-%Y")
# 传文件名到第二个脚本
/home/soft/send.sh $date
脚本二:用于发送文件到其他服务器<假定放置路径为/home/soft>

比如:send.sh,脚本内容如下,*** 为你的密码,r 为模拟回车,务必保留!

代码语言:javascript复制
#!/usr/bin/expect
#获取文件名
set file_name [lindex $argv 0]
# 传输文件 
spawn scp /home/mysqlBak/db_name-$file_name.sql root@192.168.*.*:/home/fileBak
expect {
    "yes/no" {send "yesr";exp_continue;}
    "*password" {set timeout 500;send "***r";}
}
expect eof

2、添加定时任务

代码语言:javascript复制
[root@fqdn soft]crontab -e

添上命令保存即可

代码语言:javascript复制
# 每两天的2点执行一次
0 2 * * * /bin/sh /home/sendMysql.sh

三、Expect命令详解

Expect脚本中常用的命令包括spawn, expect, send, interact等。

代码语言:javascript复制
spawn

该命令用于启动一个子进程,执行后续命令

代码语言:javascript复制
expect

该命令从进程接受字符串,如果接受的字符串和期待的字符串不匹配,则一直阻塞,直到匹配上或者等待超时才继续往下执行

代码语言:javascript复制
send

向进程发送字符串,与手动输入内容等效,通常字符串需要以’r’结尾。

代码语言:javascript复制
interact

该命令将控制权交给控制台,之后就可以进行人工操作了。通常用于使用脚本进行自动化登录之后再手动执行某些命令。如果脚本中没有这一条语句,脚本执行完将自动退出。

代码语言:javascript复制
set timeout 30

设置超时时间timeout为30s,expect命令阻塞超时时会自动往下继续执行。将timeout配置为-1时表示expect一直阻塞直到与期待的字符串匹配上才继续往下执行。超时时间timeout默认为10s。

代码语言:javascript复制
[lindex $argv n]

可以在脚本中使用该命令获取在脚本执行时传入的第n个参数。这里argv为传入的参数,另外argv为传入的参数,另外argc表示传入参数的个数,$argv0表示脚本名字。

另外我们也可以使用[lrange $argv sn en]命令获取第sn到第en个参数。

四、错误解决方案

欢迎小伙伴们留言遇到的问题,我会及时补充上

1、未找到命令

解决方案:(1)检查是否将 #!/usr/bin/expect 放置在脚本的第一行;(2)重新建立expect的软连接
代码语言:javascript复制
 ln -s /usr/expect/bin/expect /usr/bin/expect

0 人点赞