跨网络拷贝文件的简单实践

在实际的项目中可能要访问生产环境是需要各种安全验证和设置的,毕竟客户的数据是最宝贵的资源。一般来说,客户会把一部分访问的权限开放出来。这样在系统出现问题的时候,能够更快更高效的处理问题。

下面是一个简单的图表,能够说明一下其中一个项目的网络访问情况。
右边的绿色区域是公司内部的环境,其中生产问题复现环境的权限较高,这个权限只会分配给部分的人,而开发测试环境是公开环境,开发测试人员都可以访问。
左边的区域是现场环境,生产环境包括现网环境和容灾切换环境,这个是根据需求可以切换的。同时现场测试环境是客户开发给我们的一个访问环境,我们可以通过公司的网络直接访问到现场的测试环境,然后通过现场测试环境来逐步的切换,直到连接到生产环境。

在系统升级和业务问题较多的时候,会尝试从生产环境中抽取很小的一部分数据,把数据以dump的形式拷贝到公司内部环境中的生产问题复现环境中。这样可以并行的排查很多不同的问题。
在问题比较多的时候,总是会收到比较多的邮件请求来拷贝dump文件,其实明白了原理无非就是通过scp/sftp等形式把文件一步一步的拷贝。做多了就感觉是体力活了。而且如果大半夜出现紧急问题,需要排查,需要拷贝文件的时候自己虽然比较忙乎,但是这种拷贝文件的工作还是比较苦闷的。

自己下决心来改进一下。    
首先是访问生产环境的权限,我们申请了一个只读用户,只有权限可以访问到一个指定的目录。这样这个账户就可以开放给开发测试人员,不至于出现一些人为操作,他们只能够从生产指定的目录下拷贝文件到现场测试环境。
没法修改任何文件。从某种程度上就杜绝了一些潜在的问题。
其次是现场测试环境和公司内部环境之间的访问是单向的,意思就是只能通过公司内部网络来连接现场测试环境,不能够通过现场测试环境来连接公司内部环境。这样的话,如果要把文件从现场测试环境拷贝到生产问题复现环境的话,使用scp的时候就会有问题。因为生产问题复现环境是不能随便开放给开发测试人员的。所以考虑设置开发测试环境和生产问题复现环境是单向访问。开发测试环境和现场测试环境之间是单向访问。
按照这个思路一个dump文件要从生产环境拷贝的流程就是
生产环境->现场测试环境->开发测试环境->生产问题复现环境  整个流程都是单向的,需要配置单向的信任关系。这样就可以使用shell脚本来动态的实现了。

-->通过开发测试环境来获取现场测试环境的文件
这个部分是关键环节。可以在开发测试环境中使用下面的形式来调用
scp xxxx@现场测试环境:xxxxxx  .
我写了如下的脚本来做了进一步的校验。
check_file_valid=`ssh xxxxx@10.196.28.xx "ksh check_file.sh ~/copyban_dump_copy/$1"`
file_not_exist_code=`echo $check_file_valid |grep WARNING|wc -l`
#echo $file_not_exist_code
if [[ $file_not_exist_code -eq 1 ]]
then
  echo 'WARNING- source file doesnt exist,please check and try again!'
else
  scp xxxx1@现场测试环境:~/dump_copy/$1 .
  scp $1 xxxxx2@生产问题复现环境:~/dump_copy
fi

对应的脚本check_file.sh也需要拷贝到现场测试环境中
if [ -f $1 ]
then
 echo 'file '$1'  exists!'
else
 echo 'WARNING -file '$1 ' doesnt  exist!'
fi

这样的话,我如果输入的文件不存在或者名字不正确。就会先做校验。
$ ksh scpuat.sh aaa
WARNING- source file doesnt exist,please check and try again!

如果文件存在,就开始把文件先拷贝到开发测试环境中,然后拷贝到生产问题复现环境中。
一个简单例子如下,文件在内网传输会快很多,之间基本没有多少的延迟。
$ ksh scpuat.sh test
test                                                                                                                                             100%   37     0.0KB/s   0.0KB/s   00:00
test                                                                                                                                             100%   37     0.0KB/s   0.0KB/s   00:00

关于单向信任关系的建立,可以使用ssh-keygen -t rsa来实现。
需要把id_rsa.pub的内容拷贝从开发测试环境中拷贝到生产问题复现环境中
然后在生产问题复现环境中把id_rsa.pub的内容追加到.ssh/authorized_keys中。
这样使用scp,ssh的时候就不用输入密码了。
总体来说,这种实现要方便一些。而且很大程度上把我的工作解放出来不少。

时间: 2024-09-20 07:50:56

跨网络拷贝文件的简单实践的相关文章

修复DBF数据表文件的简单方法

数据   修复DBF数据表文件的简单方法 如果你的软件提示"不是DATABASE 数据库"等意思说明你的数据库已经受损,需要进行修理.本人在实践中,摸索出几种可行的办法,以供大家参考,如有不正确之处或者其他更好的方法,希望不吝赐教:       方法1.如果你有DELPHI的Database DeskTop,修复DBF文件是一件非常容易的事,只要打开损坏的数据库(用Database DeskTop是可以打开损坏的DBF数据表的),修正损坏的记录,一般是最后几条记录,不能修正的损坏记录也

[20170220]快速拷贝文件在linux磁盘之间

[20170220]快速拷贝文件在linux磁盘之间.txt --上个星期五要将1.3T的文件(每个都很大)从1个磁盘移到另外的磁盘,测试发现cp 根本无法忍受.几乎要8个小时问题感觉出在文件系统 --的cache上,google看了一些连接: 1.首先cp慢的主要原因我感觉应该出现在文件系统缓存上,这个时候使用缓存没有必要,因为仅仅拷贝一次,使用缓存有点多余.   如果通过dstat观察可以发现如下,开始一段很好,读写可以达到200M,写入更快到400M.但是一般15秒上下就停滞下来.等待4x

u盘拷贝文件过大怎么解决 大文件无法复制到U盘怎么办?

u盘拷贝文件过大怎么解决  大文件无法复制到U盘怎么办   大文件无法复制到U盘怎么办?u盘拷贝文件过大解决办法 先来说说U盘无法复制大文件的原因: 一般来说,导致U盘无法拷贝大文件,一般是4GB以上的大文件,容易遇到"复制文件过大无法复制"的情况,而导致这种情况主要是U盘文件系统格式的问题. 一般U盘默认为FAT文件系统,它无法支持超过4GB以上的单个文件,而NTFS文件系统的限制最高可达2TB. 大文件无法复制到U盘的解决办法 找到原因后,解决起来就比较简单了,只有解除U盘复制文件

远程桌面不能拷贝文件的问题

我xp系统不能从远程桌面拷贝文件了,本地资源的剪切板和驱动器已经勾选.测试另外一个服务器可以远程拷贝.           网上说远程服务器的clipbook服务没有启动.服务是禁用的.无法启动 Clipbook服务.      错误1068:依存服务或组无法启动.      首先开启 Network DDE DSDM , 开启 Network DDE 开启 Clipbook.(ok 解决问题)      ---------------------------------------------

android-Android 从网络下载文件,使用MediaStore扫描mp3文件

问题描述 Android 从网络下载文件,使用MediaStore扫描mp3文件 是这样的,我做了一个简单的音乐播放器,其中使用了MediaStore获取手机里的mp3文件,并把mp3文件信息放到一个ListView中作为歌曲列表. 还有一个功能就是通过网络下载mp3文件.但是下载完成之后,歌曲列表里却不会显示新下载的歌曲信息,我必须把手机重启之后新下载的歌曲才会显示到歌曲列表里面. 我知道系统是自动存储了手机里所有的音乐文件信息,是不是新下载的歌曲没有被添加到它的数据库中呢?所以重启手机之后才

多线程和单线程拷贝文件那个效率高

问题描述 多线程和单线程拷贝文件那个效率高 单线程拷贝一个文件和多线程拷贝一个文件,那个效率更高,求大神写个例子证明一下. 解决方案 我菜,不会写,现在下载都是多线程的吧,看资源就知道.... 解决方案二: 拷贝文件的瓶颈在io,而不是cpu,多线程没有任何优势,而且对于机械硬盘,多个拷贝会导致寻道造成的性能损失.固态磁盘两者查不多. 解决方案三: 一提到多线程一般大家的第一感觉就是可以提升程序性能,在实际的操作中往往遇到性能的问题,都尝试使用多线程来解决问题,但多线程程序并不是在任何情况下都能

HTTP2总结及简单实践总结

本文讲的是HTTP2总结及简单实践总结,在总结http2之前先来回顾下http的发展历史.以下三张图片来自 Jerry Qu HTTP/0.9 (1991) HTTP/1.0 (1996) HTTP/1.1 (1999) HTTP通信过程 众所周知,http是基于tcp之上的应用层协议,即在tcp连接建立之后,在tcp的链路上传送数据. 首先进行TCP连接,三次握手, C --(SYN{k})--> S , S --(ACK{k+1}&SYN{j})--> C , C --ACK{j+

【C/C++学院】0826-文件重定向/键盘输入流/屏幕输出流/字符串输入输出/文件读写简单操作/字符文件读写二进制与文本差别/get与getline挖掘数据/二进制与文本差别/随机位置/多线程初级

文件重定向 #include<iostream> using namespace std; void main() { char str[30] = { 0 }; cin >> str; cout << str; system(str); cerr << "error for you"; cin.get(); cin.get(); } 键盘输入流 #include<iostream> #include <stdlib.h

Android网络数据开关用法简单示例_Android

本文实例讲述了Android网络数据开关用法.分享给大家供大家参考,具体如下: api中没有开放这部分接口.因此大家可以使用这个方法,true时打开,false关闭.目前对G网手机可以. public boolean setMobileDataEnabled(boolean enabled) { final TelephonyManager mTelManager; mTelManager = (TelephonyManager) getSystemService(Context.TELEPHO