Python 利用socket 实现 ssh 跳转

1.场景描述:

主机A 主机B 主机C

10.13.170.76

172.28.117.156(squid) 10.95.113.131

主机A---->主机B(80)--->主机C(22), A通过B的80访问主机C131

2.Python代码;

import paramiko
import socket
import logging
from base64 import b64encode
import time

logging.basicConfig(loglevel=logging.DEBUG)
LOG = logging.getLogger("squid")

def http_proxy(proxy,target,auth=None, timeout=None):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout)
    sock.connect(proxy)
    LOG.debug("connected")
    cmd_connect = "CONNECT %s:%d HTTP/1.1\r\n" % target
    if auth is not None:
        cmd_connect += " : basic %s\r\n" % b64encode(‘%s:%s‘ % auth)
    cmd_connect += "\r\n"
    LOG.debug("--> %s" % str(cmd_connect))
    sock.sendall(cmd_connect)
    response = []
    sock.settimeout(2)  
    try:
        # in worst case this loop will take 2 seconds if not response was received (sock.timeout)
        while True:
            chunk = sock.recv(1024)
            if not chunk: 
                break
            response.append(chunk)
            if "\r\n\r\n" in chunk: 
                break
    except socket.error,se:
        if "timed out" not in se:
            response = [se]
    response = ‘‘.join(response)
    LOG.debug("<-- %s" % str(response))
    if "200 connection established" not in response.lower():
        raise Exception("Unable to establish HTTP-Tunnel: %s" % str(response))
    return sock

if __name__ == "__main__":
    LOG.setLevel(logging.DEBUG)
    LOG.debug("--start--")
    sock = http_proxy(proxy=("172.28.117.157", 80),
                      target=("10.95.113.131", 22),
                      auth=(‘germany‘, ‘germany‘),
                      timeout=50)
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname="10.95.113.131", sock=sock, username="root", password="123")
    # time.sleep(100)
    print "#> login users \n%s" % ssh.exec_command("w")[1].read()

运行结果:

/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/germany/workspace/python2_study/python_squid.py
DEBUG:squid:--start--
DEBUG:squid:connected
DEBUG:squid:--> CONNECT 10.95.113.131:22 HTTP/1.1
proxy-authorization: basic Z2VybWFueTpnZXJtYW55

DEBUG:squid:<-- HTTP/1.0 200 Connection established

#> login user 
 15:23:01 up 102 days,  7:57,  1 user,  load average: 0.04, 0.09, 0.14
USER     TTY      FROM              [email protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    172.28.117.157   15:03   11:20   0.01s  0.01s -bash

Process finished with exit code 0

3.总结:

主要在于生成paramiko中connect连接中需要的代理sock,其中连接squid是采用http tunnel,http tunnel 有connect报文,socket中拼接相对应的报文格式  就能与squid建立连接。由于squid使用的是Basic auth 因此需要使用 b64encode对用户名和密码编码。

时间: 2024-12-21 13:14:53

Python 利用socket 实现 ssh 跳转的相关文章

【学习笔记】Python网络编程(三)利用socket模拟ssh协议

上代码,server端: import socket,os s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) host = '' port = 1051 s.bind((host,port)) s.listen(4) while 1:     conn,addr = s.accept()     while 1:         data = conn.recv(1024)         if not data:break        

python之socket-ssh实例

本文转载自大王http://www.cnblogs.com/alex3714/articles/5830365.html 加有自己的注释,应该会比原文更突出重点些 一. 基本Socket实例 前面讲了这么多,到底咋么用呢? 1 import socket 2 3 server = socket.socket() #获得socket实例 4 5 server.bind(("localhost",9998)) #绑定ip port 6 server.listen() #开始监听 7 pri

Python 简单socket模拟ssh

OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份验证 表示层 数据表示: 确保接收系统可以读出该数据: 格式化数据: 构建数据: 协商用于应用层的数据传输语法: 提供加密 回话层 主机间通信: 建立.管理和终止在应用程序之间的会话 传输层 传输问题: 确保数据传输的可靠性: 建立.维护和终止虚拟电路: 通过错误检测和恢复: 信息流控制来保证可靠性

[python网络编程]利用socket编写简单的服务器

利用socket编写简单的服务器 步骤解析 建立socket对象 这一步跟我们上次使用socket做客户端是一样的,都需要有一个socket连接 s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 设置socket选项(setsockopt) 选项介绍setsockopt(set socket option),参数设置格式:setsockopt(level,optname,value) 各选项的关系:1.level:level的设定决定了op

python模块paramiko与ssh

paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BSD, MacOS X, Windows等平台通过SSH从一个平台连接到另外一个平台.利用该模块,可以方便的进行ssh连接和sftp协议进行sftp文件传输. 一.安装 paramiko模块依赖PyCrypto模块,而PyCrypto需要GCC库编译,不过一般发行版的源里带有该模块.centos6,直接借助以下命令可以直接完成安装

python模块paramiko与ssh安装配置教程

一.paramiko模块的安装 paramiko模块依赖PyCrypto模块,而PyCrypto需要GCC库编译,不过一般发行版的源里带有该模块.这里以centos6为例,直接借助以下命令可以直接完成安装:  代码如下 复制代码 # yum install gcc python-crypto python-paramiko python-devel  -y   windows版下可以安装windows版的GCC(MinGW),然后编辑安装pycrypto和paramiko ,下载安成后,直接运行

Python 使用Socket实现FTP功能

FtpServer #!/usr/bin/env python import SocketServer class MyServer(SocketServer.BaseRequestHandler):   def setup(self):      pass   def handle(self):      path='/tmp'      while True:          print self.request,self.client_address,self.server       

Python中socket初次尝试

算了,选择了Python就一路走下去,管对还是错,既然选择了前方,就不要顾风雨兼程,今天看了Python的socket的编程,真实遇到了各种问题,防火墙,error 10054 ,10049 ,自己就在百度上各种搜索,最终还是出来了,bug调出来的那感觉只有自己最清楚.这些都是自己socket的时候,一些笔记: 1  .netstat -no 这个命令是察看端口的,并且可以通过pid察看是哪些程序在用这些端口! 2  在Python中或其它语言中,利用Socket编写服务器和客户端通信程序,经常

C++和python利用struct结构传输二进制数据实现

网络编程中经常会涉及到二进制数据传输的问题,在C++中常用的传输方式有文本字符串和结构体封包.如果能将要发送的数据事先放进连续的内存区,然后让send函数获取这片连续内存区的首地址就可以完成数据的发送了,文本字符串如char型数组,以字节为单位,在内存中是顺序存储的,所以可以直接用send函数发送.但是如果要同时发送多个不同类型的数据时,它们在内存中存储的地址是随机的,不是顺序存储的,而且它们之间的相对位置也无法确定,这样就需要一种数据组织方式来明确各数据之间的相对位置.结构体显然就是一种的数据