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()