在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