zoukankan      html  css  js  c++  java
  • [ 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.
    "
        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
    "
      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.
    "
      exit 0
    else
      printf "Download file fail.
    "
      exit 1
    fi
  • 相关阅读:
    ADO.NET操作PostgreSQL:数据库操作类(未封装)
    ADO.NET操作SQL Server:数据库操作类(已封装)
    ADO.NET操作SQL Server:数据库操作类(未封装)
    h5微信支付
    css3的transform:tanslateZ没有效果
    判断页面是否被嵌入iframe里面
    vue项目的环境变量
    iOS下调用元素的focus方法,input元素不聚焦,键盘不弹起的问题
    关于common.js里面的module.exports与es6的export default的思考总结
    Vue2.4.0 新增的inheritAttrs,attrs
  • 原文地址:https://www.cnblogs.com/linyfeng/p/7658547.html
Copyright © 2011-2022 走看看