盒子
盒子
文章目录
  1. 需要解决的问题:
    1. 开发环境说明
    2. 利用Paramiko进行ssh登录和下载
      1. paramiko安装
      2. 登录服务器
    3. 下载文件
  • 小结
  • 利用python登录服务器并下载文件

    最近在写一个程序,需要访问服务器上的数据。最开始的时候我想的是,服务器与主机上分别放两个程序,然后通信,做数据的传输。但是感觉太麻烦了,为了简单点,然后就在网上查了相关的资料,想出了一个解决方案:主机上利用一个脚本访问服务器,通过ssh登录,然后直接去把服务器上的数据下载下来。

    需要解决的问题:

    1. 如何在脚本程序中登录到服务器中
    2. 如何通过脚本在服务器上直接执行命令(非重点= =)
    3. 如何对文件的状态进行判断,只下载最新的数据到本地
    4. 文件的传输

    开发环境说明

    • ubuntu 16.04.1 x86_64
    • python 2.7.2

    利用Paramiko进行ssh登录和下载

    paramiko安装

    具体可以访问官网

    1
    2
    3
    # paramiko 依赖于cryptography
    pip install cryptography
    pip install paramiko

    登录服务器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import paramiko 

    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    #自己设置服务器的相关值
    client.connect(hostname='xxx',port= 22, username='xxx', password='xxx')

    stdin, stdout, stderr = client.exec_command('ls')

    result = stdout.read()
    #打印result,用来测试是否连接成功
    print result
    client.close()

    这些函数的使用在官方API有说明,当然也可以直接搜索到。

    下载文件

    官网API中指出,利用SFTP的get()方法可以进行下载。在前面的代码中,使用了exec_command()在服务器上执行shell命令,理论上,直接执行命令把输出存储在本地应该也是可以的。但我还是采用的第一种方式,因为简单。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #coding:UTF-8
    import paramiko

    #ssh登录服务器
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    #相关参数设置
    client.connect(hostname='xxxxx',port= 22, username='xxxx', password='xxxxx')

    #服务器上的文件路径
    log_server = '/usr/local/nginx/logs/access.log'

    #本地存储路径
    log_client = '/home/mrsiz/test.log'

    #服务器上执行的命令
    count_line = 'wc -l ' + log_server

    stdin, stdout, stderr = client.exec_command(count_line)
    result = stdout.read()
    #本地打印结果
    print result

    #从SSHClient中获得一个transport,因为sftp依赖于这个transport
    trans = client.get_transport()
    sftp= paramiko.SFTPClient.from_transport(trans)

    #下载文件
    sftp.get(log_server, log_client)

    client.close()

    小结

    我想,如果要从服务器上获得文件,最暴力的方式就是直接人工登录到服务器,然后直接把数据拷贝到主机上就行了。但是为了更加简单,于是在网上找了python的这个库,直接用封装好的方法完成了文件的下载。到这里,其实已经解决了我最开始提到的1,2,4这三个问题,还有一个问题没有解决。对于这个问题,我在网上搜了相关资料和看了下paramiko提供的相关方法之后,采取了一个特别简单但又有点蠢的方法:直接在一定间隔时间段后重新下载文件。。。。。。。

    想啥呢
    想啥呢