在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()会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

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 : //
#*** Modify Date : NA
#*** Function : get file from remote server
#************************************************* function getRemoteServerFile()
{
if [ $# -ne ];then
printf "Call the function of getRemoteServerFile fail.\n"
return
fi local remote_server_ip=$
local remote_username=$
local remote_file_abspath=$
local local_download_directory=$
local filename=$(basename ${remote_file_abspath}) #check file exist or not
ssh ${remote_username}@${remote_server_ip} "ls ${remote_file_abspath}" &>/dev/null
[ $? -ne ] && return
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 || return
} ##main if [ $# -ne ];then
printf "Usage:$(basename $0) remote_server_ip remote_username remote_file_abspath local_download_directory\n"
exit
fi remote_server_ip=$
remote_username=$
remote_file_abspath=$
local_download_directory=$
[ $? -ne ] && exit
getRemoteServerFile ${remote_server_ip} ${remote_username} ${remote_file_abspath} ${local_download_directory}
if [ $? -eq ];then
printf "Download file success.\n"
exit
else
printf "Download file fail.\n"
exit
fi

[ SHELL编程 ] 远程服务器传输文件的更多相关文章

  1. shell实践(一)---判断远程服务器中文件是否存在

    1.判断一个文件的常见形式为 if [ -f filename ]  #此处有-e和-f的区别 注意: 1)中括号之间的空格: 2)filename最好是绝对路径,在判断远程服务器中文件是否存在时尤为 ...

  2. Android网络编程只局域网传输文件

    Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...

  3. win7系统远程连接其它计算机,并且向远程机传输文件

    首先,打开开始菜单,在程序自带的 “附件“ 中找到 "远程桌面连接"并打开,出现远程桌面对话框: 其次,在对话框左下角点击“选项”,选择“本地资源对话框”,在本地设备和资源下点击“ ...

  4. 【实操日记】使用 PyQt5 设计下载远程服务器日志文件程序

    最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享. PyQt5 是一套 Python 绑定 Digia Qt5 应用的框架,是最强大的 GUI ...

  5. Windows操作系统远程Linux服务器传输文件方法(以EasyDSS云平台、EasyNVR上传部署为例)

    本文转自博客:https://blog.csdn.net/black_3717/article/details/79769406 问题背景: 之前给客户部署我们一款EasyDSS云平台(配合EasyN ...

  6. mac 使用命令行,对远程服务器进行文件更新

    目的:更新服务器文件A 1.远程传输文件 A.zip 在本地A文件的父级文件夹下执行 scp ./A.zip 远程服务器用户名@远程服务器IP:/要放置的文件夹目录/ 然后要输入服务器登陆密码,进行文 ...

  7. Ubuntu 16.04 安装ftp服务器传输文件

    最近在搞深度学习,老师比较宝贝他的服务器,要求我以后负责管理服务器.往后所有要使用服务器的人都必须向我申请账号,然后只允许客户端访问,使用文件传输软件传输文件.像我这样一个linux菜逼,这种要求不是 ...

  8. 本机向windows服务器传输文件的三种方法

    闲来无事,在腾讯云上申请了一个免费的服务器,想将自己写的网页发布到服务器上,服务器的申请很简单,百度搜索 腾讯云 ,然后新人第一次注册能申请到免费一个月的云主机,虽然配置不怎么高,但是还是能用的,这是 ...

  9. [Linux] scp本地服务器和远程服务器拷贝文件

    上传本地文件到服务器scp 本地路径 用户名@远程服务器ip:远程路径 下载文件 scp 用户名@远程服务器ip:远程路径 本地路径-r 是上传下载本地目录到远程 远程文件

随机推荐

  1. mvc5总结(1)

    1.Global.asax 全局的启动项,初始化相关配置 2.路由,按照默认规定请求就行,没必要扩展太多 3.区域路由,当我们想命名相同的controller和action时,结合命名空间使用 pub ...

  2. JDK1.6 Java.lang.Null.Pointer.Exception

    先来看一下JDK1.6的API: NullPointerException (Java Platform SE 6) public class NullPointerException extends ...

  3. Mybatis 系列5-结合源码解析TypeHandler

    [Mybatis 系列10-结合源码解析mybatis 执行流程] [Mybatis 系列9-强大的动态sql 语句] [Mybatis 系列8-结合源码解析select.resultMap的用法] ...

  4. Centos 7: 改变docker的image存放目录

    1.创建新的数据目录 mkdir /data/docker 2.关闭docker进程 systemctl stop docker 3.修改配置文件/usr/lib/systemd/system/doc ...

  5. Kaptcha

    Kaptcha:google自动生成验证码组件 kaptcha的使用比较方便,只需添加jar包依赖之后简单地配置就可以使用了 kaptcha所有配置都可以通过web.xml来完成,如果你的项目中使用了 ...

  6. Spring MVC 类型转换

    SpringMVC类型转换: 1 日期类型转换: private Date birthday; <label for="">生日:<input type=&quo ...

  7. Java - 32 Java 多线程编程

    Java 多线程编程 Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别 ...

  8. Java - 25 Java 包(package)

    Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...

  9. oracle查看和替换含不可见字符(空白)

    select lengthb('1397256'), dump('1397256') from dual; select ascii('') from dual; ), '') from dua ...

  10. Python中的线程和进程

    引入进程和线程的概念及区别 threading模块提供的类:   Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, l ...