python小白之paramiko(1)

來源:互聯網
上載者:User

標籤:python   paramiko   

樓主python小白一枚,無任何編程經驗。近期研究python自動化營運技術與最佳實務,今天在看paramiko模組,依葫蘆畫瓢,實現了兩個小程式,分享如下!


首先,簡單介紹下paramiko這個模組。paramiko是基於python實現的SSH2遠程安全連線、支援認證及密鑰方式,實現遠程命令執行,檔案傳輸,中間ssh代理等,相對Pexpect,封裝的層次更高,更貼近SSH協議的功能。


安裝的話,採用pip安裝即可,指令很簡單:pip install paramiko  

當然,前提需要配置好pip。


廢話不多說,上代碼:

1、樣本1:

該代碼讀取目前的目錄下commands.txt(該檔案記錄需要執行的命令)檔案的內容,並進行處理,返回命令列列表,然後在main()函數中直接調用paramiko模組相關方法,順次執行檔案中的命令,並列印出輸出結果。

[[email protected] paramiko]# more simple1.py
#!/usr/bin/python

import sys
import os
import paramiko

def get_cmds(fp=‘commands.txt‘):
    if os.path.isfile(fp) and os.access(fp,os.R_OK):
        f = open(fp,‘rb‘)
        lines = f.readlines()
        f.close()

        cmds = map(lambda x:x.rstrip(),lines)
        return cmds

    else:
        sys.exit()
        return None


def main():
    if len(sys.argv) == 4:
        host = sys.argv[1]
        user = sys.argv[2]
        passwd = sys.argv[3]
    else:
        print "Usage:%s host user passwd"%(sys.argv[0])
        sys.exit()


    paramiko.util.log_to_file(‘syslogin.log‘)
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=host,username=user,password = passwd)
    cmds = get_cmds()
    for cmd in cmds:
        stdin,stdout,stderr = ssh.exec_command(cmd)
        print stdout.read()

    ssh.close()


if __name__ == "__main__":
    main()



在該樣本中,commands.txt檔案的內容如下(可以根據自己實際需要將命令寫入這個檔案即可,無需修改原始代碼):

[[email protected] paramiko]# more commands.txt
free -m
uptime
uname -a
df -h
who


指令結果如下:

[[email protected] paramiko]# ./simple1.py
Usage:./simple1.py host user passwd   #遠程server的主機名稱,使用者名稱,密碼通過命令列參數輸入,此處未給定,直接輸出了用法提示。
[[email protected] paramiko]# ./simple1.py 192.168.0.200 root 123456
              total        used        free      shared  buff/cache   available
Mem:            984          96         733           6         154         728
Swap:          3967           0        3967

 18:33:17 up 1 day,  4:38,  1 user,  load average: 0.00, 0.01, 0.05

Linux admin-node 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Filesystem           Size  Used Avail Use% Mounted on
/dev/mapper/cl-root   36G  1.4G   34G   4% /
devtmpfs             482M     0  482M   0% /dev
tmpfs                493M     0  493M   0% /dev/shm
tmpfs                493M  6.8M  486M   2% /run
tmpfs                493M     0  493M   0% /sys/fs/cgroup
/dev/sda1           1014M  139M  876M  14% /boot
tmpfs                 99M     0   99M   0% /run/user/0

root     tty1         2017-10-16 09:09


該例子比較簡單,如果需要在多台伺服器上同時執行指令,可以把遠程主機資訊通過字典的格式存入列表,通過迴圈順次執行。此處不再贅述,樓主自己也沒有碼相關的代碼。


2、樣本2:

該代碼首先篩選出給定目錄下(含子目錄)尾碼為.py的所有檔案,並將檔案名稱存入列表;然後通過tar_files函數將檔案打包,最後通過put_files函數將打包檔案上傳到遠端伺服器,而put_files函數使用了paramiko的put方法。

[[email protected] paramiko]# more simple2.py
#!/usr/bin/python

import sys
import os
import tarfile
import datetime
import paramiko


def get_files(dir_path,files=[]):
    for name in os.listdir(dir_path):
        full_path = os.path.join(dir_path,name)
        if os.path.isfile(full_path) and os.path.splitext(full_path)[1]==‘.py‘:
            files.append(full_path)

        if os.path.isdir(full_path):
            get_files(full_path,files)

    return files


def tar_files(files,dst):
    if isinstance(files,list):
        tar = tarfile.open(dst,‘w:gz‘)
        for file in files:
            tar.add(file)
        tar.close()

    else:
        sys.exit()


def put_files(host,user,passwd,localpath,remotepath):
    tran = paramiko.Transport((host,22))
    tran.connect(username=user,password=passwd)
    sftp = paramiko.SFTPClient.from_transport(tran)
    sftp.put(localpath,remotepath)
    tran.close()


def main():
    try:
        files = get_files(‘/root/python‘)
        suffix = datetime.datetime.now().strftime("%Y%m%d%H%M")
        dst = "/tmp/tar_%s.tar.gz"%(suffix)
        tar_files(files,dst)
        remotepath = dst
        put_files(‘192.168.0.200‘,‘root‘,‘123456‘,dst,remotepath)

    except Exception,e:
        print str(e)
        sys.exit()


if __name__ == "__main__":
    main()


執行該指令碼:

[[email protected] paramiko]# ./simple2.py

本端主機上的壓縮檔

[[email protected] tmp]# pwd
/tmp
[[email protected] tmp]# ls -al *.tar.gz
-rw-r--r--  1 root root    56884 Oct 20 17:55 tar_201710201755.tar.gz
-rw-r--r--  1 root root    56884 Oct 20 18:41 tar_201710201841.tar.gz
-r--r--r--. 1 root root 60654199 Sep 25  2016 VMwareTools-9.6.0-1294478.tar.gz


遠端主機上的壓縮檔:

[[email protected] ~]# cd /tmp
[[email protected] tmp]# ls -al *.tar.gz
-rw-r--r-- 1 root root 27179 Oct 16 11:40 tar_201710161140.tar.gz
-rw-r--r-- 1 root root 27179 Oct 16 12:14 tar_201710161214.tar.gz
-rw-r--r-- 1 root root 56884 Oct 20 17:55 tar_201710201755.tar.gz
-rw-r--r-- 1 root root 56884 Oct 20 18:41 tar_201710201841.tar.gz


完美實現檔案的壓縮和上傳,哈哈!


今天僅僅學習了paramiko的SSHClient和SFTPClient兩個類,也僅僅瞭解了最基本的使用方法,後續再學習,再更新,與各位共勉!

本文出自 “python小白進階之路” 部落格,請務必保留此出處http://ccczlb611.blog.51cto.com/3588825/1974706

python小白之paramiko(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.