【Python之旅】第六篇(一):Paramiko模块使用演示

    在第五篇的最后原本还应该有个ftp软件开发的做业的,但对比本身写的和师兄写的,感受本身写的太烂了,因此就不上传了,等之后技术学好些再开发些小工具吧,如今还差好远,还得很是很是努力啊!
html

    先说Paramiko模块是为了之后作监控软件的开发作准备,因此这里先说用Paramiko模块链接远程主机,再介绍用Paramiko模块做远程文件传送。
python

    主要内容是下面几项:
ssh

1.Paramiko SSH链接远程主机
(1)使用用户名密码链接远程主机
(2)使用key链接远程主机
2.Paramiko SFTP传送文件

    Paramiko模块是第三方库,因此须要先进行安装,安装的过程能够看一位网友的文章http://www.cnblogs.com/xia520pi/p/3805043.html,这里就不做记录了。ide


1.Paramiko SSH链接远程主机工具

(1)使用用户名密码链接远程主机    加密

    程序代码及注释以下:
spa

#!/usr/bin/env python

import paramiko    #导入paramiko模块
import sys,os

host = sys.argv[1] #经过sys下的argv来获取命令行的输入,这里为获取命令的第一个参数
user = 'oldboy'    #须要链接的远程主机的用户名
password = '123456'    #须要链接的远程主机的密码

cmd = sys.argv[2]  #经过sys下的argv来获取命令行的输入,这里为获取命令的第二个参数 

s = paramiko.SSHClient()    #调用paramiko模块下的SSHClient()
s.load_system_host_keys()   #加载本地的known_hosts文件,该文件是纪录连到对方时,对方给的 host key。每次连线时都会检查目前对方给的 host key 与纪录的 host key 是否相同,能够简单验证连结是否又被诈骗等相关事宜。

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())  #加上这句话不用担忧选yes的问题,会自动选上(用ssh链接远程主机时,第一次链接时会提示是否继续进行远程链接,选择yes)

s.connect(host,22,user,password,timeout=5)    #链接远程主机,SSH端口号为22
stdin,stdout,stderr=s.exec_command(cmd)       #执行命令

cmd_result = stdout.read(),stderr.read()      #读取命令结果,读取命令结果时,一个是空,一个不是空,有错就不会有结果,有结果就没错。

for line in cmd_result:
	print line,

s.close()

    关于sys.argv[]方法的使用,能够看这里:http://xpleaf.blog.51cto.com/9315560/1700811命令行

    下面演示一下执行结果,这里我有一台同网段的主机,IP地址为:192.168.1.124,以下:
htm

root@xpleaf-machine:/mnt/hgfs/Python/day6# python ssh1.py 192.168.1.124 df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda3        9602276 3538300   5576196  39% /
tmpfs             959228       0    959228   0% /dev/shm
/dev/sda1         198337   34143    153954  19% /boot

root@xpleaf-machine:/mnt/hgfs/Python/day6# python ssh1.py 192.168.1.124 'df -h'
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.2G  3.4G  5.4G  39% /
tmpfs           937M     0  937M   0% /dev/shm
/dev/sda1       194M   34M  151M  19% /boot

    返回的数据便是远程主机的命令执行结果。
blog


(2)使用key链接远程主机

    与(1)并无多大区别,只是认证方式为使用key,所以代码中不须要写密码,先给出代码及注释:

#!/usr/bin/env python

import paramiko
import sys,os

host = sys.argv[1]
user = 'oldboy'

pkey_file = '/home/xpleaf/.ssh/id_rsa'	#指定用来解密的私钥的路径,这个须要手动生成,下面会讲如何生成
key = paramiko.RSAKey.from_private_key_file(pkey_file)    #使用私钥解密

cmd = sys.argv[2]

s = paramiko.SSHClient()
s.load_system_host_keys()

s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

s.connect(host,22,user,pkey=key,timeout=5)
stdin,stdout,stderr=s.exec_command(cmd)

cmd_result = stdout.read(),stderr.read()

for line in cmd_result:
	print line,

s.close()

    使用上面的程序前,先说说如何生成私钥和公钥(对称与非对称加密,公钥加密,私钥解密等的原理,这里就不说了),同时也把公钥发送给认证方(远程主机):

1)被认证方生成私钥和公钥

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ssh-keygen 
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ls /home/xpleaf/.ssh/
id_rsa  id_rsa.pub  known_hosts

2)将公钥发送给认证方(远程主机)

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ssh-copy-id oldboy@192.168.1.124

    完成了上面的步骤后,就能够链接远程主机并执行命令了:

root@xpleaf-machine:/mnt/hgfs/Python/day6# python ssh_key2.py 192.168.1.124 df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda3        9602276 3538304   5576192  39% /
tmpfs             959228       0    959228   0% /dev/shm
/dev/sda1         198337   34143    153954  19% /boot

root@xpleaf-machine:/mnt/hgfs/Python/day6# python ssh_key2.py 192.168.1.124 'df -h'
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.2G  3.4G  5.4G  39% /
tmpfs           937M     0  937M   0% /dev/shm
/dev/sda1       194M   34M  151M  19% /boot

    

2.Paramiko SFTP传送文件

    代码及注释以下:

#!/usr/bin/env python

import paramiko
import sys,os

host = sys.argv[1]
user = 'oldboy'
password='123456'

t = paramiko.Transport((host,22))
t.connect(username=user,password=password)    #链接方式也能够用key,这里只须要将password=password改成pkey=key,其他的key代码与前面的同样

sftp = paramiko.SFTPClient.from_transport(t)  #使用t的设置方式链接远程主机
sftp.get('/tmp/hello.txt','hello.txt')        #下载文件
sftp.put('ssh1.py','/tmp/ssh1.py')            #上传文件

t.close()

    演示以下:

    这里FTP客户端有文件ssh1.py,FTP服务端(192.168.1.124的主机)的/tmp目录下有hello.txt文件,须要将ssh1.py上传到服务端,将hello.txt下载到客户端的当前目录。

1)运行程序

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python ssh_sftp3.py 192.168.1.124

若是没有错误就不会有任何提示。


2)客户端下查看下载的文件

xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ls -l
总用量 7
-rwxrwxrwx 1 root root   19 10月  8 23:49 hello.txt
drwxrwxrwx 1 root root 4096 10月  8 22:40 sorftwares
-rwxrwxrwx 1 root root  435 10月  8 11:36 ssh1.py
-rwxrwxrwx 1 root root  544 10月  8 15:07 ssh_key2.py
-rwxrwxrwx 1 root root  331 10月  8 23:42 ssh_sftp3.py


3)服务端下查看上传的文件

[oldboy@moban tmp]$ ls -l
total 12
drwxrwxrwt. 3 root   root   4096 May 13 09:35 etc
-rw-rw-r--  1 oldboy oldboy   19 Oct  8 12:11 hello.txt
-rw-rw-r--  1 oldboy oldboy  435 Oct  8 20:31 ssh1.py
相关文章
相关标签/搜索