Python使用Paramiko模块编写脚本进行远程服务器操作

355次阅读  |  发布于5年以前

简介:
paramiko是python(2.2或更高)的模块,遵循SSH2协议实现了安全(加密和认证)连接远程机器。
安装所需软件包:
http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.5.tar.gz
http://www.lag.net/paramiko/download/paramiko-1.7.7.1.tar.gz


    tar zxvf pycrypto-2.5.tar.gz
    cd pycrypto-2.5
    python setup.py build
    python setup.py install
    tar zxvf paramiko-1.7.7.1.tar.gz
    cd paramiko-1.7.7.1
    python setup.py build
    python setup.py install

脚本简单编写:
管理单台服务器:

脚本一:查询172.16.22.23磁盘使用情况


    #!/usr/bin/python 
    import paramiko 
    hostname="172.16.22.23" 
    port=22 
    username="root" 
    password="larryroot" 
    if __name__=="__main__": 
        s=paramiko.SSHClient() 
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
        s.connect(hostname,port,username,password) 
        stdin,stdout,sterr=s.exec_command("df -Th") 
        print stdout.read() 
        s.close()

脚本二:在远程服务器上执行相应命令


    #!/usr/bin/python 
    #by larry 
    #2011/01/30 
    import sys 
    import paramiko 

    hostname=sys.argv[1] 
    command = " ".join(sys.argv[2:]) 
    port=22 
    username="root" 
    password="larryroot" 
    if __name__=="__main__": 
        s=paramiko.SSHClient() 
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
        s.connect(hostname,port,username,password) 
        stdin,stdout,sterr=s.exec_command(command) 
        print stdout.read() 
        s.close()

使用方法:


    python single1.py ip地址  命令
    [root@localhost ~]# python single1.py 172.16.22.23 df -TH

    Filesystem  Type   Size  Used Avail Use% Mounted on
    /dev/sda2   ext3   13G  6.0G  5.7G 52% /
    /dev/sda1   ext3   104M  12M  87M 13% /boot
    tmpfs    tmpfs   61M   0  61M  0% /dev/shm
    /dev/sda4   ext3   7.6G  465M  6.8G  7% /data
    /dev/sdb1   ext3   32G  5.9G  25G 20% /autocd
    [root@localhost ~]# python single1.py 172.16.22.23 free -m
    total    used    free   shared  buffers   cached
    Mem:      114    112     2     0     26     35
    -/+ buffers/cache:     50     64
    Swap:     1027     0    1027

脚本三:管理多台服务器:批量查询ip列表中对应服务器的磁盘使用情况


    #!/usr/bin/python 
    #by larry 
    #2011/01/30 
    import paramiko 
    port=22 
    username="root" 
    file=open("ip.list") 
    for line in file: 
        hostname=str(line.split("\t")[1]) 
        password=str(line.split("\t")[4]).strip() 
        print "##########################",hostname,"########################" 
        s=paramiko.SSHClient() 
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
        s.connect(hostname,port,username,password) 
        stdin,stdout,sterr=s.exec_command("df -Th") 
        print stdout.read() 
        s.close() 
    file.close()

用法:


    [root@localhost ~]# python ssh.py

    ############################ 172.16.22.22 ########################
    Filesystem  Type  Size Used Avail Use% Mounted on
    /dev/sda2   ext3   12G 5.6G 5.3G 52% /
    /dev/sda1   ext3   99M  12M  83M 13% /boot
    tmpfs    tmpfs   58M   0  58M  0% /dev/shm
    /dev/sda4   ext3  7.1G 443M 6.3G  7% /data
    /dev/sdb1   ext3   30G 5.5G  23G 20% /autocd
    ############################ 172.16.22.23 ########################
    Filesystem  Type  Size Used Avail Use% Mounted on
    /dev/sda2   ext3   15G 2.6G  11G 19% /
    /dev/sda1   ext3   99M  12M  82M 13% /boot
    tmpfs    tmpfs   60M   0  60M  0% /dev/shm
    /dev/sda4   ext3   33G 377M  31G  2% /data

ip.list文件内容:


    dx   172.16.22.22  22  root  larryroot
    wt   172.16.22.23  22  root  larryroot

脚本四:类似于脚本二,在所有远程服务器上执行相应命令


    #!/usr/bin/python 
    #by larry 
    #2011/01/30 
    import paramiko 
    import sys 
    port=22 
    username="root" 
    command = " ".join(sys.argv[1:]) 
    file=open("ip.list") 
    for line in file: 
        hostname=str(line.split("\t")[1]) 
        password=str(line.split("\t")[4]).strip() 
        print "##################",hostname,"######################" 
        s=paramiko.SSHClient() 
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
        s.connect(hostname,port,username,password) 
        stdin,stdout,sterr=s.exec_command(command) 
        print stdout.read() 
        s.close() 
    file.close()

用法:


    python ssh.py 命令

简单整理到这里通过python的paramiko模块可以很方便的管理服务器,文件的上传下载后续会整理出来。

SSH
下面是通过ssh的dsa或rsa公钥验证批量登录服务器执行命令:


    #!/usr/bin/python 
    #2012/02/02 by larry 
    import paramiko 
    import sys,os 
    port=22 
    username="larry" 
    key_file="~/.ssh/authorized_keys" 
    know_host="/home/larry/.ssh/known_hosts" 
    command=" ".join(sys.argv[1:]) ####获取命令行参数 
    file=open("ip.list") 
    for line in file: 
        hostname=str(line.split(" ")[1]) ####截取ip字段 
        print "#####################################",hostname,"###############################################" 
        s=paramiko.SSHClient() 
        s.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
        s.load_system_host_keys(know_host) 
        s.connect(hostname,port,username,key_file) 
        stdin,stdout,sterr=s.exec_command(command) 
        print stdout.read().strip() 
        s.close() 
    file.close()

执行python脚本:


    python sshkey.py df -h

    ################172.16.22.22########################
    Filesystem      Size Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
    14G 3.5G 9.7G 27% /
    /dev/mapper/VolGroup00-data
    116G  47G  64G 43% /data
    /dev/cciss/c0d0p1   99M  13M  82M 14% /boot
    tmpfs         5.9G   0 5.9G  0% /dev/shm

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8