利用python登录服务器并下载文件
2018.04.13
mrsiz
 热度
℃
最近在写一个程序,需要访问服务器上的数据。最开始的时候我想的是,服务器与主机上分别放两个程序,然后通信,做数据的传输。但是感觉太麻烦了,为了简单点,然后就在网上查了相关的资料,想出了一个解决方案:主机上利用一个脚本访问服务器,通过ssh登录,然后直接去把服务器上的数据下载下来。
需要解决的问题:
- 如何在脚本程序中登录到服务器中
- 如何通过脚本在服务器上直接执行命令(非重点= =)
- 如何对文件的状态进行判断,只下载最新的数据到本地
- 文件的传输
开发环境说明
- 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()
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
| import paramiko
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
trans = client.get_transport() sftp= paramiko.SFTPClient.from_transport(trans)
sftp.get(log_server, log_client)
client.close()
|
小结
我想,如果要从服务器上获得文件,最暴力的方式就是直接人工登录到服务器,然后直接把数据拷贝到主机上就行了。但是为了更加简单,于是在网上找了python的这个库,直接用封装好的方法完成了文件的下载。到这里,其实已经解决了我最开始提到的1,2,4这三个问题,还有一个问题没有解决。对于这个问题,我在网上搜了相关资料和看了下paramiko提供的相关方法之后,采取了一个特别简单但又有点蠢的方法:直接在一定间隔时间段后重新下载文件。。。。。。。