Python Paramiko模块的使用实际案例
本文研究的主要是PythonParamiko模块的使用的实例,具体如下。
Windows下有很多非常好的SSH客户端,比如Putty。在python的世界里,你可以使用原始套接字和一些加密函数创建自己的SSH客户端或服务端,但如果有现成的模块,为什么还要自己实现呢。使用Paramiko库中的PyCrypto能够让你轻松使用SSH2协议。
Paramiko的安装方法网上有很多这样的帖子,这里就不描述了。这里主要讲如何使用它。Paramiko实现SSH2不外乎从两个角度实现:SSH客户端与服务端。
首先让我们理清以下几个名词:
- SSHClient:包装了Channel、Transport、SFTPClient
- Channel:是一种类Socket,一种安全的SSH传输通道;
- Transport:是一种加密的会话(但是这样一个对象的Session并未建立),并且创建了一个加密的tunnels,这个tunnels叫做Channel;
- Session:是client与Server保持连接的对象,用connect()/start_client()/start_server()开始会话。
具体请参考Paramiko的库文档:http://docs.paramiko.org/en/2.0/index.html
下面给出几个常用的使用案例:
SSH客户端实现方案一,执行远程命令
这个方案直接使用SSHClient对象的exec_command()在服务端执行命令,下面是具体代码:
#实例化SSHClient client=paramiko.SSHClient() #自动添加策略,保存服务器的主机名和密钥信息 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接SSH服务端,以用户名和密码进行认证 client.connect(ip,username=user,password=passwd) #打开一个Channel并执行命令 stdin,stdout,stderr=client.exec_command(command) #打印执行结果 printstdout.readlines() #关闭SSHClient client.close()
SSH客户端实现方案二,执行远程命令
这个方案是将SSHClient建立连接的对象得到一个Transport对象,以Transport对象的exec_command()在服务端执行命令,下面是具体代码:
#实例化SSHClient client=paramiko.SSHClient() #自动添加策略,保存服务器的主机名和密钥信息 client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接SSH服务端,以用户名和密码进行认证 client.connect(ip,username=user,password=passwd) #实例化Transport,并建立会话Session ssh_session=client.get_transport().open_session() ifssh_session.active: ssh_session.exec_command(command) printssh_session.recv(1024) client.close()
SSH服务端的实现
实现SSH服务端必须继承ServerInterface,并实现里面相应的方法。具体代码如下:
importsocket
importsys
importthreading
importparamiko
host_key=paramiko.RSAKey(filename='private_key.key')
classServer(paramiko.ServerInterface):
def__init__(self):
#执行start_server()方法首先会触发Event,如果返回成功,is_active返回True
self.event=threading.Event()
#当is_active返回True,进入到认证阶段
defcheck_auth_password(self,username,password):
if(username=='root')and(password=='123456'):
returnparamiko.AUTH_SUCCESSFUL
returnparamiko.AUTH_FAILED
#当认证成功,client会请求打开一个Channel
defcheck_channel_request(self,kind,chanid):
ifkind=='session':
returnparamiko.OPEN_SUCCEEDED
#命令行接收ip与port
server=sys.argv[1]
ssh_port=int(sys.argv[2])
#建立socket
try:
sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#TCPsocket
sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
sock.bind((server,ssh_port))
sock.listen(100)
print'[+]Listeningforconnection...'
client,addr=sock.accept()
exceptException,e:
print'[-]Listenfailed:'+str(e)
sys.exit(1)
print'[+]Gotaconnection!'
try:
#用sock.accept()返回的socket实例化Transport
bhSession=paramiko.Transport(client)
#添加一个RSA密钥加密会话
bhSession.add_server_key(host_key)
server=Server()
try:
#启动SSH服务端
bhSession.start_server(server=server)
exceptparamiko.SSHException,x:
print'[-]SSHnegotiationfailed'
chan=bhSession.accept(20)
print'[+]Authenticated!'
printchan.recv(1024)
chan.send("Welcometomyssh")
whileTrue:
try:
command=raw_input("Entercommand:").strip("\n")
ifcommand!='exit':
chan.send(command)
printchan.recv(1024)+'\n'
else:
chan.send('exit')
print'exiting'
bhSession.close()
raiseException('exit')
exceptKeyboardInterrupt:
bhSession.close()
exceptException,e:
print'[-]Caughtexception:'+str(e)
try:
bhSession.close()
except:
pass
sys.exit(1)
使用SFTP上传文件
importparamiko
#获取Transport实例
tran=paramiko.Transport(("host_ip",22))
#连接SSH服务端
tran.connect(username="username",password="password")
#获取SFTP实例
sftp=paramiko.SFTPClient.from_transport(tran)
#设置上传的本地/远程文件路径
localpath="/root/Desktop/python/NewNC.py"
remotepath="/tmp/NewNC.py"
#执行上传动作
sftp.put(localpath,remotepath)
tran.close()
使用SFTP下载文件
importparamiko
#获取SSHClient实例
client=paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#连接SSH服务端
client.connect("host_ip",username="username",password="password")
#获取Transport实例
tran=client.get_transport()
#获取SFTP实例
sftp=paramiko.SFTPClient.from_transport(tran)
remotepath='/tmp/NewNC.py'
localpath='/root/Desktop/NewNC.py'
sftp.get(remotepath,localpath)
client.close()
总结
以上就是本文关于PythonParamiko模块的使用实际案例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!