1 说明

实现功能:

  扫描指定文件目录下文件,通过scp上传到指定服务器目录下

程序结构简单说明:

  • 包含两个线程,线程一:扫描文件线程;线程二:消费文件线程;
  • 线程一:扫描指定文件目录下文件,把符合要求的文件名加入到全局列表中;
  • 线程二:遍历全局列表,取出文件名,并获取该文件最后修改时间;
  • 判断文件最后修改时间与当前时间只差是否大于阈值;
  • 如果大于阈值则通过scp上传文件到指定服务器,上传成功删除文件并从全局列表中移除。

2 SSH免密登录环境

  因为是通过scp自动上传,无需人工干预,所以需要配置两台服务的ssh免密登录;

  假如本次服务器分别为A和B,A上传文件到B,按照如下步骤配置ssh免密登录环境:

1)在A机下生成公钥/私钥对。

  [root@A ~]# ssh-keygen -t rsa -P ''

-P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就一次回车。
该命令将在/root/.ssh目录下面产生一对密钥id_rsa和id_rsa.pub。

一般采用的ssh的rsa密钥:
id_rsa     私钥
id_rsa.pub 公钥
下述命令产生不同类型的密钥
ssh-keygen -t dsa
ssh-keygen -t rsa
ssh-keygen -t rsa1

2)把A机下的/root/.ssh/id_rsa.pub 复制到B机的 /root/.ssh/authorized_keys文件里,先要在B机上创建好 /root/.ssh 这个目录,用scp复制。

[root@A ~]# scp /root/.ssh/id_rsa.pub root@192.168.1.181:/root/.ssh/authorized_keys
root@192.168.1.181's password:
id_rsa.pub                                    100%  223     0.2KB/s   00:00

由于还没有免密码登录的,所以要输入一次B机的root密码。

3)authorized_keys的权限要是600

[root@B ~]# chmod 600 /root/.ssh/authorized_keys

4)A机登录B机

[root@A ~]# ssh -l root 192.168.1.181
The authenticity of host '192.168.1.181 (192.168.1.181)' can't be established.
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.181' (RSA) to the list of known hosts.
Last login: Thu Jul  3 09:53:18 2008 from root
[root@B ~]#

第一次登录是时要你输入yes。
现在A机可以无密码登录B机了。
想让A,B机无密码互登录,那B机以上面同样的方式配置即可。

3 python源码

#coding=utf-8
"""
作用说明:
通过scp上传文件,需要两台无服务预先配置好ssh无密登录,至于如何配置
可以网上查看教程。
线程一:扫描指定文件目录下的文件,并添加到全局列表中
线程二:扫描全局列表,把文件上传到指定的服务器中,上传成功则删除该文件,并从全局列表中移除
"""from threading import Thread, Lock
import signal
import time
import datetime
import os
import sysftp_list = []                         # 全局列表
flag_time = 5                         # 时间阈值,表示当前时间戳与文件最后修改时间大于该值时才操作
ftp_path="/tmp/data"                  # 示例:要扫描的文件目录
server=" root@192.168.101.22:/data/"  # 示例:上传到服务器的文件目录"""
path:要扫描的文件目录
file_list: 将扫描到文件加入该列表中
key: 扫描文件时,有的文件不需要,以key关键词判断该文件是否为需要的文件
"""
def get_file_list(path, file_list, key):files=os.listdir(path)for f in files:if key not in f:continuefile_with_path = path+"/"+fif file_with_path in file_list:continueif not os.path.isdir(file_with_path):try:time_str = os.path.getmtime(file_with_path)file_time = int(time_str)now_time = int(time.time())#print("time :", now_time-file_time)except OSError as err:continueif((now_time-file_time) > flag_time):lock.acquire()file_list.append(file_with_path)lock.release()#print("[## add ##]add file %s to global list"% file_with_path)"""
file_list: 扫描文件列表,并把文件上传到服务器,上传成功后,删除文件,并从全局列表中移除
"""
def send_file(file_list):year = datetime.datetime.now().yearmonth = datetime.datetime.now().monthday = datetime.datetime.now().dayfor f in file_list:if f.strip():#上传到服务指定目录下子目录以 年月日 分类shell_cmd="scp "+f+server+"/"+str(year)+"/"+str(month)+"/"+str(day)ret_shell=os.system(shell_cmd)#print("shellcmd:",shell_cmd)lock.acquire()file_list.remove(f)lock.release()os.remove(f)#print("[-- remove --]remove file %s "% f)def quit(signum, frame):print("You choose to stop me")sys.exit()"""
线程一:扫描文件目录,将符合要求文件名添加到全局列表中
"""
def traverse_dir():global ftp_listwhile True:get_file_list(ftp_path, ftp_list, ".bin")time.sleep(2)#print("======================== start to traverse ===========================");#print("[traverse]:%s"% ftp_list)"""
线程二:扫描全局列表,将文件上传到指定服务器,上传成功,删除文件,并从全局列表中移除
"""
def consume_file():global ftp_listwhile True:send_file(ftp_list)time.sleep(2)#print("consume:%s"%ftp_list)if __name__=='__main__':try:signal.signal(signal.SIGINT, quit)signal.signal(signal.SIGTERM, quit)lock = Lock()   #创建线程锁thread_product = Thread(target=traverse_dir)thread_consume = Thread(target=consume_file)thread_product.setDaemon(True)thread_product.start()thread_consume.setDaemon(True)thread_consume.start()while True:passexcept Exception, exc:print exc

转载于:https://www.cnblogs.com/liuguanghai6455/p/10636468.html

python2.7通过scp上传文件到指定服务器相关推荐

  1. 使用WinSCP上传文件到指定服务器

    使用WinSCP上传文件到指定服务器 文章目录 使用WinSCP上传文件到指定服务器 前言 安装WinSCP 新建站点 传输文件 实现公网访问 前言 个人认为 FlashFTP是一款十分好用的文件上传 ...

  2. java web ftp上传_java web FTPClient实现上传文件到指定服务器

    FPClient 实现上传文件到指定服务器,供大家参考,具体内容如下 调用 FileInputStream in=new FileInputStream(new File(fileUrl)); mov ...

  3. Java实现上传文件到指定服务器指定目录

    前言需求 使用freemarker生成的静态文件,统一存储在某个服务器上.本来一开始打算使用ftp实现的,奈何老连接不上,改用jsch.毕竟有现成的就很舒服,在此介绍给大家. 具体实现 引入的pom ...

  4. 使用 scp 上传文件到远程服务器/从远程服务器下载文件到本地

    Intro wuyujin@ubuntu18:~/Desktop/project/网站部署$ whatis scp scp (1) - secure copy (remote file copy pr ...

  5. scp 上传文件、指定端口上传

    默认端口(22端口)上传 scp C:\Users\CY\Desktop\test.apk root@192.151.13.11:/root 指定端口上传 scp -P 12301 C:\Users\ ...

  6. java使用sftp上传(文件)图片到服务器中

    最近租了一个服务器,想着上线个小项目,结果图片上传卡壳了,自从11号看了一篇文章就入了ftp的坑.研究了十多个小时的ftp文件传输,无果.睡前看到了一篇关于sftp上传文件的文章,抱着试一试的心态,结 ...

  7. scp 上传文件到服务器

    scp 上传文件到服务器 scp命令 scp 本地路径 服务器路径 如 scp /Users/***/Desktop/text.zip root@****:/opt/ 本来是想通过"scp ...

  8. android里面通过scp上传文件

    我网上搜索了到使用ganymed-ssh2-build210.jar来实现scp上传文件功能.我就不说具体的方法了.有些网友比我还认真写文档,写的比我漂亮多了. 问题一: 使用的时候,我发现总是连不上 ...

  9. 连接腾讯云服务器操作+SCP上传文件

    1.连接腾讯云服务器 linux打开终端(windows打开cmd) ssh -i "<下载的与云服务器关联的私钥的绝对路径>" <username>@&l ...

最新文章

  1. 主流深度学习框架对比(TensorFlow、Keras、MXNet、PyTorch)
  2. 拖动效果,防止选中文字兼容代码
  3. 解决loaded more than 1 DLL from .libs和No metadata found in lib\site-packages两个错误
  4. C++ 二进制文件读操作
  5. 中艺人脸识别考勤机使用方法_人脸识别考勤机的使用方法及注意事项 - 全文
  6. 综合场景搞清楚同步 异步 阻塞 非阻塞
  7. Java运行时数据区域
  8. RNN Attention
  9. Http之客户端请求服务器,服务器响应客户端。通过Handler在主线程中读取数据
  10. java类的参考文献,太完整了!
  11. 计算机系最好的985大学排名,2017年全国“985”大学排名及王牌专业全解析
  12. 联想MIIX510 黑苹果教程 整机升级
  13. css 图片放大1.2倍,什么是二倍图?怎样使用二倍图?
  14. RationalDMIS 2020 编程技巧
  15. 温莎大学的计算机专业,2017加拿大计算机专业前七名
  16. SAP HANA XS ODATA使用参数展示具体数据
  17. android 头像球_【Android 界面效果44】Android之圆头像实例
  18. centos如何在官网下载以前的版本
  19. Android压缩包下载解压
  20. 2021年3月16刚进新公司做了四天就被劝退

热门文章

  1. 【直播】杨毅远:集成学习答疑直播之六 -- 幸福感预测案例实战
  2. C/C++二进制,八进制, 十进制和十六进制的表示方法
  3. C语言-数组-消除类游戏
  4. 速达软件二次开发-单据佣金和毛利报表开发
  5. C语言销售管理系统设计源代码(精)
  6. 昨天,小灰做了人生的第一次直播!
  7. 【go密码学】-非对称加密算法
  8. 【云原生 | 从零开始学Kubernetes】二、使用kubeadm搭建K8S集群
  9. 【kubernetes系列】Kubernetes入门
  10. 【HDU No. 1166】 敌兵布阵