[ SHELL編程 ] 遠程服務器傳輸文件


  在shell編程中經常需要獲取遠程服務器文件。手工操作中使用scp命令完成。為避免腳本執行scp輸入密碼進行交互,需先建立本機服務器當前用戶和遠程服務器指定用戶的信任關系。具體代碼見操作實例,重點關注getRemoteServerFile()函數,編程中可單獨提取使用。

基礎知識

  1、scp,用於遠程文件拷貝

#本地文件或目錄上傳到遠程服務器,文件和目錄用絕對路徑
scp local_file remote_username@remote_ip:remote_dir
scp local_file remote_username@remote_ip:remote_file
scp -r local_dir remote_username@remote_ip:remote_dir
  
#遠程服務器文件或目錄下載到本地,文件和目錄用絕對路徑
scp remote_username@remote_ip:remote_file local_dir 
scp remote_username@remote_ip:remote_file local_file 
scp -r remote_username@remote_ip:remote_dir local_dir 

其他常用參數介紹:
-B  使用批處理模式,可用於判斷兩個服務器間是否已建立信任關系   
-p 保留原文件的修改時間,訪問時間和訪問權限。  
-q  不顯示傳輸進度條。  
-r  遞歸復制整個目錄。  
-v 詳細方式顯示輸出。scp和ssh(1)會顯示出整個過程的調試信息。這些信息用於調試連接,驗證和配置問題。

  2、ssh遠程執行命令。特別注意,執行命令建議用絕對路徑,如路徑中涉及環境變量,建議重新source環境配置文件。

ssh remote_username@remote_ip 'command'  #不指定關口,默認22
ssh -p $port remote_username@remote_ip 'command' #指定端口

  3、md5sum,用來計算和校驗文件報文摘要的工具程序,確保文件傳輸完整性。

md5sum filename

  4、stat,獲取文件的狀態信息。可以通過比較源文件和目標文件大小一致性驗證傳輸完整性。

stat -c %s filename

設計思路

  1、利用createSSH腳本創建兩個服務器間的信任關系,createSSH腳本來自創建SSH信任關系。這一步驟在代碼中未體現。

  2、利用scp命令進行傳輸文件;

  3、利用md5sum命令判斷下載文件的完整性。如果一致,判定下載成功,否則,為失敗。

使用方法

  1、使用創建SSH信任關系腳本完成與遠程服務器信任關系的創建,也可以在腳本中添加調用createSSH。

  2、將下面代碼拷貝放入Linux服務器上getRemoteServerFile.sh文件,並賦可執行權限。

  3、執行./getRemoteServerFile.sh 用戶名 用戶IP 待下載文件絕對路徑 本地保存目錄

代碼如下:

 

#!/bin/bash

#*************************************************
#*** Author      : lion
#*** Create Date : 2017/10/12
#*** Modify Date : NA
#*** Function    : get file from remote server
#*************************************************

function getRemoteServerFile()
{
  if [ $# -ne 5 ];then
    printf "Call the function of getRemoteServerFile fail.\n"
    return 1
  fi
  
  local remote_server_ip=$1
  local remote_username=$2
  local remote_file_abspath=$3
  local local_download_directory=$4
  local filename=$(basename ${remote_file_abspath})
  
  #check file exist or not
  ssh ${remote_username}@${remote_server_ip} "ls ${remote_file_abspath}" &>/dev/null
  [ $? -ne 0 ] && return 1
  source_md5sum_value_temp=$(ssh ${remote_username}@${remote_server_ip} "md5sum ${remote_file_abspath}")
  source_md5sum_value=$(echo ${source_md5sum_value_temp} | awk '{print $1}')
  scp ${remote_username}@${remote_server_ip}:${remote_file_abspath} ${local_download_directory}
  dest_md5sum_value=$(md5sum ${local_download_directory}/${filename} | awk '{print $1}')
  
  [ ${source_md5sum_value} == ${dest_md5sum_value} ] && return 0 || return 1 
}

##main

if [ $# -ne 1 ];then
  printf "Usage:$(basename $0) remote_server_ip remote_username remote_file_abspath local_download_directory\n"
  exit 1
fi

remote_server_ip=$1
remote_username=$2
remote_file_abspath=$3
local_download_directory=$4
[ $? -ne 0 ] && exit 1
getRemoteServerFile ${remote_server_ip} ${remote_username} ${remote_file_abspath} ${local_download_directory}
if [ $? -eq 0 ];then
  printf "Download file success.\n"
  exit 0
else
  printf "Download file fail.\n"
  exit 1
fi

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM