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