題目說的有點長,其實就是以下幾件事,第1是讓Shell命令可以在程序內履行,然后將履行結果傳遞給變量,從而可以進行后續的事務處理,第2是使用nmap命令獲得當前局域網內所有在線IP和開放的端口,最后就是對nmap取得的結果進行處理,得到只有IP和端口的結果。
Linux命令行的強大功能相信使用Linux的人都知道,1個命令等于你在windows用幾百行乃至上千行的代碼量才能實現,所以,如果很好的利用shell命令,可以說是事半功倍。
而要充分利用shell的結果,必定是需要取得可以處理的命令返回結果。
主要是利用以下的函數:
函數定義:
函數說明:
popen()函數通過創建1個管道,調用fork()產生1個子進程,履行1個shell以運行命令來開啟1個進程。這個管道必須由pclose()函數關閉,而不是fclose()函數。pclose()函數關閉標準I/O流,等待命令履行結束,然后返回shell的終止狀態。如果shell不能被履行,則pclose()返回的終止狀態與shell已履行exit1樣。
type參數只能是讀或寫中的1種,得到的返回值(標準I/O流)也具有和type相應的只讀或只寫類型。如果type是"r"則文件指針連接到command的標準輸出;如果type是"w"則文件指針連接到command的標準輸入。
command參數是1個指向以NULL結束的shell命令字符串的指針。這行命令將被傳到bin/sh并使用-c標志,shell將履行這個命令。
popen()的返回值是個標準I/O流,必須由pclose來終止。前面提到這個流是單向的(只能用于讀或寫)。向這個流寫內容相當于寫入該命令的標準輸入,命令的標準輸出和調用popen()的進程相同;與之相反的,從流中讀數據相當于讀取命令的標準輸出,命令的標準輸入和調用popen()的進程相同。
返回值:
如果調用fork()或pipe()失敗,或不能分配內存將返回NULL,否則返回標準I/O流。popen()沒有為內存分配失敗設置errno值。如果調用fork()或pipe()時出現毛病,errno被設為相應的毛病類型。如果type參數不合法,errno將返回EINVAL。
使用方法: