#echo serverpython
zhou@ubuntu:~$ cat test.py #!/usr/bin/env python import sys while True: s = sys.stdin.read(1) if s: sys.stdout.write(s) sys.stdout.flush()
nc -l -k --sh-exec 'python test.py' 127.0.0.1 8086
zhou@ubuntu:~$ nc 127.0.0.1 8086 123 123 1444455 1444455
nmap.org的ncat支持--sh-exec和--lua-exec參數, 提供了這兩個參數後, ncat會在appcet(-l)或connet後fork一個子進程,前者經過exec /bin/sh -c 來執行sh命令, 後者直接執行lua腳本. 同時,會生成兩個pipe組, 將子進程的stdin和stdout分別重定向到兩個pipe. ncat主進程在從socket收到數據後,會將數據發送到pipe中,因爲子進程的stdin已經被重定向, 因此子進程中從stdin讀至關於從pipe讀,而pipe的數據就是socket過來的數據. 利用這個特性,咱們就能夠隨意發揮了. 這將大大方便基於socket的服務的測試打樁. 以上就是簡單的echo server的實現.ubuntu
因爲有--lua-exec這個選項, 我一開始是直接寫lua腳本的, 從源代碼提供的demo腳本看看,lua腳本直接從stdin stdout讀寫就能夠了,我覺得是ncat重寫了lua的print ,io等模塊(函數), 看了代碼以後才發現機制是如上所述.app
ncat帶的lua是5.2版本, 沒有pack unpack之類的函數(lua 5.3引入),可是python中是有struct這個模塊,提供pack, unpack, 方便處理二進制數據.socket