Ⅰ python和shell有什麼區別
1、Python不需要記憶太多的命令,語法簡單,有C基礎的人學起來非常容易上手,易於使用;而shell要學的命令有很多,但常用的命令不是很多。
2、Python可移植性好,它的標準是統一的,不會出現因為平台的不同運行結果不同,但shell的命令在各個平台上有些不一樣。
3、Python更加強大,shell是一種命令語言,同時也可以看成是一個命令解釋器,用於接收諸如awk、sed的命令調用等完成相關的功能。而Python則是一種編程語言,Python提供給程序員更大的自由度和靈活性,以完成shell所不能完成或者難於完成的編碼任務,如實現面向對象的模塊化設計、操作伺服器資料庫等。
4、Python支持面向對象、支持可擴展性和可嵌入性,同時提供了功能豐富的庫。
5、性能方面,很明顯地,Python的執行效率要高於shell,有一個很充分的理由就是shell本身的各種進程間IPC通信要造成相當大的開銷;而Python底層是C語言實現的,其性能可以接近於C,但具體相同功能的Python代碼量卻要比C短很多倍,因此Python的性能高於shell。
Ⅱ Python滲透測試工具都有哪些
網路
Scapy, Scapy3k: 發送,嗅探,分析和偽造網路數據包。可用作互動式包處理程序或單獨作為一個庫
pypcap, Pcapy, pylibpcap: 幾個不同 libpcap 捆綁的python庫
libdnet: 低級網路路由,包括埠查看和乙太網幀的轉發
dpkt: 快速,輕量數據包創建和分析,面向基本的 TCP/IP 協議
Impacket: 偽造和解碼網路數據包,支持高級協議如 NMB 和 SMB
pynids: libnids 封裝提供網路嗅探,IP 包碎片重組,TCP 流重組和埠掃描偵查
Dirtbags py-pcap: 無需 libpcap 庫支持讀取 pcap 文件
flowgrep: 通過正則表達式查找數據包中的 Payloads
Knock Subdomain Scan: 通過字典枚舉目標子域名
SubBrute: 快速的子域名枚舉工具
Mallory: 可擴展的 TCP/UDP 中間人代理工具,可以實時修改非標准協議
Pytbull: 靈活的 IDS/IPS 測試框架(附帶超過300個測試樣例)
調試和逆向工程
Paimei: 逆向工程框架,包含PyDBG, PIDA , pGRAPH
Immunity Debugger: 腳本 GUI 和命令行調試器
mona.py: Immunity Debugger 中的擴展,用於代替 pvefindaddr
IDAPython: IDA pro 中的插件,集成 Python 編程語言,允許腳本在 IDA Pro 中執行
PyEMU: 全腳本實現的英特爾32位模擬器,用於惡意軟體分析
pefile: 讀取並處理 PE 文件
pydasm: Python 封裝的libdasm
PyDbgEng: Python 封裝的微軟 Windows 調試引擎
uhooker: 截獲 DLL 或內存中任意地址可執行文件的 API 調用
diStorm: AMD64 下的反匯編庫
python-ptrace: Python 寫的使用 ptrace 的調試器
vdb/vtrace: vtrace 是用 Python 實現的跨平台調試 API, vdb 是使用它的調試器
Androguard: 安卓應用程序的逆向分析工具
Capstone: 一個輕量級的多平台多架構支持的反匯編框架。支持包括ARM,ARM64,MIPS和x86/x64平台
PyBFD: GNU 二進制文件描述(BFD)庫的 Python 介面
Fuzzing
Sulley: 一個模糊器開發和模糊測試的框架,由多個可擴展的構件組成的
Peach Fuzzing Platform: 可擴展的模糊測試框架(v2版本 是用 Python 語言編寫的)
antiparser: 模糊測試和故障注入的 API
TAOF: (The Art of Fuzzing, 模糊的藝術)包含 ProxyFuzz, 一個中間人網路模糊測試工具
untidy: 針對 XML 模糊測試工具
Powerfuzzer: 高度自動化和可完全定製的 Web 模糊測試工具
SMUDGE: 純 Python 實現的網路協議模糊測試
Mistress: 基於預設模式,偵測實時文件格式和偵測畸形數據中的協議
Fuzzbox: 媒體多編碼器的模糊測試
Forensic Fuzzing Tools: 通過生成模糊測試用的文件,文件系統和包含模糊測試文件的文件系統,來測試取證工具的魯棒性
Windows IPC Fuzzing Tools: 使用 Windows 進程間通信機制進行模糊測試的工具
WSBang: 基於 Web 服務自動化測試 SOAP 安全性
Construct: 用於解析和構建數據格式(二進制或文本)的庫
fuzzer.py(feliam): 由 Felipe Andres Manzano 編寫的簡單模糊測試工具
Fusil: 用於編寫模糊測試程序的 Python 庫
Web
Requests: 優雅,簡單,人性化的 HTTP 庫
HTTPie: 人性化的類似 cURL 命令行的 HTTP 客戶端
ProxMon: 處理代理日誌和報告發現的問題
WSMap: 尋找 Web 伺服器和發現文件
Twill: 從命令行界面瀏覽網頁。支持自動化網路測試
Ghost.py: Python 寫的 WebKit Web 客戶端
Windmill: Web 測試工具幫助你輕松實現自動化調試 Web 應用
FunkLoad: Web 功能和負載測試
spynner: Python 寫的 Web瀏覽模塊支持 Javascript/AJAX
python-spidermonkey: 是 Mozilla JS 引擎在 Python 上的移植,允許調用 Javascript 腳本和函數
mitmproxy: 支持 SSL 的 HTTP 代理。可以在控制台介面實時檢查和編輯網路流量
pathod/pathoc: 變態的 HTTP/S 守護進程,用於測試和折磨 HTTP 客戶端
Ⅲ 怎樣在Python中操作Docker容器
Docker容器運行後,如何進入容器進行操作呢看起初我是用SSH。如果只啟動一個容器,用SSH還能應付,只需要將容器的22埠映射到本機的一個埠即可。當我啟動了五個容器後,每個容器默認是沒有配置SSH Server的,安裝配置SSHD,映射容器SSH埠,實在是麻煩。 我發現很多Docker鏡像都是沒有安裝SSHD服務的,難道有其他方法進入Docker容器看 有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。 使用 attach 命令有時候並不方便。當多個窗口同時 attach 到同一個容器的時候,所有窗口都會同步顯示。 nsenter 可以訪問另一個進程的名字空間。 為了連接到容器,你還需要找到容器的第一個進程的 PID,可以通過下面的命令獲取。 PID=$(docker inspect –format 逗{{ .State.Pid }}地 <container>) //將<container>換成你的容器id 通過這個 PID,就可以連接到這個容器: $ nsenter –target $PID –mount –uts –ipc –net –pid 更簡單的,建議大家下載 .bashrc_docker,並將內容放到 .bashrc 中。
Ⅳ 如何實現C/C++與Python的通信
這個可以稱之為兩個軟體(進程)之間的通信。
進程間通信主要包括管道, 系統IPC(包括消息隊列,信號量,共享存儲), SOCKET.
比如:你可以共同訪問計算機上的一個txt文件
也可以使用socket通信
也可以使用資料庫,
等等
都能達到通信的目的
Ⅳ 一篇文章帶你深度解析Python線程和進程
使用Python中的線程模塊,能夠同時運行程序的不同部分,並簡化設計。如果你已經入門Python,並且想用線程來提升程序運行速度的話,希望這篇教程會對你有所幫助。
線程與進程
什麼是進程
進程是系統進行資源分配和調度的一個獨立單位 進程是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。每個進程都有自己的獨立內存空間,不同進程通過進程間通信來通信。由於進程比較重量,占據獨立的內存,所以上下文進程間的切換開銷(棧、寄存器、虛擬內存、文件句柄等)比較大,但相對比較穩定安全。
什麼是線程
CPU調度和分派的基本單位 線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。線程間通信主要通過共享內存,上下文切換很快,資源開銷較少,但相比進程不夠穩定容易丟失數據。
進程與線程的關系圖
線程與進程的區別:
進程
現實生活中,有很多的場景中的事情是同時進行的,比如開車的時候 手和腳共同來駕駛 汽車 ,比如唱歌跳舞也是同時進行的,再比如邊吃飯邊打電話;試想如果我們吃飯的時候有一個領導來電,我們肯定是立刻就接聽了。但是如果你吃完飯再接聽或者回電話,很可能會被開除。
注意:
多任務的概念
什麼叫 多任務 呢?簡單地說,就是操作系統可以同時運行多個任務。打個比方,你一邊在用瀏覽器上網,一邊在聽MP3,一邊在用Word趕作業,這就是多任務,至少同時有3個任務正在運行。還有很多任務悄悄地在後台同時運行著,只是桌面上沒有顯示而已。
現在,多核CPU已經非常普及了,但是,即使過去的單核CPU,也可以執行多任務。由於CPU執行代碼都是順序執行的,那麼,單核CPU是怎麼執行多任務的呢?
答案就是操作系統輪流讓各個任務交替執行,任務1執行0.01秒,切換到任務2,任務2執行0.01秒,再切換到任務3,執行0.01秒,這樣反復執行下去。表面上看,每個任務都是交替執行的,但是,由於CPU的執行速度實在是太快了,我們感覺就像所有任務都在同時執行一樣。
真正的並行執行多任務只能在多核CPU上實現,但是,由於任務數量遠遠多於CPU的核心數量,所以,操作系統也會自動把很多任務輪流調度到每個核心上執行。 其實就是CPU執行速度太快啦!以至於我們感受不到在輪流調度。
並行與並發
並行(Parallelism)
並行:指兩個或兩個以上事件(或線程)在同一時刻發生,是真正意義上的不同事件或線程在同一時刻,在不同CPU資源呢上(多核),同時執行。
特點
並發(Concurrency)
指一個物理CPU(也可以多個物理CPU) 在若幹道程序(或線程)之間多路復用,並發性是對有限物理資源強制行使多用戶共享以提高效率。
特點
multiprocess.Process模塊
process模塊是一個創建進程的模塊,藉助這個模塊,就可以完成進程的創建。
語法:Process([group [, target [, name [, args [, kwargs]]]]])
由該類實例化得到的對象,表示一個子進程中的任務(尚未啟動)。
注意:1. 必須使用關鍵字方式來指定參數;2. args指定的為傳給target函數的位置參數,是一個元祖形式,必須有逗號。
參數介紹:
group:參數未使用,默認值為None。
target:表示調用對象,即子進程要執行的任務。
args:表示調用的位置參數元祖。
kwargs:表示調用對象的字典。如kwargs = {'name':Jack, 'age':18}。
name:子進程名稱。
代碼:
除了上面這些開啟進程的方法之外,還有一種以繼承Process的方式開啟進程的方式:
通過上面的研究,我們千方百計實現了程序的非同步,讓多個任務可以同時在幾個進程中並發處理,他們之間的運行沒有順序,一旦開啟也不受我們控制。盡管並發編程讓我們能更加充分的利用IO資源,但是也給我們帶來了新的問題。
當多個進程使用同一份數據資源的時候,就會引發數據安全或順序混亂問題,我們可以考慮加鎖,我們以模擬搶票為例,來看看數據安全的重要性。
加鎖可以保證多個進程修改同一塊數據時,同一時間只能有一個任務可以進行修改,即串列的修改。加鎖犧牲了速度,但是卻保證了數據的安全。
因此我們最好找尋一種解決方案能夠兼顧:1、效率高(多個進程共享一塊內存的數據)2、幫我們處理好鎖問題。
mutiprocessing模塊為我們提供的基於消息的IPC通信機制:隊列和管道。隊列和管道都是將數據存放於內存中 隊列又是基於(管道+鎖)實現的,可以讓我們從復雜的鎖問題中解脫出來, 我們應該盡量避免使用共享數據,盡可能使用消息傳遞和隊列,避免處理復雜的同步和鎖問題,而且在進程數目增多時,往往可以獲得更好的可獲展性( 後續擴展該內容 )。
線程
Python的threading模塊
Python 供了幾個用於多線程編程的模塊,包括 thread, threading 和 Queue 等。thread 和 threading 模塊允許程序員創建和管理線程。thread 模塊 供了基本的線程和鎖的支持,而 threading 供了更高級別,功能更強的線程管理的功能。Queue 模塊允許用戶創建一個可以用於多個線程之間 共享數據的隊列數據結構。
python創建和執行線程
創建線程代碼
1. 創建方法一:
2. 創建方法二:
進程和線程都是實現多任務的一種方式,例如:在同一台計算機上能同時運行多個QQ(進程),一個QQ可以打開多個聊天窗口(線程)。資源共享:進程不能共享資源,而線程共享所在進程的地址空間和其他資源,同時,線程有自己的棧和棧指針。所以在一個進程內的所有線程共享全局變數,但多線程對全局變數的更改會導致變數值得混亂。
代碼演示:
得到的結果是:
首先需要明確的一點是GIL並不是Python的特性,它是在實現Python解析器(CPython)時所引入的一個概念。就好比C++是一套語言(語法)標准,但是可以用不同的編譯器來編譯成可執行代碼。同樣一段代碼可以通過CPython,PyPy,Psyco等不同的Python執行環境來執行(其中的JPython就沒有GIL)。
那麼CPython實現中的GIL又是什麼呢?GIL全稱Global Interpreter Lock為了避免誤導,我們還是來看一下官方給出的解釋:
主要意思為:
因此,解釋器實際上被一個全局解釋器鎖保護著,它確保任何時候都只有一個Python線程執行。在多線程環境中,Python 虛擬機按以下方式執行:
由於GIL的存在,Python的多線程不能稱之為嚴格的多線程。因為 多線程下每個線程在執行的過程中都需要先獲取GIL,保證同一時刻只有一個線程在運行。
由於GIL的存在,即使是多線程,事實上同一時刻只能保證一個線程在運行, 既然這樣多線程的運行效率不就和單線程一樣了嗎,那為什麼還要使用多線程呢?
由於以前的電腦基本都是單核CPU,多線程和單線程幾乎看不出差別,可是由於計算機的迅速發展,現在的電腦幾乎都是多核CPU了,最少也是兩個核心數的,這時差別就出來了:通過之前的案例我們已經知道,即使在多核CPU中,多線程同一時刻也只有一個線程在運行,這樣不僅不能利用多核CPU的優勢,反而由於每個線程在多個CPU上是交替執行的,導致在不同CPU上切換時造成資源的浪費,反而會更慢。即原因是一個進程只存在一把gil鎖,當在執行多個線程時,內部會爭搶gil鎖,這會造成當某一個線程沒有搶到鎖的時候會讓cpu等待,進而不能合理利用多核cpu資源。
但是在使用多線程抓取網頁內容時,遇到IO阻塞時,正在執行的線程會暫時釋放GIL鎖,這時其它線程會利用這個空隙時間,執行自己的代碼,因此多線程抓取比單線程抓取性能要好,所以我們還是要使用多線程的。
GIL對多線程Python程序的影響
程序的性能受到計算密集型(CPU)的程序限制和I/O密集型的程序限制影響,那什麼是計算密集型和I/O密集型程序呢?
計算密集型:要進行大量的數值計算,例如進行上億的數字計算、計算圓周率、對視頻進行高清解碼等等。這種計算密集型任務雖然也可以用多任務完成,但是花費的主要時間在任務切換的時間,此時CPU執行任務的效率比較低。
IO密集型:涉及到網路請求(time.sleep())、磁碟IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。
當然為了避免GIL對我們程序產生影響,我們也可以使用,線程鎖。
Lock&RLock
常用的資源共享鎖機制:有Lock、RLock、Semphore、Condition等,簡單給大家分享下Lock和RLock。
Lock
特點就是執行速度慢,但是保證了數據的安全性
RLock
使用鎖代碼操作不當就會產生死鎖的情況。
什麼是死鎖
死鎖:當線程A持有獨占鎖a,並嘗試去獲取獨占鎖b的同時,線程B持有獨占鎖b,並嘗試獲取獨占鎖a的情況下,就會發生AB兩個線程由於互相持有對方需要的鎖,而發生的阻塞現象,我們稱為死鎖。即死鎖是指多個進程因競爭資源而造成的一種僵局,若無外力作用,這些進程都將無法向前推進。
所以,在系統設計、進程調度等方面注意如何不讓這四個必要條件成立,如何確定資源的合理分配演算法,避免進程永久占據系統資源。
死鎖代碼
python線程間通信
如果各個線程之間各干各的,確實不需要通信,這樣的代碼也十分的簡單。但這一般是不可能的,至少線程要和主線程進行通信,不然計算結果等內容無法取回。而實際情況中要復雜的多,多個線程間需要交換數據,才能得到正確的執行結果。
python中Queue是消息隊列,提供線程間通信機制,python3中重名為為queue,queue模塊塊下提供了幾個阻塞隊列,這些隊列主要用於實現線程通信。
在 queue 模塊下主要提供了三個類,分別代表三種隊列,它們的主要區別就在於進隊列、出隊列的不同。
簡單代碼演示
此時代碼會阻塞,因為queue中內容已滿,此時可以在第四個queue.put('蘋果')後面添加timeout,則成為 queue.put('蘋果',timeout=1)如果等待1秒鍾仍然是滿的就會拋出異常,可以捕獲異常。
同理如果隊列是空的,無法獲取到內容默認也會阻塞,如果不阻塞可以使用queue.get_nowait()。
在掌握了 Queue 阻塞隊列的特性之後,在下面程序中就可以利用 Queue 來實現線程通信了。
下面演示一個生產者和一個消費者,當然都可以多個
使用queue模塊,可在線程間進行通信,並保證了線程安全。
協程
協程,又稱微線程,纖程。英文名Coroutine。
協程是python個中另外一種實現多任務的方式,只不過比線程更小佔用更小執行單元(理解為需要的資源)。為啥說它是一個執行單元,因為它自帶CPU上下文。這樣只要在合適的時機, 我們可以把一個協程 切換到另一個協程。只要這個過程中保存或恢復 CPU上下文那麼程序還是可以運行的。
通俗的理解:在一個線程中的某個函數,可以在任何地方保存當前函數的一些臨時變數等信息,然後切換到另外一個函數中執行,注意不是通過調用函數的方式做到的,並且切換的次數以及什麼時候再切換到原來的函數都由開發者自己確定。
在實現多任務時,線程切換從系統層面遠不止保存和恢復 CPU上下文這么簡單。操作系統為了程序運行的高效性每個線程都有自己緩存Cache等等數據,操作系統還會幫你做這些數據的恢復操作。所以線程的切換非常耗性能。但是協程的切換只是單純的操作CPU的上下文,所以一秒鍾切換個上百萬次系統都抗的住。
greenlet與gevent
為了更好使用協程來完成多任務,除了使用原生的yield完成模擬協程的工作,其實python還有的greenlet模塊和gevent模塊,使實現協程變的更加簡單高效。
greenlet雖說實現了協程,但需要我們手工切換,太麻煩了,gevent是比greenlet更強大的並且能夠自動切換任務的模塊。
其原理是當一個greenlet遇到IO(指的是input output 輸入輸出,比如網路、文件操作等)操作時,比如訪問網路,就自動切換到其他的greenlet,等到IO操作完成,再在適當的時候切換回來繼續執行。
模擬耗時操作:
如果有耗時操作也可以換成,gevent中自己實現的模塊,這時候就需要打補丁了。
使用協程完成一個簡單的二手房信息的爬蟲代碼吧!
以下文章來源於Python專欄 ,作者宋宋
文章鏈接:https://mp.weixin.qq.com/s/2r3_ipU3HjdA5VnqSHjUnQ
Ⅵ 共享內存實現原理
在磁碟上建立一個文件,每個進程存儲器中,單獨開辟一個空間來映射保存到實際硬碟,實際並沒有反映到主存上。
使得進程之間通過映射同一個普通文件實現共享內存,普通文件被映射到進程地址空間後,進程可以向訪問普通內存一頌銀樣對文件進行訪問,不必再調用read(),write()等操作。
每個進程的共享內存都直接映射到實際物理存儲器上shm保存到物理存儲器(主存),實際的存儲量直接反映到主存上。
進程間需要共享的數據被放在一個叫做 IPC共享內存區域 的地方,所有需要訪問該共享區域的進程都要把該共享區域映射到本進程的地址空間中去。
通過shmget獲得或創建一個IPC共享內存區域,並返回相應的標識符。
每一個共享內存區都有一個控制結構struct shmid_kernel。
主要API :shmget()、shmat()、shmdt()及shmctl()。
ps:Python開啟多進程使用的是multiprocessing,進程傳遞了一個multiprocessing.Queue,使用的肆爛是shm共享內存機制。multiprocessing模塊野雹宴Value Array是基於mmap實現
Ⅶ python:提取txt文件中特定內容後的數據到excel
首先,你的TXT文件格式是否清晰,如果是類似表格的話,假如IPC在每行第三個位置,你可以按行讀取,然後split剪切,得到IPC數據
最好把TXT貼上來比較好