博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Python之旅】第六篇(一):Paramiko模块使用演示
阅读量:6902 次
发布时间:2019-06-27

本文共 4664 字,大约阅读时间需要 15 分钟。

  在第五篇的最后本来还应该有个ftp软件开发的作业的,但对比自己写的和师兄写的,感觉自己写的太烂了,所以就不上传了,等以后技术学好些再开发些小工具吧,现在还差好远,还得非常非常努力啊!

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

    主要内容是下面几项:

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

    Paramiko模块是第三方库,所以需要先进行安装,安装的过程可以看一位网友的文章http://www.cnblogs.com/xia520pi/p/3805043.html,这里就不作记录了。

1.Paramiko SSH连接远程主机

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

    程序代码及注释如下:

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
#!/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[]方法的使用,可以看这里:

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

1
2
3
4
5
6
7
8
9
10
11
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

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

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

    与(1)并没有多大区别,只是认证方式为使用key,因此代码中不需要写密码,先给出代码及注释:

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
#!/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)被认证方生成私钥和公钥

1
2
3
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)将公钥发送给认证方(远程主机)

1
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ ssh-copy-id oldboy@
192.168
.
1.124

    完成了上面的步骤后,就可以连接远程主机并执行命令了:

1
2
3
4
5
6
7
8
9
10
11
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传送文件

    代码及注释如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/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)运行程序

1
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day6$ python ssh_sftp3.py 
192.168
.
1.124

如果没有错误就不会有任何提示。

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

1
2
3
4
5
6
7
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)服务端下查看上传的文件

1
2
3
4
5
[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
你可能感兴趣的文章
红旗linux 进不去图形界面,进不了红旗Linux6.0的图形界面请高手帮忙
查看>>
linux安装中文语言命令,Centos使用yum命令安装中文语言包(fonts-chinese.noarch,m17n-db-common-cjk)...
查看>>
linux添加Qt的fontconfig,QT__qt SDK------Fontconfig-2.4.2安装 (二)
查看>>
linux 查看io调度策略,磁盘IO调度策略
查看>>
高通笔记本装linux,在华硕畅370(TP370QL)骁龙笔记本上安装Ubuntu 18.04 ARM64的方法...
查看>>
linux sysfs属性,linux-sysfs
查看>>
c语言int speed=1,求大神帮忙看看这个弹弹球消砖块的游戏代码,为什么speed只能15...
查看>>
c语言如何控制误差小于10-n,C语言使用注意事项(二)
查看>>
c语言黑白棋图形,C语言黑白棋游戏[转载]
查看>>
Grunt 入门指南2:任务配置
查看>>
nullnullsql 多条件查询
查看>>
js 字符串转换数字
查看>>
ASP.NET伪静态 UrlRewrite(Url重写) 实现和配置
查看>>
函数调用Java Web使用swfobject调用flex图表
查看>>
加中实训第二天(笔记+代码) - 2013.5.29 (待完善)
查看>>
《JavaScript DOM 编程艺术》小结
查看>>
MYSQ提高L查询效率的策略总结
查看>>
java--九九乘法表
查看>>
服务器端几种分页方式的性能分析
查看>>
boost解析json
查看>>