您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何實(shí)現(xiàn)linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫到本地”,在日常操作中,相信很多人在如何實(shí)現(xiàn)linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫到本地問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何實(shí)現(xiàn)linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫到本地”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
先配置ssh通過key登錄服務(wù)器。
然后就是通過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,開啟的ssh端口為998,ssh用戶名為xzc,然后想通過在遠(yuǎn)程服務(wù)器上執(zhí)行命令ls,那么腳本應(yīng)該這么寫:
代碼如下:
ssh xzc@180.97.33.108 -p 998 "ls"
如果ssh的認(rèn)證key已配置好,那么會(huì)把登錄后當(dāng)前目錄下的文件列出來,當(dāng)然第一次登錄會(huì)提示保存遠(yuǎn)程服務(wù)器的指紋。現(xiàn)在是要導(dǎo)出數(shù)據(jù)庫的數(shù)據(jù),那么需要把ls命令換成導(dǎo)出數(shù)據(jù)庫的命令。
代碼如下:
echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd
#或者
mysql xzc_db -uxzc -pxzcpwd -e "select * from user"
上面兩命令都可以使用數(shù)據(jù)庫用戶xzc,密碼xzcpwd從數(shù)據(jù)庫xzc_db打印出user表,使用的是默認(rèn)的本地?cái)?shù)據(jù)庫地址localhost,默認(rèn)的端口。如果不是默認(rèn),需要指定。
登錄OK了,打印也OK了,那么下一步就是導(dǎo)出到文件了。這在bash也就是一個(gè) > 的事。把上面的命令拼起來就是:
代碼如下:
ssh xzc@180.97.33.108 -p 998 'echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd' > user.txt
這樣就把user表導(dǎo)出來本地的user.txt中了。注意"> user.txt"如果放到 ''里則是在遠(yuǎn)程服務(wù)器執(zhí)行,導(dǎo)出的文件在遠(yuǎn)程服務(wù)器。文件現(xiàn)在也有了,不過是txt,這樣交給運(yùn)營(yíng)不太好吧。那就導(dǎo)出excel吧。不過遺憾的是我查了N多資料,也找不到mysql不依賴第三方插件或工具導(dǎo)出原生excel的方法。而navicat導(dǎo)出的可是貨真價(jià)實(shí)的excel,如果用notepad++之類的文本工具打開是會(huì)亂碼的,并且導(dǎo)出的文件不會(huì)有編碼問題。幸好如果一個(gè)txt以tab分割的話,excel也是能認(rèn)得出來的。于是把user.txt改名user.xls就可以了。但這樣做的問題是excel會(huì)按自己的方式處理內(nèi)容的。比如把一個(gè)很大的數(shù)字轉(zhuǎn)換成科學(xué)記數(shù)法形式。這些都得手動(dòng)去處理一下了。
最后,就是寫成腳本批量操作了。附上我使用的腳本一個(gè):
#!/bin/bash # 通過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ù)庫用戶名、數(shù)據(jù)庫密碼、導(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ì)寫到同一個(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語句中包含空格,不能再以空格來區(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ù)庫名 ip ssh端口",如"xzc_game_s99 127.0.0.1 22" # 需要在當(dāng)前目錄下創(chuàng)建sql命令列表文件SQLS,格式為"sql語句 導(dǎo)出的文件",如"select * from user; user.xls" # 多個(gè)sql請(qǐng)注意用;分開,sql必須以;結(jié)束 # 文件名中不能包含空格,最終導(dǎo)出的文件為"數(shù)據(jù)庫名_文件名",如"xzc_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
當(dāng)前目錄下的文件如下,其中SERVERS是服務(wù)器列表,里面指定數(shù)據(jù)庫名,ip,ss端口,SQLS則指定sql指令及導(dǎo)出的文件名。這兩個(gè)文件里以#開頭的都不會(huì)處理:
xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ ls remote_cmd.sh SERVERS SQLS xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ cat SERVERS xzc_game_s99 120.0.0.99 6162 xzc_game_s91 120.0.0.91 6162 xzc_game_s92 120.0.0.92 6162 xzc_game_s93 120.0.0.93 6162 xzc_game_s94 120.0.0.94 6162 #xzc_game_s91 120.0.0.91 6162 xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$ cat SQLS #select * money from money; money.xls select * from user; user.xls xzc@xzc-HP-ProBook-4446s:~/桌面/remote_cmd$
到此,關(guān)于“如何實(shí)現(xiàn)linux下使用ssh遠(yuǎn)程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫到本地”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。