『壹』 python獲取當前socket連接狀態,是連接還是斷開。
socket建立連接後,你可以在上面加一個超時,如果超時異常出現就是斷開了。
另外可以用select(inlist,writelist,errorlist,timeout)的辦法,去輪詢它。超過比如60秒,就認為它超時。
在操作系統層面,你可以用netstat
找到這個socket連接,看它的TCP狀態。如果到了CLOSE_WAIT,
TIME_WAIT,就是對方或者是自己關閉了。
如果是FIN2.。。。SEN。。或者是SYN_XXX就是還是連接或者是發送狀態中。
通常這些狀態在操作系統的TCP協議里都設置有超時。如果超時過了,它自己會關閉。然後變成WAIT狀態。
『貳』 如何進行伺服器的批量管理以及python 的paramiko的模塊
最近對公司的通道機賬號進行改造管理,全面的更加深入的理解了公司賬號管理的架構。(註:基本上所有的機器上的ssh不能使用,只有部分機器能夠使用。為了安全的角度考慮,安裝的不是公版的ssh,而都是定製版的ssh,(限制了機器上的源IP地址即可))。
自動化管理伺服器,有兩種方法:
第一種方法,是我們公司自己開發的(伺服器大概是3W台),基本上伺服器之間不能夠通過ssh互相連通,只能是一台伺服器能夠連到所有的伺服器上,這台伺服器我們稱之為通道機(也叫堡壘機),當我們想登某台伺服器的時候,需要先登上這台通道機,然後經過一系列的驗證之後,就能自動的登上你要登到的伺服器上。
並且我們自己開發了一套叫做通道機API的方式,來管理3W台伺服器,比如收集各台伺服器的信息等。其這個API的本質就是使用的是POST的方式將命令post到目標機上,然後返回結果進行處理即可。這是一個大概的思想。
第二種方法,就是使用ssh的協議進行管理,使用python的paramiko來進行管理,下面會進行介紹:
有一些想法,可以使用python的paramiko模塊來進行管理名下伺服器,前提是能夠ssh到各個伺服器上。
下面對這個paramiko的模塊做個簡單的介紹和分享:
1.簡介:
paramiko是用python語言寫的一個模塊,遵循SSH2協議,支持以加密和認證的方式,進行遠程伺服器的連接。
由於使用的是python這樣的能夠跨平台運行的語言,所以所有python支持的平台,如linux, Solaris, BSD, MacOS X,Windows等,paramiko都可以支持,因此,如果
需要使用SSH從一個平台連接到另外一個平台,進行一系列的操作時,paramiko是最佳工具之一。
舉個常見的例子,現有這樣的需求:需要使用windows客戶端,遠程連接到Linux伺服器,查看上面的日誌狀態,大家通常使用的方法會是:
1:用telnet
2:用PUTTY
3:用WinSCP
4:用XManager等…
那現在如果需求又增加一條,要從伺服器上下載文件,該怎麼辦?那常用的辦法可能會是:
1:Linux上安裝FTP並配置
2:Linux上安裝Sambe並配置…
大家會發現,常見的解決方法都會需要對遠程伺服器必要的配置,如果遠程伺服器只有一兩台還好說,如果有N台,還需要逐台進行配置,或者需要使用代碼進行以上操作
時,上面的辦法就不太方便了。
使用paramiko可以很好的解決以上問題,比起前面的方法,它僅需要在本地上安裝相應的軟體(python以及PyCrypto),對遠程伺服器沒有配置要求,對於連接多台服
務器,進行復雜的連接操作特別有幫助。
2.使用的幾個簡單的案例:
下面是兩種使用paramiko連接到linux伺服器的代碼:
方式一:
1 ssh = paramiko.SSHClient()2 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())3 ssh.connect("IP地址",22,"用戶名","密碼")
上面的第二行代碼的作用是允許連接不在know_hosts文件中的主機。
方式二:
1 t = paramiko.Transport(("IP地址","埠"))2 t.connect(username = 「用戶名」, password = 「口令」)3 如果連接遠程主機需要提供密鑰,上面第二行代碼可改成:4 t.connect(username = 「用戶名」, password = 「口令」, hostkey=」密鑰」)
3.一些簡單的例子:
如果linux伺服器開放了22埠,在windows端,我們可以使用paramiko遠程連接到該伺服器,並執行任意命令,然後通過 print或其它方式得到該結果。
『叄』 netstat和lsof
Netstat 是一款命令行工具,可用於列出系統上所有的網路套接字連接情況,包括 tcp, udp 以及 unix 套接字,另外它還能列出處於監聽狀態(即等待接入請求)的套接字。如果你想確認系統上的 Web 服務有沒有起來,你可以查看80埠有沒有打開
列出所有當前的連接。使用 -a 選項即可:
上述命令列出 tcp, udp 和 unix 協議下所有套接字的所有連接。然而這些信息還不夠詳細,管理員往往需要查看某個協議或埠的具體連接情況。
使用 -t 選項列出 TCP 協議的連罩塌接:
使用 -u 選項列出 UDP 協議的連接:
默認情況下 netstat 會通過反向域名解析技術查找每個 IP 地址對應的主機名。這會降低查找速度。如果你覺得 IP 地址已經足夠,而沒有必要知道主機名,就使用 -n 選項禁用域名解析功能。
任何網路服務的後台進程都會打開一個埠,用於監聽接入的請求。這大悶知些正在監聽的套接字也和連接的套接字一樣,也能被 netstat 列出來。使用 -l 選項列出正在監聽的套接字。
現在我們可以看到處於監聽狀態的 TCP 埠和連接。如果你查看所有監聽埠,去掉 -t 選項。如果你只想查看 UDP 埠,使用 -u 選項,代替 -t 選項。
查看埠9006是否被佔用,及被佔用程序。
查看埠和連接的信息時,能查看到它們對應的進程名和進程號對系統管理員來說是非常有幫助的。舉個栗子,Apache 的 httpd 服務開啟80埠,如果你要查看 http 服務是否已經啟動,或滾消者 http 服務是由 apache 還是 nginx 啟動的,這時候你可以看看進程名。
使用 -p 選項查看進程信息。
python -m SimpleHTTPServer
使用 -p 選項時,netstat 必須運行在 root 許可權之下,不然它就不能得到運行在 root 許可權下的進程名,而很多服務包括 http 和 ftp 都運行在 root 許可權之下。
相比進程名和進程號而言,查看進程的擁有者會更有用。使用 -ep 選項可以同時查看進程名和用戶名。
netstat 也能列印網路介面信息,-i 選項就是為這個功能而生。
上面輸出的信息比較原始。我們將 -e 選項和 -i 選項搭配使用,可以輸出用戶友好的信息。
上面的輸出信息與 ifconfig 輸出的信息一樣。
lsof(list of file)列出伺服器打開的文件
lsof -i:8000
看埠是否佔用一般用兩個: netstat和lsof
1.netstat一般無許可權控制,lsof有許可權控制,只能看到本用戶
2.losf能看到pid和用戶,可以找到哪個進程佔用了這個埠