링크 ux 에서 ssh 원 격 실행 명령 을 사용 하여 데이터 베 이 스 를 로 컬 로 일괄 내 보 냅 니 다.

그저께 전단 의 동료 와 기능 을 테스트 하고 있 었 다.서버 가 켜 져 있 습 니 다.아 날로 그 유저 가 로그 인 하면 카운트다운 을 합 니 다.이때 갑자기 운영 하 는 동료 가 달 려 와 서 몇 명의 서버 게이머 들 의 상황 을 통계 해 야 한다 고 말 했다.즉,몇 개의 서버 데이터 베이스 에서 일부 게이머 들 의 데 이 터 를 내 보 내야 한 다 는 것 이다.네,시간 을 좀 봤 어 요.11 시 47 분 이에 요.프론트 와 테스트 를 마치 고 밥 을 먹고 점심 을 쉬 면 오후 에 드 리 겠 습 니 다."데이터 베 이 스 를 만 드 는 거 야.이렇게 오래 걸 려?"그것 도 내 상사 한테 직접 얘 기 했 어.내 가 찰 칵,그래,내 가 안내 할 게.문 제 는 평소 통 계 는 phop 에서 만 들 었 고 대량 배 치 는 운영 에 의 해 이 루어 졌 다 는 점 이다.서버 에 대응 하 는 도구 가 전혀 없습니다.그리고 서버 는 아 리 클 라 우 드 에 있 습 니 다.데이터베이스 사용 자 는 ip 세그먼트 로그 인 을 제한 하고 제 가 있 는 ip 은 로그 인 할 수 없습니다.그래서 디 버 깅 을 중지 하고 ip 을 자 르 고 sql 을 쓴 다음 에 navicat 로 수 동 으로 한 서버 씩 엑셀 로 데 이 터 를 내 보 낼 수 밖 에 없 었 습 니 다.
사후에 생각해 보 니 대본 을 쓰 는 것 이 좋 겠 다.그렇지 않 으 면 앞으로 도 함정 에 빠 질 것 이다.
환경 적 으로 데이터 베 이 스 는 직접 로그 인 할 수 없고 직접 내 보 낼 수 없습니다.그러나 운영 차원 에서 key 를 제공 하여 ssh 를 통 해 원 격 서버 에 로그 인하 여 데 이 터 를 로 컬 로 내 보 낼 수 있 습 니 다.
먼저 ssh 를 키 를 통 해 서버 에 로그 인 하도록 설정 합 니 다.여기 생략...
그리고 ssh 를 통 해 명령 을 수행 합 니 다.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]
마지막 하 나 는 명령 을 집행 하 는 것 이다.원 격 서버 주소 가 180.97.33.108 이 고 ssh 포트 가 998 이 며 ssh 사용자 이름 이 xzc 이 며 원 격 서버 에서 명령 ls 를 실행 하려 면 스 크 립 트 는 이렇게 써 야 합 니 다.

ssh [email protected] -p 998 "ls"
ssh 인증 키 가 설정 되 어 있 으 면 로그 인 후 현재 디 렉 터 리 에 있 는 파일 을 열거 합 니 다.물론 첫 번 째 로그 인 은 원 격 서버 의 지문 을 저장 하 는 것 을 알려 줍 니 다.데이터 베 이 스 를 내 보 내 려 면 ls 명령 을 데이터 베 이 스 를 내 보 내 는 명령 으로 바 꿔 야 합 니 다.

echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd
#
mysql xzc_db -uxzc -pxzcpwd -e "select * from user"
위의 두 명령 은 모두 데이터베이스 사용자 xzc,비밀번호 xzcpwd 를 사용 하여 데이터베이스 xzcdb 는 user 표를 출력 합 니 다.기본 로 컬 데이터베이스 주소 localhost,기본 포트 를 사용 합 니 다.기본 값 이 아니라면 지정 이 필요 합 니 다.
로그 인 OK,인쇄 도 OK,그러면 다음 단 계 는 파일 로 내 보 내 는 것 입 니 다.이것 은 bash 에서 바로 하나>의 일이 다.위의 명령 을 합치 면:

ssh [email protected] -p 998 'echo "select * from user;" | mysql xzc_db -uxzc -pxzcpwd' > user.txt
이렇게 하면 user 시 계 를 로 컬 user.txt 에 가 져 옵 니 다.">user.txt"를'에 넣 으 면 원 격 서버 에서 실 행 됩 니 다.내 보 낸 파일 은 원 격 서버 에 있 습 니 다.파일 도 이제 있 습 니 다.txt 에 불과 합 니 다.이렇게 운영 에 맡 기 는 것 은 좋 지 않 습 니 다.그럼 엑셀 내 보 내.그러나 안 타 깝 게 도 저 는 N 다 중 자 료 를 찾 았 고 my sql 은 제3자 플러그 인 이나 도구 에 의존 하지 않 고 원생 엑셀 을 내 보 내 는 방법 을 찾 지 못 했 습 니 다.navicat 에서 내 보 낸 것 은 진짜 엑셀 입 니 다.notepad+와 같은 텍스트 도구 로 열 면 어 지 럽 고 내 보 낸 파일 은 인 코딩 에 문제 가 없 을 것 입 니 다.다행히 txt 가 tab 로 분할 되면 엑셀 도 알 아 볼 수 있 을 것 이다.그래서 user.txt 를 user.xls 로 바 꾸 면 됩 니 다.그러나 이렇게 하 는 문 제 는 엑셀 이 자신의 방식 대로 내용 을 처리 하 는 것 이다.예 를 들 어 아주 큰 숫자 를 과학 기수법 형식 으로 바 꾸 는 것 이다.이것들 은 모두 수 동 으로 처리 해 야 한다.
마지막 으로 스 크 립 트 로 대량 작업 을 했 습 니 다.내 가 사용 하 는 스 크 립 트 하 나 를 추가 합 니 다:

#!/bin/bash

#   ssh        
#      key  ,  ssh   ip、port    
#             ,   ssh -t、-tt  
#                  ,   ssh     
#   :http://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing
#             , "ssh github.com -O exit"  "ssh github.com -O stop"
#                       --by coding my life

#    ssh   、      、     、    
SSH_USER='xzc_ssh'
DB_USER='xzc_db'
DB_PWD='xzc_db_pwd123'
EXP_PATH=export_data/

#       
# $1    ip
# $2 ssh  
# $3   
function exec_remote_command()
{
  ssh $SSH_USER@$1 -p $2 '$3'
}

#     sql,    
# $1    ip
# $2 ssh  
# $3   ,  sql   select * from user;select * from bag;    ,            
# s4    
# $5     
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  #           ,   > $EXP_PATH$4_$5  cmd 
}

# $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  ", "xzc_game_s99 127.0.0.1 22"
#           sql      SQLS,   "sql        ", "select * from user; user.xls"
#   sql    ;  ,sql   ;  
#           ,        "    _   ", "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
현재 디 렉 터 리 에 있 는 파일 은 다음 과 같 습 니 다.그 중에서 SERVERS 는 서버 목록 입 니 다.데이터베이스 이름,ip,ss 포트,SQLS 는 sql 명령 과 내 보 낼 파일 이름 을 지정 합 니 다.이 두 파일 에 서 는\#로 시작 하 는 것 을 처리 하지 않 습 니 다.

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$
여기까지 스 크 립 트 는 기본적으로 요 구 를 완성 했다.

좋은 웹페이지 즐겨찾기