亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2015年04月03日 23:40:37   投稿:mdxy-dxy  
這篇文章主要介紹了linux下使用ssh遠程執(zhí)行命令批量導(dǎo)出數(shù)據(jù)庫到本地,需要的朋友可以參考下

前天正在跟前端的同事調(diào)試功能。服務(wù)器開好,模擬的玩家登錄好,就在倒計時。這時突然運營的同事跑過來說要統(tǒng)計幾個服務(wù)器玩家的一些情況,也就是需要從幾個服的數(shù)據(jù)庫導(dǎo)出部分玩家的數(shù)據(jù)。好吧,我看了一下時間,11:47。心想,跟前端調(diào)試完,去吃個飯再午休一下那就下午再給吧。沒想對方來一句"就導(dǎo)個數(shù)據(jù)庫而已,要這么久么?",而且還是直接跟我上司說的。我嚓,好吧,我導(dǎo)??蓡栴}來了,平時的統(tǒng)計是由php做的,批量部署這些是由運維做的。服務(wù)端完全沒有對應(yīng)的工具。而且服務(wù)器是在阿里云上的,數(shù)據(jù)庫的用戶是限制了ip段登錄的,我所在的ip沒法登錄的。于是,只好終止調(diào)試,切ip,寫sql,然后用navicat手動一個個服務(wù)器導(dǎo)出數(shù)據(jù)到excel。

  事后想想,還是寫個腳本吧,不然以后還是會被坑的。
  從環(huán)境來看,數(shù)據(jù)庫不能直接登錄,沒法直接導(dǎo)出。不過可以由運維提供key通過ssh登錄到遠程服務(wù)器再將數(shù)據(jù)導(dǎo)出到本地。
  先配置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]

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

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

ssh xzc@180.97.33.108 -p 998 "ls"

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

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

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)的本地數(shù)據(jù)庫地址localhost,默認(rèn)的端口。如果不是默認(rèn),需要指定。

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

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

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

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

#!/bin/bash

# 通過ssh遠程執(zhí)行遠程指令
# 需要先部署key認(rèn)證,保證ssh只需要ip、port即可連接
# 如果需要和遠程服務(wù)器交互,請參考ssh的-t、-tt參數(shù)
# 如果需要反復(fù)登錄服務(wù)器執(zhí)行多條指令,請使用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í)行遠程命令
# $1 服務(wù)器ip
# $2 ssh端口
# $3 指令
function exec_remote_command()
{
  ssh $SSH_USER@$1 -p $2 '$3'
}

# 執(zhí)行遠程sql,導(dǎo)出數(shù)據(jù)
# $1 服務(wù)器ip
# $2 ssh端口
# $3 指令,多個sql指令如select * from user;select * from bag;也可執(zhí)行,但結(jié)果將會寫到同一個文件
# 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)出到遠程服務(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ū)分。最后一個空格后的是導(dǎo)出的文件名
    exp_file="${sql##* }"        #兩個#表示正則以最大長度匹配*和一個空格(*后面的空格),截取余下的賦值給exp_file
    sql_cmd="${sql%% $exp_file}"     #兩個%表示從右至左刪除%%以后的內(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"
# 多個sql請注意用;分開,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)出的文件名。這兩個文件里以#開頭的都不會處理:

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)文章

  • Shell expr命令進行整數(shù)計算的實現(xiàn)

    Shell expr命令進行整數(shù)計算的實現(xiàn)

    這篇文章主要介紹了Shell expr命令進行整數(shù)計算的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • shell 創(chuàng)建子進程及并行延時執(zhí)行命令方法

    shell 創(chuàng)建子進程及并行延時執(zhí)行命令方法

    本文主要介紹了shell 創(chuàng)建子進程及并行延時執(zhí)行命令方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Linux shell中的printf的詳細用法

    Linux shell中的printf的詳細用法

    這篇文章主要介紹了Linux shell中的printf的詳細用法的相關(guān)資料,希望能通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • shell腳本實現(xiàn)輸入密碼顯示星號

    shell腳本實現(xiàn)輸入密碼顯示星號

    本文給大家分享使用shell腳本實現(xiàn)輸入密碼顯示星號的腳本寫法,在文章末尾給大家補充了shell輸入密碼時關(guān)閉屏幕回顯的實現(xiàn)方法,需要的朋友參考下吧
    2017-01-01
  • Shell中統(tǒng)計字符串中單詞的個數(shù)的幾種方法

    Shell中統(tǒng)計字符串中單詞的個數(shù)的幾種方法

    今天小編就為大家分享一篇關(guān)于Shell中統(tǒng)計字符串中單詞的個數(shù)的幾種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • shell子進程多任務(wù)實現(xiàn)進程高并發(fā)

    shell子進程多任務(wù)實現(xiàn)進程高并發(fā)

    本文主要介紹了shell子進程多任務(wù)實現(xiàn)進程高并發(fā),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • shell腳本中執(zhí)行時提示“沒有那個文件或目錄”的解決辦法

    shell腳本中執(zhí)行時提示“沒有那個文件或目錄”的解決辦法

    故障現(xiàn)象:在終端直接cd /var正常,在shell腳本中執(zhí)行則報錯。原因是腳本是在windows平臺下寫的,換行符與linux不同,造成腳本不能正確執(zhí)行
    2014-04-04
  • 詳解 linux mysqldump 導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)、表結(jié)構(gòu)

    詳解 linux mysqldump 導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)、表結(jié)構(gòu)

    這篇文章主要介紹了詳解 linux mysqldump 導(dǎo)出數(shù)據(jù)庫、數(shù)據(jù)、表結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 在Linux與Windows上獲取當(dāng)前堆棧信息的方法

    在Linux與Windows上獲取當(dāng)前堆棧信息的方法

    下面小編就為大家?guī)硪黄贚inux與Windows上獲取當(dāng)前堆棧信息的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Linux shell命令幫助格式詳解

    Linux shell命令幫助格式詳解

    最近看了一個教程,關(guān)于Linux命令的,本來以為當(dāng)是復(fù)習(xí)隨便看看的,結(jié)果看了不禁汗顏,這個真挺有學(xué)問的,很多東西都是我還不知道的,故此做總結(jié)。下面這篇文章主要介紹了Linux shell命令幫助格式的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-01-01

最新評論