python小白之paramiko

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

小白学Python 之创建类 三

python小白之字典使用笔记

python小白之路(特性语法三之列表)

小白学Python 之函数 二

Python~Pandas 小白避坑之常用笔记

python小白之数组索引