专栏首页python3Python 利用socket 实现 s

Python 利用socket 实现 s

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              LOGIN@   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对用户名和密码编码。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python UDP套接字通信

    py3study
  • Python简单实现Web服务器

    py3study
  • python3-UDP详解

    py3study
  • Python web框架开发 - WSGI协议

    前面我利用TCP协议,返回HTTP数据的方法,实现了web静态页面返回的服务端功能。 但是这样并不能满足大部分的功能需求。

    Devops海洋的渔夫
  • 置换检验概述及其在R中的实现

    某些差异分析方法建立在观测数据服从较好的特定理论分布的基础上,如常见的参数检验T检验、方差分析等,假定观测数据抽样自正态分布;再如分析差异表达基因时最常用的负二...

    用户7585161
  • 3-2 数组元素的区间删除 (20 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • 1-4 数组元素的区间删除 (20 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • 基于TCP的套接字

    socket通信流程与打电话流程类似,我们就以打电话为例来实现一个low版的套接字通信

    超蛋lhy
  • 使用socket实现TCP和UDP传输

    转载自:https://blog.csdn.net/timmiy/article/details/51946093

    战神伽罗
  • iOS 9对前端做了什么?

    随着9月25日iPhone6s的发货,早已预订的人是不是心里开始有点小激动了。那么它的到来对于前端来说有哪些新东西? Force Touch 针对此次的3D ...

    腾讯大数据

扫码关注云+社区

领取腾讯云代金券