paramiko庫基本用法——建立SSH連接狡门、遠程執(zhí)行命令和上傳下載文件

本文講述的核心庫: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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羊精,一起剝皮案震驚了整個濱河市斯够,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喧锦,老刑警劉巖读规,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異燃少,居然都是意外死亡束亏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門供汛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枪汪,“玉大人,你說我怎么就攤上這事怔昨∪妇茫” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵趁舀,是天一觀的道長赖捌。 經(jīng)常有香客問我,道長矮烹,這世上最難降的妖魔是什么越庇? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮奉狈,結(jié)果婚禮上卤唉,老公的妹妹穿的比我還像新娘。我一直安慰自己仁期,他們只是感情好桑驱,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跛蛋,像睡著了一般熬的。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赊级,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天押框,我揣著相機與錄音,去河邊找鬼理逊。 笑死橡伞,一個胖子當著我的面吹牛盒揉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骑歹,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼预烙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了道媚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翘县,失蹤者是張志新(化名)和其女友劉穎最域,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锈麸,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡镀脂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忘伞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薄翅。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氓奈,靈堂內(nèi)的尸體忽然破棺而出翘魄,到底是詐尸還是另有隱情,我是刑警寧澤舀奶,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布暑竟,位于F島的核電站,受9級特大地震影響育勺,放射性物質(zhì)發(fā)生泄漏但荤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一涧至、第九天 我趴在偏房一處隱蔽的房頂上張望腹躁。 院中可真熱鬧,春花似錦南蓬、人聲如沸纺非。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐炫。三九已至,卻和暖如春蒜焊,著一層夾襖步出監(jiān)牢的瞬間倒信,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工泳梆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鳖悠,地道東北人榜掌。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像乘综,于是被迫代替她去往敵國和親憎账。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容