国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > Linux Shell > 正文

linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫(kù)到本地

2020-07-27 19:07:22
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前天正在跟前端的同事調(diào)試功能。服務(wù)器開(kāi)好,模擬的玩家登錄好,就在倒計(jì)時(shí)。這時(shí)突然運(yùn)營(yíng)的同事跑過(guò)來(lái)說(shuō)要統(tǒng)計(jì)幾個(gè)服務(wù)器玩家的一些情況,也就是需要從幾個(gè)服的數(shù)據(jù)庫(kù)導(dǎo)出部分玩家的數(shù)據(jù)。好吧,我看了一下時(shí)間,11:47。心想,跟前端調(diào)試完,去吃個(gè)飯?jiān)傥缧菀幌履蔷拖挛缭俳o吧。沒(méi)想對(duì)方來(lái)一句"就導(dǎo)個(gè)數(shù)據(jù)庫(kù)而已,要這么久么?",而且還是直接跟我上司說(shuō)的。我嚓,好吧,我導(dǎo)。可問(wèn)題來(lái)了,平時(shí)的統(tǒng)計(jì)是由php做的,批量部署這些是由運(yùn)維做的。服務(wù)端完全沒(méi)有對(duì)應(yīng)的工具。而且服務(wù)器是在阿里云上的,數(shù)據(jù)庫(kù)的用戶是限制了ip段登錄的,我所在的ip沒(méi)法登錄的。于是,只好終止調(diào)試,切ip,寫(xiě)sql,然后用navicat手動(dòng)一個(gè)個(gè)服務(wù)器導(dǎo)出數(shù)據(jù)到excel。

  事后想想,還是寫(xiě)個(gè)腳本吧,不然以后還是會(huì)被坑的。
  從環(huán)境來(lái)看,數(shù)據(jù)庫(kù)不能直接登錄,沒(méi)法直接導(dǎo)出。不過(guò)可以由運(yùn)維提供key通過(guò)ssh登錄到遠(yuǎn)程服務(wù)器再將數(shù)據(jù)導(dǎo)出到本地。
  先配置ssh通過(guò)key登錄服務(wù)器。這里略過(guò)...

  然后就是通過(guò)ssh執(zhí)行命令。先看一下ssh的幫助文檔:

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]      [-D [bind_address:]port] [-E log_file] [-e escape_char]      [-F configfile] [-I pkcs11] [-i identity_file]      [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]      [-O ctl_cmd] [-o option] [-p port]      [-Q cipher | cipher-auth | mac | kex | key]      [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]      [-w local_tun[:remote_tun]] [user@]hostname [command]

最后一項(xiàng)就是執(zhí)行指令的。假如遠(yuǎn)程服務(wù)器地址為180.97.33.108,開(kāi)啟的ssh端口為998,ssh用戶名為xzc,然后想通過(guò)在遠(yuǎn)程服務(wù)器上執(zhí)行命令ls,那么腳本應(yīng)該這么寫(xiě):

復(fù)制代碼 代碼如下:

ssh xzc@180.97.33.108 -p 998 "ls"

如果ssh的認(rèn)證key已配置好,那么會(huì)把登錄后當(dāng)前目錄下的文件列出來(lái),當(dāng)然第一次登錄會(huì)提示保存遠(yuǎn)程服務(wù)器的指紋。現(xiàn)在是要導(dǎo)出數(shù)據(jù)庫(kù)的數(shù)據(jù),那么需要把ls命令換成導(dǎo)出數(shù)據(jù)庫(kù)的命令。

復(fù)制代碼 代碼如下:

echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd
#或者
mysql xzc_db -uxzc -pxzcpwd -e "select * from user"

上面兩命令都可以使用數(shù)據(jù)庫(kù)用戶xzc,密碼xzcpwd從數(shù)據(jù)庫(kù)xzc_db打印出user表,使用的是默認(rèn)的本地?cái)?shù)據(jù)庫(kù)地址localhost,默認(rèn)的端口。如果不是默認(rèn),需要指定。

   登錄OK了,打印也OK了,那么下一步就是導(dǎo)出到文件了。這在bash也就是一個(gè) > 的事。把上面的命令拼起來(lái)就是:

復(fù)制代碼 代碼如下:

ssh xzc@180.97.33.108 -p 998 'echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd' > user.txt

這樣就把user表導(dǎo)出來(lái)本地的user.txt中了。注意"> user.txt"如果放到 ''里則是在遠(yuǎn)程服務(wù)器執(zhí)行,導(dǎo)出的文件在遠(yuǎn)程服務(wù)器。文件現(xiàn)在也有了,不過(guò)是txt,這樣交給運(yùn)營(yíng)不太好吧。那就導(dǎo)出excel吧。不過(guò)遺憾的是我查了N多資料,也找不到mysql不依賴(lài)第三方插件或工具導(dǎo)出原生excel的方法。而navicat導(dǎo)出的可是貨真價(jià)實(shí)的excel,如果用notepad++之類(lèi)的文本工具打開(kāi)是會(huì)亂碼的,并且導(dǎo)出的文件不會(huì)有編碼問(wèn)題。幸好如果一個(gè)txt以tab分割的話,excel也是能認(rèn)得出來(lái)的。于是把user.txt改名user.xls就可以了。但這樣做的問(wèn)題是excel會(huì)按自己的方式處理內(nèi)容的。比如把一個(gè)很大的數(shù)字轉(zhuǎn)換成科學(xué)記數(shù)法形式。這些都得手動(dòng)去處理一下了。

  最后,就是寫(xiě)成腳本批量操作了。附上我使用的腳本一個(gè):

#!/bin/bash# 通過(guò)ssh遠(yuǎn)程執(zhí)行遠(yuǎn)程指令# 需要先部署key認(rèn)證,保證ssh只需要ip、port即可連接# 如果需要和遠(yuǎn)程服務(wù)器交互,請(qǐng)參考ssh的-t、-tt參數(shù)# 如果需要反復(fù)登錄服務(wù)器執(zhí)行多條指令,請(qǐng)使用ssh的通道重用# 參考:http://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing# 使用通道需要注意退出通道,如"ssh github.com -O exit"或者"ssh github.com -O stop"#                       --by coding my life#分別設(shè)置ssh用戶名、數(shù)據(jù)庫(kù)用戶名、數(shù)據(jù)庫(kù)密碼、導(dǎo)出數(shù)據(jù)SSH_USER='xzc_ssh'DB_USER='xzc_db'DB_PWD='xzc_db_pwd123'EXP_PATH=export_data/# 執(zhí)行遠(yuǎn)程命令# $1 服務(wù)器ip# $2 ssh端口# $3 指令function exec_remote_command(){  ssh $SSH_USER@$1 -p $2 '$3'}# 執(zhí)行遠(yuǎn)程sql,導(dǎo)出數(shù)據(jù)# $1 服務(wù)器ip# $2 ssh端口# $3 指令,多個(gè)sql指令如select * from user;select * from bag;也可執(zhí)行,但結(jié)果將會(huì)寫(xiě)到同一個(gè)文件# s4 服務(wù)器# $5 導(dǎo)出文件function export_remote_sql(){  echo export from $4 ...  cmd="echo /"$3/" | mysql $4 -u$DB_USER -p$DB_PWD --default-character-set=utf8"  ssh $SSH_USER@$1 -p $2 "$cmd" > $EXP_PATH$4_$5  #如果要導(dǎo)出到遠(yuǎn)程服務(wù)器,將把 > $EXP_PATH$4_$5放到cmd中}# $1 區(qū)服名# $2 ip# $3 端口function exec_sqls(){  cat SQLS | while read sql ; do      fc=${sql:0:1}    if [ "#" == "$fc" ]; then  #被注釋的不處理      continue    fi    #sql語(yǔ)句中包含空格,不能再以空格來(lái)區(qū)分。最后一個(gè)空格后的是導(dǎo)出的文件名    exp_file="${sql##* }"        #兩個(gè)#表示正則以最大長(zhǎng)度匹配*和一個(gè)空格(*后面的空格),截取余下的賦值給exp_file    sql_cmd="${sql%% $exp_file}"     #兩個(gè)%表示從右至左刪除%%以后的內(nèi)容        export_remote_sql $2 $3 "$sql_cmd" $1 "$exp_file"  done}# 需要在當(dāng)前目錄下創(chuàng)建服務(wù)器列表文件SERVERS,格式為"數(shù)據(jù)庫(kù)名 ip ssh端口",如"xzc_game_s99 127.0.0.1 22"# 需要在當(dāng)前目錄下創(chuàng)建sql命令列表文件SQLS,格式為"sql語(yǔ)句 導(dǎo)出的文件",如"select * from user; user.xls"# 多個(gè)sql請(qǐng)注意用;分開(kāi),sql必須以;結(jié)束# 文件名中不能包含空格,最終導(dǎo)出的文件為"數(shù)據(jù)庫(kù)名_文件名",如"xzc_game_s99_user.xls"mkdir -p $EXP_PATHcat 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 $portdone

當(dāng)前目錄下的文件如下,其中SERVERS是服務(wù)器列表,里面指定數(shù)據(jù)庫(kù)名,ip,ss端口,SQLS則指定sql指令及導(dǎo)出的文件名。這兩個(gè)文件里以#開(kāi)頭的都不會(huì)處理:

xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ lsremote_cmd.sh SERVERS SQLSxzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ cat SERVERS xzc_game_s99 120.0.0.99 6162xzc_game_s91 120.0.0.91 6162xzc_game_s92 120.0.0.92 6162xzc_game_s93 120.0.0.93 6162xzc_game_s94 120.0.0.94 6162#xzc_game_s91 120.0.0.91 6162xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ cat SQLS #select * money from money; money.xlsselect * from user; user.xlsxzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$

到這里,腳本基本完成了要求。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 宝清县| 龙泉市| 额济纳旗| 温州市| 九龙城区| 镇江市| 五台县| 大宁县| 手机| 云和县| 金昌市| 葫芦岛市| 杂多县| 墨江| 南投市| 东明县| 长寿区| 博客| 陆良县| 什邡市| 若尔盖县| 阿拉尔市| 富顺县| 江源县| 安陆市| 龙岩市| 合阳县| 鄱阳县| 共和县| 塘沽区| 旌德县| 阆中市| 怀柔区| 同江市| 休宁县| 黄浦区| 涞水县| 石首市| 万全县| 雅江县| 汪清县|