[ 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义