• 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
  • 相关阅读:
    【Unity】2D角色跳跃控制器
    Linux基础命令 Linux 显示历史操作
    Vue 中 v-if 和 v-show 有什么区别?
    a标签中rel=“noreferrer noopener“的含义与作用
    R语言电信公司churn数据客户流失 k近邻(knn)模型预测分析
    网络安全(黑客)自学
    【数据库数据恢复】SQL Server数据库磁盘空间不足的数据恢复案例
    python:使用Flask-SQLAlchemy对数据库增删改查的简单示例
    【笔记】Spring Boot 历史官方文档学习(持续更新)
    uniCloud云开发及一键生成代码
  • 原文地址:https://blog.csdn.net/weixin_43166518/article/details/133715313