前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux 定时传送文件 scp脚本实现自动输密码并传送

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

作者头像
悟空宇
发布2024-03-11 16:06:48
3250
发布2024-03-11 16:06:48
举报
文章被收录于专栏:干JAVA的日常干JAVA的日常

注: 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 "yes\r";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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、expect的安装
  • 1、安装 tcl
  • 2、安装 expect(需tcl的库)
  • 3、验证 expect
  • 二、expect的使用
    • 1、编写脚本
      • 脚本一:用于传参数到第二个脚本<假定放置路径为/home/soft>
      • 脚本二:用于发送文件到其他服务器<假定放置路径为/home/soft>
    • 2、添加定时任务
    • 三、Expect命令详解
    • 四、错误解决方案
      • 1、未找到命令
        • 解决方案:(1)检查是否将 #!/usr/bin/expect 放置在脚本的第一行;(2)重新建立expect的软连接
    相关产品与服务
    数据库备份服务
    数据库备份服务(Database Backup Service,简称 DBS)是为用户提供连续数据保护、低成本的备份服务。数据库备份拥有一套完整的数据备份和数据恢复解决方案,具备实时增量备份以及快速的数据恢复能力,它可以为多种部署形态的数据库提供强有力的保护,包括企业 IDC 数据中心、其他云厂商数据库及腾讯公有云数据库。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档