• python 脚本一键搭建socks5代理


    1. #!/usr/bin/env python3
    2. import argparse
    3. import logging
    4. import os
    5. import platform
    6. import signal
    7. import struct
    8. import sys
    9. import threading
    10. from socket import AF_INET, SOCK_STREAM, socket
    11. from socketserver import BaseServer, StreamRequestHandler, ThreadingTCPServer
    12. __author__ = 'Youchao Feng'
    13. support_os = ('Darwin', 'Linux')
    14. current_os = platform.system()
    15. def byte_to_int(b):
    16. """
    17. Convert Unsigned byte to int
    18. :param b: byte value
    19. :return: int value
    20. """
    21. return b & 0xFF
    22. def port_from_byte(b1, b2):
    23. """
    24. :param b1: First byte of port
    25. :param b2: Second byte of port
    26. :return: Port in Int
    27. """
    28. return byte_to_int(b1) << 8 | byte_to_int(b2)
    29. def host_from_ip(a, b, c, d):
    30. a = byte_to_int(a)
    31. b = byte_to_int(b)
    32. c = byte_to_int(c)
    33. d = byte_to_int(d)
    34. return "%d.%d.%d.%d" % (a, b, c, d)
    35. def get_command_name(value):
    36. """
    37. Gets command name by value
    38. :param value: value of Command
    39. :return: Command Name
    40. """
    41. if value == 1:
    42. return 'CONNECT'
    43. elif value == 2:
    44. return 'BIND'
    45. elif value == 3:
    46. return 'UDP_ASSOCIATE'
    47. else:
    48. return None
    49. def build_command_response(reply):
    50. start = b'\x05%s\x00\x01\x00\x00\x00\x00\x00\x00'
    51. return start % reply.get_byte_string()
    52. def close_session(session):
    53. session.get_client_socket().close()
    54. logging.info("Session[%s] closed", session.get_id())
    55. def run_daemon_process(stdout='/dev/null',
    56. stderr=None,
    57. stdin='/dev/null',
    58. pid_file=None,
    59. start_msg='started with pid %s'):
    60. """
    61. This forks the current process into a daemon.
    62. The stdin, stdout, and stderr arguments are file names that
    63. will be opened and be used to replace the standard file descriptors
    64. in sys.stdin, sys.stdout, and sys.stderr.
    65. These arguments are optional and default to /dev/null.
    66. Note that stderr is opened unbuffered, so
    67. if it shares a file with stdout then interleaved output
    68. may not appear in the order that you expect.
    69. """
    70. # flush io
    71. sys.stdout.flush()
    72. sys.stderr.flush()
    73. # Do first fork.
    74. try:
    75. if os.fork() > 0:
    76. sys.exit(0) # Exit first parent.
    77. except OSError as e:
    78. sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
    79. sys.exit(1)
    80. # Decouple from parent environment.
    81. os.chdir("/")
    82. os.umask(0)
    83. os.setsid()
    84. # Do second fork.
    85. try:
    86. if os.fork() > 0:
    87. sys.exit(0) # Exit second parent.
    88. except OSError as e:
    89. sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
    90. sys.exit(1)
    91. # Open file descriptors and print start message
    92. if not stderr:
    93. stderr = stdout
    94. si = open(stdin, 'r')
    95. so = open(stdout, 'a+')
    96. se = open(stderr, 'ba+', 0) # unbuffered
    97. pid = str(os.getpid())
    98. sys.stderr.write(start_msg % pid)
    99. sys.stderr.flush()
    100. if pid_file:
    101. open(pid_file, 'w+').write("%s\n" % pid)
    102. # Redirect standard file descriptors.
    103. os.dup2(si.fileno(), sys.stdin.fileno())
    104. os.dup2(so.fileno(), sys.stdout.fileno())
    105. os.dup2(se.fileno(), sys.stderr.fileno())
    106. class Session:
    107. index = 0
    108. def __init__(self, client_socket):
    109. Session.index += 1
    110. self.__id = Session.index
    111. self.__client_socket = client_socket
    112. self._attr = {}
    113. def get_id(self):
    114. return self.__id
    115. def set_attr(self, key, value):
    116. self._attr[key] = value
    117. def get_client_socket(self):
    118. return self.__client_socket
    119. class AddressType:
    120. IPV4 = 1
    121. DOMAIN_NAME = 3
    122. IPV6 = 4
    123. class SocksCommand:
    124. CONNECT = 1
    125. BIND = 2
    126. UDP_ASSOCIATE = 3
    127. class SocksMethod:
    128. NO_AUTHENTICATION_REQUIRED = 0
    129. GSS_API = 1
    130. USERNAME_PASSWORD = 2
    131. class ServerReply:
    132. def __init__(self, value):
    133. self.__value = value
    134. def get_byte_string(self):
    135. if self.__value == 0:
    136. return b'\x00'
    137. elif self.__value == 1:
    138. return b'\x01'
    139. elif self.__value == 2:
    140. return b'\x02'
    141. elif self.__value == 3:
    142. return b'\x03'
    143. elif self.__value == 4:
    144. return b'\x04'
    145. elif self.__valu
  • 相关阅读:
    vscode支持c++编译
    qlistwidget不显示内容
    go语言window|mac|linux下交叉编译其他平台的软件包
    十六、Lua 文件 I/O的学习
    CentOS 7.9 安装 epel-release
    施工企业数字化转型如何避免IT技术与企业管理的“两张皮”
    mysql、oracle、sqlsever使用不同案例
    2.6 Docker部署多个前端项目
    基于Android驾校驾考助手 java驾照考试系统
    C++设计模式---命令模式
  • 原文地址:https://blog.csdn.net/weixin_43166518/article/details/133715313