本文講述的核心庫:
paramiko
官方文檔:http://docs.paramiko.org/en/2.4/
準備工作:paramiko庫安裝、測試環(huán)境搭建
paramiko庫安裝
pip install paramiko
測試環(huán)境搭建
測試和遠程服務器的交互嗜价,那首先得有一臺遠程主機田度,可以在阿里云申請?zhí)摂M機,但是成本有點高樟氢。如果想要便捷一點冈绊,其實可以在自己電腦上用Vmware搭建一個Linux虛擬機充當遠程主機,搭建方法可以參考:VMware Workstation + Lubuntu打造極速虛擬機環(huán)境
建立和遠程服務器的SSH連接
在遠程服務器上執(zhí)行各種操作的前提是首先建立和遠程服務器的連接埠啃,這里使用SSH連接:
# coding:utf-8
import paramiko
def login(ip,username,password,port = 22):
'''
用paramiko SSH登錄遠程服務器
:param ip: 遠程服務器的IP
:param username: 遠程服務器登錄用戶名
:param password: 遠程服務器登錄用戶密碼
:param port: 遠程服務器的端口死宣,SSH協(xié)議默認為22
'''
# 創(chuàng)建一個SSH客戶端對象
ssh = paramiko.SSHClient()
# 設置訪問策略
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 與遠程主機進行連接
ssh.connect(hostname = ip,port = port,username = username,password = password)
return ssh
def main():
ip = '192.168.xxx.xxx'
username = '***'
password = '***'
ssh = login(ip,username,password)
print type(ssh)
if __name__ == '__main__':
main()
執(zhí)行上述代碼,輸出:
<class 'paramiko.SSHClient'>
可見碴开,當和遠程服務器建立的SSH連接成功后毅该,會創(chuàng)建出一個SSHClient對象。
在遠程服務器上執(zhí)行命令
# coding:utf-8
import paramiko
def execute_command(ssh,command_str):
'''
執(zhí)行遠程命令
:param ssh: SSH連接對象
:param command_str: 命令字符串
'''
input,output,err = ssh.exec_command(command_str)
resp,error = output.read(),err.read()
# 這里對命令執(zhí)行結(jié)果和異常的處理方式還有待思考
if resp:
return resp
print 'error occurs: {0}'.format(error)
raise Exception(error)
def main():
ip = '192.168.xxx.xxx'
username = '***'
password = '***'
ssh = login(ip,username,password)
command = 'ls /home/m2fox'
print execute_command(ssh,command)
if __name__ == '__main__':
main()
執(zhí)行上面代碼潦牛,輸出:
Desktop
Documents
Downloads
Music
Pictures
Public
Templates
tmp
Videos
這是在我的虛擬機上/home/m2fox
目錄下的文件和文件夾列表眶掌。
上傳、下載文件
- 首先在當前目錄創(chuàng)建一個
hello.txt
文件巴碗,其文件內(nèi)容如下:
hello, paramiko!
- 上傳朴爬、下載代碼:
# coding:utf-8
import paramiko
def upload_file(ssh,local_file_path,remote_file_path):
'''
上傳文件
:param ssh: SSH連接對象
:param local_file_path: 本地文件路徑
:param remote_file_path: 遠程文件存放路徑
'''
# 創(chuàng)建sftp對象上傳文件
sftp = ssh.open_sftp()
sftp.put(local_file_path,remote_file_path)
sftp.close()
def download_file(ssh,remote_file_path,local_file_path):
'''
下載文件
:param ssh: SSH連接對象
:param remote_file_path: 遠程文件路徑
:param local_file_path: 本地文件存放路徑
'''
# 創(chuàng)建sftp對象下載文件
sftp = ssh.open_sftp()
sftp.get(remote_file_path,local_file_path)
sftp.close()
def main():
ip = '192.168.xxx.xxx'
username = '***'
password = '***'
ssh = login(ip,username,password)
# 上傳文件
upload_file(ssh,'./hello.txt','/home/m2fox/hello.txt')
# 下載文件
download_file(ssh,'/home/m2fox/hello.txt','e:/hello.txt')
if __name__ == '__main__':
main()
執(zhí)行上述代碼,然后到虛擬機的/home/m2fox/
目錄查看:
發(fā)現(xiàn)hello.txt
文件以已經(jīng)被成功上傳到/home/m2fox/
目錄橡淆,文件內(nèi)容也是正確的召噩。
再打開本地E盤根目錄,發(fā)現(xiàn)從虛擬機下載hello.txt
成功:
SSHUtil封裝
將上面講到的幾項基本功能封裝成一個類:SSHUtil
明垢,便于以后使用蚣常。
# coding:utf-8
# 封裝常用的SSH功能
import paramiko
class SSHUtil(object):
'''
封裝常用的SSH功能,包括:
* 遠程登錄
* 遠程執(zhí)行命令
* 上傳文件
* 下載文件
'''
def __init__(self,ip,username,password,port = 22):
'''
初始化
:param ip: 遠程服務器的IP
:param username: 遠程服務器登錄用戶名
:param password: 遠程服務器登錄用戶密碼
:param port: 遠程服務器的端口痊银,SSH協(xié)議默認為22
'''
self.ip = ip
self.port = port
self.username = username
self.password = password
# 登錄抵蚊,獲取SSH對象
self.login(ip,username,password,port)
def login(self,ip,username,password,port = 22):
'''
用paramiko SSH登錄遠程服務器
:param ip: 遠程服務器的IP
:param username: 遠程服務器登錄用戶名
:param password: 遠程服務器登錄用戶密碼
:param port: 遠程服務器的端口,SSH協(xié)議默認為22
'''
# 創(chuàng)建一個SSH客戶端對象
self.ssh = paramiko.SSHClient()
# 設置訪問策略
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 與遠程主機進行連接
self.ssh.connect(hostname = ip,port = port,username = username,password = password)
def execute_command(self,command_str):
'''
執(zhí)行遠程命令
:param ssh: SSH連接對象
:param command_str: 命令字符串
'''
input,output,err = self.ssh.exec_command(command_str)
resp,error = output.read(),err.read()
if resp:
return resp
print 'error occurs: {0}'.format(error)
raise Exception(error)
def upload_file(self,local_file_path,remote_file_path):
'''
上傳文件
:param ssh: SSH連接對象
:param local_file_path: 本地文件路徑
:param remote_file_path: 遠程文件存放路徑
'''
# 創(chuàng)建sftp對象上傳文件
sftp = self.ssh.open_sftp()
sftp.put(local_file_path,remote_file_path)
sftp.close()
def download_file(self,remote_file_path,local_file_path):
'''
下載文件
:param ssh: SSH連接對象
:param remote_file_path: 遠程文件路徑
:param local_file_path: 本地文件存放路徑
'''
# 創(chuàng)建sftp對象下載文件
sftp = self.ssh.open_sftp()
sftp.get(remote_file_path,local_file_path)
sftp.close()
def sample():
'''
用法示例
'''
# 基本信息
ip = '192.168.xxx.xxx'
username = '***'
password = '***'
# 獲取SSHUtil對象
ssh_util = SSHUtil(ip,username,password)
# 執(zhí)行遠程命令
command = 'ls /home/m2fox'
print ssh_util.execute_command(command)
# 上傳文件
ssh_util.upload_file('./hello.txt','/home/m2fox/hello.txt')
# 下載文件
ssh_util.download_file('/home/m2fox/hello.txt','e:/hello.txt')
print 'end'
if __name__ == '__main__':
sample()
總結(jié)
本文講了paramiko庫提供的幾項基本功能的用法:建立SSH連接溯革、執(zhí)行遠程命令和上傳贞绳、下載文件。其實paramiko庫還有更多豐富的功能致稀,可以去官方文檔進行了解冈闭,也可以基于執(zhí)行遠程命令
這個基礎能力,結(jié)合Shell命令抖单、腳本萎攒,開發(fā)出自己需要的更為豐富的功能遇八,比如批量上傳文件、重啟遠程進程耍休、讀取遠程配置文件等等刃永,最重要的是學以致用。
獲取本文源代碼:我的GitHub