使用ssh远程执行命令批量导出数据库到本地(2)

# $1 区服名
# $2 ip
# $3 端口
function exec_sqls()
{
    cat SQLS | while read sql ; do
   
        fc=${sql:0:1}
        if [ "#" == "$fc" ]; then    #被注释的不处理
            continue
        fi

#sql语句中包含空格,不能再以空格来区分。最后一个空格后的是导出的文件名
        exp_file="${sql##* }"                #两个#表示正则以最大长度匹配*和一个空格(*后面的空格),截取余下的赋值给exp_file
        sql_cmd="${sql%% $exp_file}"        #两个%表示从右至左删除%%以后的内容
       
        export_remote_sql $2 $3 "$sql_cmd" $1 "$exp_file"
    done
}

# 需要在当前目录下创建服务器列表文件SERVERS,格式为"数据库名 ip ssh端口",如"linuxidc_game_s99 127.0.0.1 22"
# 需要在当前目录下创建sql命令列表文件SQLS,格式为"sql语句 导出的文件",如"select * from user; user.xls"
# 多个sql请注意用;分开,sql必须以;结束
# 文件名中不能包含空格,最终导出的文件为"数据库名_文件名",如"linuxidc_game_s99_user.xls"

mkdir -p $EXP_PATH

cat SERVERS | while read server ; do

fc=${server:0:1}
    if [ "#" == "$fc" ]; then    #被注释的不处理
        continue
    fi

name=`echo $server|awk '{print $1}'`
    ip=`echo $server|awk '{print $2}'`
    port=`echo $server|awk '{print $3}'`

exec_sqls $name $ip $port
done

当前目录下的文件如下,其中SERVERS是服务器列表,里面指定数据库名,ip,ss端口,SQLS则指定sql指令及导出的文件名。这两个文件里以#开头的都不会处理:

linuxidc@:~/桌面/remote_cmd$ ls
remote_cmd.sh  SERVERS  SQLS
linuxidc@:~/桌面/remote_cmd$ cat SERVERS
linuxidc_game_s99 120.0.0.99 6162
linuxidc_game_s91 120.0.0.91 6162
linuxidc_game_s92 120.0.0.92 6162
linuxidc_game_s93 120.0.0.93 6162
linuxidc_game_s94 120.0.0.94 6162
#linuxidc_game_s91 120.0.0.91 6162

linuxidc@:~/桌面/remote_cmd$ cat SQLS
#select * money from money; money.xls
select * from user; user.xls
linuxidc@:~/桌面/remote_cmd$

到这里,脚本基本完成了要求。

Linux下使用SSH图文详解教程

如何为Linux系统中的SSH添加双重认证

在 Linux 中为非 SSH 用户配置 SFTP 环境

Linux 上SSH 服务的配置和管理

SSH入门学习基础教程

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/9af401568255bb98779465f46ed7707d.html