1. 程式人生 > >python paramiko模塊幸運飛艇平臺搭建實現跨平臺SSH

python paramiko模塊幸運飛艇平臺搭建實現跨平臺SSH

config 配置 set 交互 下載文件 興趣 fabri 命令執行 ftpclient

需求:在幸運飛艇平臺搭建論壇:haozbbs.com Q1446595067 管理用戶端(實際上所有支持Python的OS都可以)批量對遠程服務器進行部署、命令執行、文件傳輸、搭建測試環境等。

一般的,我們用Putty,Xshell,Winscp都可以實現SSH登錄,但是如果出現N臺服務器,我們按照原來的方法,需要逐個登錄配置,這會花費一定的時間。實際上,Python的paramiko模塊就可以實現這種操作。其原理就是模擬SSH客戶端,與SSH服務端進行交互,實現登錄與命令的實時傳輸。
Paramiko安裝

這裏我使用了pip工具,也可以在網上下載包直接安裝。

安裝流程:

  1. 安裝pycrypto: pip install python-dev
  2. 安裝paramiko模塊: pip install paramiko
    登錄

一般的登錄有兩種方式,一種是通過用戶名/密碼,一種是通過密鑰對,一般來說,通過密鑰對的登錄方式更為安全。
通過用戶名/密碼登錄

#!/usr/bin/env python
#coding:utf-8

import paramiko

#實例化ssh
ssh = paramiko.SSHClient()
#在服務端簽名,取消第一次登錄出現的yes/no,其原理就是/home/$user/.ssh/known_hosts中加入該用戶
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

#ip,端口號,用戶名,密碼
ssh.connect(‘l92.168.1.1‘,22,‘root‘,‘password‘)
#返回一個元組,包含正確/錯誤輸出
stdin,stdout,stderr = ssh.exec_command(‘ifconfig‘)
print stdout.read()
#關閉ssh
ssh.close()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

通過密鑰對登錄
在服務端

ssh-keygen -t rsa #產生一個密鑰對
ssh-copy-id -i ~/ssh/id_rsa.pub [email protected] #把公鑰copy到用戶下的~/.ssh/下

1
2

在客戶端

#!/usr/bin/env python
#coding:utf-8

import paramiko

private_key_path = ‘/home/user/.ssh/id_rsa‘ #指定私鑰位置
key = paramiko.RSAKey.from_private_key_file(private_key_path)

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(‘192.168.1.1‘,22, username=‘root‘,pkey=key) #這裏就不需要密碼了

stdin, stdout, stderr = ssh.exec_command(‘ifconfig‘)
print stdout.read()
ssh.close();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

文件傳輸

文件傳輸也可以包括通過用戶名/密碼來上傳/下載文件,或是密鑰對連接後上傳/下載文件,我這裏只單獨用密鑰對的方法,用戶名/密碼方法不再贅述。
文件上傳

#!/usr/bin/env python
#coding:utf-8

import paramiko

pravie_key_path = ‘/home/user/.ssh/id_rsa‘
key = paramiko.RSAKey.from_private_key_file(pravie_key_path)

t = paramiko.Transport((‘192.168.1.1‘,22))
t.connect(username=‘root‘,pkey=key)

sftp = paramiko.SFTPClient.from_transport(t)
#前面的連接過程和上面都一樣,只是這裏用了sftp.put的方法實現上傳
sftp.put(‘/tmp/test1.py‘,‘/tmp/test1.py‘)

t.close()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

文件下載

#!/usr/bin/env python
#coding:utf-8

import paramiko

pravie_key_path = ‘/home/user/.ssh/id_rsa‘
key = paramiko.RSAKey.from_private_key_file(pravie_key_path)

t = paramiko.Transport((‘192.168.1.1‘,22))
t.connect(username=‘root‘,pkey=key)

sftp = paramiko.SFTPClient.from_transport(t)
#文件的下載
sftp.get(‘/tmp/test1.py‘,‘/tmp/test2.py‘)

t.close()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

延伸

其實熟悉python的人都看出來了,paramiko和fabric模塊非常相似,實際上,fabric就是在paramiko又加了一層封裝。操作起來更方便而已,有興趣的同學可以Google一下。

python paramiko模塊幸運飛艇平臺搭建實現跨平臺SSH