Python:paramiko模块简单应用

Python的paramiko模块,该模块是基于SSH用于连接远程服务器并执行相关操作

SSHClient

用于连接远程服务器并执行基本命令

密码登陆

#创建SSH对象
ssh=paramiko.SSHClient()

#允许连接不在know_hosts文件中的主机
#set_missing_host_key_policy(policy)
"""
一个策略是一个policy class 的实例,或者说他的某一个子类
比如说`.RejectPolicy` (默认的),
`.AutoAddPolicy`,
 `.WarningPolicy`, 
 或者我们自定义的子类
"""
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

#连接服务器
ssh.connect(hostname="172.16.0.51",port=22,username='cmustard',password='123456',timeout=4)

#执行命令 return stdin, stdout, stderr
stdin,stdout,stderr=ssh.exec_command('ifconfig')

#获取命令执行结果
result=stdout.read()
print result

#最后关闭链接
ssh.close()

RSA密钥认证

ssh=paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy)

#from_private_key_file(filename, password=None)
#from_private_key(file_obj, password=None)
pri_key=paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')
ssh.load_system_host_keys()
#连接服务器
ssh.connect(hostname='172.16.0.51',port=22,username='cmustard',pkey=pri_key)

# 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()

# 关闭连接
ssh.close()

简单交互版

import optparse

def sshCon(host,port,username,password):
    ssh=paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    ssh.connect(hostname=host,port=int(port),username=username,password=str(password),timeout=5)
    while True:
        command=raw_input(">>>#:")
        if command=='q' or command=='quit':
            print("ssh break!!!")
            break
        stdin,stdout,stderr=ssh.exec_command(command)
        if len(stderr.read())!=0:
            print stderr
            print("command error!!!!")
            continue

        output=stdout.read()
        print output
    #关闭ssh连接
    ssh.close()

    pass

def main():
    usage="./ssh.py [hostname] [port] [username] [password]"
    parser=optparse.OptionParser(usage)
    parser.add_option('-P','--port',dest="port",help="port")
    parser.add_option('-H','--hostname',dest='hostname',help="hostname")
    parser.add_option('-u','--username',dest='username',help="webserver username")
    parser.add_option('-p','--password',dest='password',help='password')
    option,args=parser.parse_args()

    if option.hostname is None or option.port is None or option.username is None or option.password is None:
        print usage
        exit(0)
    host=str(option.hostname)
    print host
    port=int(option.port)
    user=str(option.username)
    passwd=str(option.password)

    print option
    sshCon(host,port,user,passwd)

if __name__ == '__main__':
    main()

SFTPClient

用于连接远程服务器并执行上传下载

基于用户名密码上传下载

transport=paramiko.Transport(('172.16.0.51',22))
transport.connect(username='cmustard',password='951106')

sftp=paramiko.SFTPClient.from_transport(transport)

#将文件上传到服务器tmp/test.py
sftp.put('client.py','/tmp/client.py')
print "success!!!"

sftp.get('/tmp/test.txt','text.txt')

transport.close()

基于公钥密钥上传下载

key=paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')

transport=paramiko.Transport(('172.16.0.51',22))

transport.connect(username='cmustard',password='951106',pkey=key)

sftp=paramiko.SFTPClient.from_transport(transport)

sftp.put('client.py','/tmp/client.py')

print "success!!!"

sftp.get('/tmp/test.txt','text.txt')

一个小实例

在介绍写一个例子之前,先介绍uuid模块

uuid模块

UUID是128位的全局唯一标识符,通常由32字节的字符串表示。
它可以保证时间和空间的唯一性,也称为GUID,全称为:
UUID —— Universally Unique IDentifier Python 中叫 UUID
GUID —— Globally Unique IDentifier C# 中叫 GUID

它通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性。
UUID主要有五个算法,也就是五种方法来实现:

1、uuid1()——基于时间戳

由MAC地址、当前时间戳、随机数生成。可以保证全球范围内的唯一性,
但MAC的使用同时带来安全性问题,局域网中可以使用IP来代替MAC。

2、uuid2()——基于分布式计算环境DCE(Python中没有这个函数)

算法与uuid1相同,不同的是把时间戳的前4位置换为POSIX的UID。
实际中很少用到该方法。

3、uuid3()——基于名字的MD5散列值

通过计算名字和命名空间的MD5散列值得到,保证了同一命名空间中不同名字的唯一性,
和不同命名空间的唯一性,但同一命名空间的同一名字生成相同的uuid。

4、uuid4()——基于随机数

由伪随机数得到,有一定的重复概率,该概率可以计算出来。

5、uuid5()——基于名字的SHA-1散列值
算法与uuid3相同,不同的是使用 Secure Hash Algorithm 1 算法

使用方面:

首先,Python中没有基于DCE的,所以uuid2可以忽略;
其次,uuid4存在概率性重复,由无映射性,最好不用;
再次,若在Global的分布式计算环境下,最好用uuid1;
最后,若有名字的唯一性要求,最好用uuid3或uuid5。
import uuid
#基于时间的
uuid1=uuid.uuid1()
print uuid1  #07b3d340-92ca-11e6-8582-2cd05aef7972

uuid3=uuid.uuid3(uuid.NAMESPACE_DNS,'test_str')
print uuid3   #a3544599-ad50-313b-a105-7f12726e6b6f  #基于md5的散列值

uuid4=uuid.uuid4()
print uuid4   #27af677a-a8e9-4ac7-a452-67975d98dab5 每一次不一样,由一定重复率

uuid5=uuid.uuid5(uuid.NAMESPACE_DNS,'test_str') 
print uuid5  #16e7717d-29cc-58ac-b752-b7045812facf  是基于sha1散列值

示例

class Test(object):

    def __init__(self):
        self.host='172.16.0.51'
        self.port=22
        self.username='cmustard'
        self.password='123456'
        self._k=None

    def create_file(self):
        file_name=str(uuid.uuid4())  #随机生成一个文件名
        with open(file_name,'w') as f:
            f.write('sb')

        return file_name

    def connect_transport(self):
        transport=paramiko.Transport((self.host,self.port))
        transport.connect(username=self.username,password=self.password)
        self.__transport=transport  #私有变量,用于后面的命令执行


    def close(self):
        self.__transport.close()

    def upload(self):
        #连接,上传
        file_name=self.create_file()

        sftp=paramiko.SFTPClient.from_transport(self.__transport)
        #将location.py上传至服务器的/tmp/test.py
        sftp.put('client.py','/tmp/c.py')


    def rename(self):
        ssh=paramiko.SSHClient()
        ssh._transport=self.__transport
        #执行命令
        stdin,stdout,stderr=ssh.exec_command('mv /home/cmustard/11111111.py /home/cmustard/22222222.py')

        #获取命令结果
        result=stdout.read()



    def run(self):
        self.connect_transport()
        self.upload()
        self.rename()
        self.close()

c=Test()
c.run()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值