python關閉埠
㈠ python 查看埠是否開通
一、常見埠掃描的原理
0、秘密掃描
秘密掃描是一種不被審計工具所檢測的掃描技術。
它通常用於在通過普通的防火牆或路由器的篩選(filtering)時隱藏自己。
秘密掃描能躲避IDS、防火牆、包過濾器和日誌審計,從而獲取目標埠的開放或關閉的信息。由於沒有包含TCP 3次握手協議的任何部分,所以無法被記錄下來,比半連接掃描更為隱蔽。
但是這種掃描的缺點是掃描結果的不可靠性會增加,而且掃描主機也需要自己構造IP包。現有的秘密掃描有TCP FIN掃描、TCP ACK掃描、NULL掃描、XMAS掃描和SYN/ACK掃描等。
1、Connect()掃描
此掃描試圖與每一個TCP埠進行「三次握手」通信。如果能夠成功建立接連,則證明埠開發,否則為關閉。准確度很高,但是最容易被防火牆和IDS檢測到,並且在目標主機的日誌中會記錄大量的連接請求以及錯誤信息。
TCP connect埠掃描服務端與客戶端建立連接成功(目標埠開放)的過程:
① Client端發送SYN;
② Server端返回SYN/ACK,表明埠開放;
③ Client端返回ACK,表明連接已建立;
④ Client端主動斷開連接。
建立連接成功(目標埠開放)
TCP connect埠掃描服務端與客戶端未建立連接成功(目標埠關閉)過程:
① Client端發送SYN;
② Server端返回RST/ACK,表明埠未開放。
優點:實現簡單,對操作者的許可權沒有嚴格要求(有些類型的埠掃描需要操作者具有root許可權),系統中的任何用戶都有權力使用這個調用,而且如果想要得到從目標埠返回banners信息,也只能採用這一方法。
另一優點是掃描速度快。如果對每個目標埠以線性的方式,使用單獨的connect()調用,可以通過同時打開多個套接字,從而加速掃描。
缺點:是會在目標主機的日誌記錄中留下痕跡,易被發現,並且數據包會被過濾掉。目標主機的logs文件會顯示一連串的連接和連接出錯的服務信息,並且能很快地使它關閉。
2、SYN掃描
掃描器向目標主機的一個埠發送請求連接的SYN包,掃描器在收到SYN/ACK後,不是發送的ACK應答而是發送RST包請求斷開連接。這樣,三次握手就沒有完成,無法建立正常的TCP連接,因此,這次掃描就不會被記錄到系統日誌中。這種掃描技術一般不會在目標主機上留下掃描痕跡。但是,這種掃描需要有root許可權。
埠開放:1、Client發送SYN 2、Server端發送SYN/ACK 3、Client發送RST斷開(只需要前兩步就可以判斷埠開放)
埠關閉:1、Client發送SYN 2、Server端回復RST(表示埠關閉)
優點:SYN掃描要比TCP Connect()掃描隱蔽一些,SYN僅僅需要發送初始的SYN數據包給目標主機,如果埠開放,則相應SYN-ACK數據包;如果關閉,則響應RST數據包;
3、NULL掃描
㈡ python的串口close()函數關閉不成功
用ser.isOpen()查看返回False,說明ser.close()起作用了啊。用管理員身份打開cmd,再執行腳本試試?
㈢ 【telnetlib】使用Python登錄Cisco交換機執行命令
更多內容請點擊 我的博客 查看,歡迎來訪。
telnetlib --- Telnet client
最近要對交換機埠進行控制,如果每次使用命令去操作確實挺麻煩的,就使用腳本一鍵實現,並有記錄日誌的功能。參考 https://blog.csdn.net/study_in/article/details/89338016
Telnet.read_until(expected, timeout=None) : #讀取連接伺服器後顯示的內容,直到遇到同 expected 相同的位元組串。或者等待時間大於 timeout 時直接向下運行。
Telnet.read_very_eager() : 讀取從上次IO阻斷到現在所有的內容,返回的是位元組串,需要進行 decode() 編碼。如果連接關閉或者沒有可用數據時會拋出 EOFError ,如果沒有其他可用的數據,返回的是 b"" ,除非在IAC中間,否則不會阻礙。
Telnet.open(host, port=23[, timeout]) : 連接到主機,埠號為第二個可選參數,默認為標準的Telnet埠(23),可選的 timeout 參數指定連接的超時時間,如果未指定,將使用全局默認超時設置。不要嘗試去重新打開一個已經連接的實例對象。
Telnet.close() : 關閉連接。
Telnet.write(buffer) : # 將一個位元組串(byte string)寫進socket,如果連接被阻塞,這也會被阻塞,如果連接關閉,會拋出 OSError 。
Telnet.interact() : telnet的交互功能,下面用了一個死循環保證用戶能夠一直輸入命令進行某些操作,也可以使用 Telnet.interact() 這個方法來使所連接終端持久化,不過官網說 (emulates a very mb Telnet client)直譯是一個非常愚蠢的客戶端。
使用python實現對交換機埠關閉、打開功能。
㈣ 求助,python socket如何本地發送埠重用
在bind之前setsockopt設置SOL_SOCKET, SO_REUSEADDR就可以了, 因為關閉的埠處於TIME_WAIT狀態不能被重用.
㈤ Python能對USB介面進行管理么
先要安裝Pyserial
importserial
#設置埠和波特率
s=serial.Serial(port='COM4',baudrate=115200)
#埠寫數
s.write("2000 ")
#埠讀數
read_1=s.readline()#讀一行
read_2=s.read(4)#讀4bytes
#關閉埠
s.close()
㈥ python - serial communication(串口通信)
由於測試工作的需要,在C端產品上經常使用串口進行通信,而測試腳本大部分時候又採用python編寫,於是就不得不了解並熟悉python下的串口通信實現方法了,整理如下以備隨時使用:
一、說明
pyserial封裝了python環境下對串口的訪問,其兼容各種平台,並有統一的操作介面。通過python屬性訪問串口設置,並可對串口的各種配置參數(如串口名,波特率、停止校驗位、流控、超時等等)做修改,再進行串口通信的類與介面封裝後,非常方便地被調用和移植。
二、模塊安裝
pip insatll pyserial
三、初始化與參數說明
import serial
ser = serial.Serial('COM3', 115200, timeout=0.5, ....................)
下面看看 serial.Serial 原生類
四、不同平台下初始化
ser=serial.Serial("/dev/ttyUSB0",9600,timeout=0.5)#使用USB連接串列口ser=serial.Serial("/dev/ttyAMA0",9600,timeout=0.5)#使用樹莓派的GPIO口連接串列口ser=serial.Serial(1,9600,timeout=0.5)#winsows系統使用COM1口連接串列口ser=serial.Serial("COM1",9600,timeout=0.5)#winsows系統使用COM1口連接串列口ser=serial.Serial("/dev/ttyS1",9600,timeout=0.5)#Linux系統使用COM1口連接串列口
五、串口屬性
ser.name #串口名稱
ser.port #埠號
ser.baudrate #波特率
ser.bytesize #位元組大小
ser.parity #校驗位N-無校驗,E-偶校驗,O-奇校驗
ser.stopbits #停止位
ser.timeout #讀超時設置
ser.writeTimeout #寫超時
ser.xonxoff #軟體流控
ser.rtscts #硬體流控
ser.dsrdtr #硬體流控
ser.interCharTimeout #字元間隔超時
六、串口常用方法
isOpen():查看埠是否被打開。
open() :打開埠『。
close():關閉埠。
read(size=1):從埠讀位元組數據。默認1個位元組。
read_all():從埠接收全部數據。
write(data):向埠寫數據。
readline():讀一行數據。
readlines():讀多行數據。
in_waiting():返回輸入緩存中的位元組數。
out_waiting():返回輸出緩存中的位元組數。
flush():等待所有數據寫出。
flushInput():丟棄接收緩存中的所有數據。
flushOutput():終止當前寫操作,並丟棄發送緩存中的數據。
sendBreadk(ration=0.25):發送BREAK條件,並於ration時間之後返回IDLE
setBreak(level=True):根據level設置break條件。
setRTS(level=True):設置請求發送(RTS)的控制信號
setDTR(level=True):設置數據終端准備就緒的控制信號
七、類與介面封裝
import time
import serial
import serial.tools.list_ports
# 串口操作類
class serialCommunication(object):
def __init__(self, port, bps, timeout):# 可配置更多參數
port_list =self.show_usable_com()
if len(port_list) >0:
if portnot in port_list:
self.port = port_list[0]
else:
self.port = port
else:
print("no usable serial, please plugin your serial board")
return
self.bps = bps
self.timeout = timeout
try:
# 初始化串口,並得到串口對象,根據需要可拓展更多參數
self.ser = serial.Serial(self.port, self.bps, 8, 'N', 1, timeout=self.timeout, write_timeout=self.timeout)
except Exception as e:# 拋出異常
print("Exception={}".format(e))
# 顯示可用串口列表
@staticmethod
def show_usable_com():
serialport_list = []
portInfo_list =list(serial.tools.list_ports.comports())
if len(portInfo_list) <=0:
print("can not find any serial port!")
else:
print(portInfo_list)
for i in range(len(portInfo_list)):
plist =list(portInfo_list[i])
print(plist)
serialport_list.append(plist[0])
print(serialport_list)
return serialport_list
# 輸出串口基本信息
def serial_infor(self):
print(self.ser.name)# 設備名字
print(self.ser.port)# 讀或者寫埠
print(self.ser.baudrate)# 波特率
print(self.ser.bytesize)# 位元組大小
print(self.ser.parity)# 校驗位
print(self.ser.stopbits)# 停止位
print(self.ser.timeout)# 讀超時設置
print(self.ser.writeTimeout)# 寫超時
print(self.ser.xonxoff)# 軟體流控
print(self.ser.rtscts)# 軟體流控
print(self.ser.dsrdtr)# 硬體流控
print(self.ser.interCharTimeout)# 字元間隔超時
# 打開串口
def serial_open(self):
try:
if not self.ser.isOpen():
self.ser.open()
except Exception as e:# 拋出異常
print("serial_open Exception={}".format(e))
self.ser.close()
# 讀取指定大小的數據
# 從串口讀size個位元組。如果指定超時,則可能在超時後返回較少的位元組;如果沒有指定超時,則會一直等到收完指定的位元組數。
def serial_read_with_size(self, size):
try:
self.serial_open()
return self.ser.read(size).decode("utf-8")
except Exception as e:
print("serial_read_all Exception={}".format(e))
self.ser.close()
# 讀取當前串口緩存中的所有數據
def serial_read_data(self):
try:
self.serial_open()
datalen =self.ser.inWaiting()
if datalen ==0:
return None
return self.ser.read(datalen).decode("utf-8")
except Exception as e:
print("serial_read_data Exception={}".format(e))
self.ser.close()
# 讀串口全部數據,注意timeout的設置
# 在設定的timeout時間范圍內,如果讀取的位元組數據是有效的(就是非空)那就直接返回,
# 否則一直會等到設定的timeout時間並返回這段時間所讀的全部位元組數據。
def serial_read_all(self):
try:
self.serial_open()
return self.ser.read_all().decode("utf-8")
except Exception as e:
print("serial_read_all Exception={}".format(e))
self.ser.close()
# 讀一行數據
# 使用readline()時應該注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。
# 如果沒有超時,readline會報異常。
def serial_read_line(self):
try:
self.serial_open()
return self.ser.readline().decode("utf-8")
except Exception as e:
print("serial_read_line Exception={}".format(e))
self.ser.close()
# 讀多行數據,返回行列表
def serial_read_lines(self):
try:
self.serial_open()
return self.ser.readlines().decode("utf-8")
except Exception as e:
print("serial_read_lines Exception={}".format(e))
self.ser.close()
# 寫數據
def serial_write_data(self, data):
try:
self.serial_open()
self.ser.flushOutput()
data_len =self.ser.write(data.encode('utf-8'))
return data_len
except Exception as e:
print("serial_write_data Exception={}".format(e))
return 0
# 寫行數據,注意參數差異
def serial_write_lines(self, lines):
self.ser.writelines(lines)
# 清除串口緩存
def serial_clean(self):
try:
if self.ser.isOpen():
self.ser.flush()
except Exception as e:
print("serial_clean Exception={}".format(e))
# 關閉串口
def serial_close(self):
try:
if self.ser.isOpen():
self.ser.close()
except Exception as e:
print("serial_clean Exception={}".format(e))
if __name__ =='__main__':
testSerial = serialCommunication("COM10", 1500000, 0.5)
testSerial.serial_open()
testSerial.serial_infor()
testSerial.serial_write_data("ifconfig eth0\n")
time.sleep(0.1)
data = testSerial.serial_read_all()
print(data)
testSerial.serial_close()
八、其他
1)ser.VERSION表示pyserial版本; 另外,ser.name表示設備名稱
2)埠設置可以被讀入字典,也可從字典載入設置:
getSettingDict():返回當前串口設置的字典
applySettingDict(d):應用字典到串口設置
3) Readline()是讀一行,以/n結束,要是沒有/n就一直讀,阻塞。注意:打開串口時應該指定超時,否則如果串口沒有收到新行,則會一直等待。
4)serial.read_all 與 serial.read_all()區別
serial.read_all:讀取串口所有的參數信息
serial.read_all():超時時間內從串口讀取的所有數據
5) 異常信息
exception serial.SerialException
exception serial.SerialTimeoutException
㈦ 如何在ubuntu中命令行關閉python socket伺服器
本文介紹下,在solaris 系統下,python socket server重啟後,提示埠被佔用,telnet埠失敗。這里給出一個解決方法,有需要的朋友參考下。
在solaris 系統下,socket server被重啟後,提示埠被佔用,telnet埠又是不成功的,說明服務已被關閉。
通過netstat可以看到埠還處於於fin_wait_2狀態,solaris要4分鍾才能關閉。
遇到這個問題時,可以採用如下的方法解決,以減少等待時間。
1,加上s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。
代碼:
復制代碼代碼示例:
self.host=socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((self.host,self.port))
s.listen(5)
2,修改系統fin_wait,time_wait的時間設置。這個時間改短,也利於系統系能。
修改方法
查看或設置:
使用get命令來確定當前時間間隔,並使用set命令將時間間隔指定為30秒。
例如:
復制代碼代碼示例:
ndd -get /dev/tcp tcp_time_wait_interval
ndd -set /dev/tcp tcp_time_wait_interval 30000
預設值:對於 Solaris 操作系統,預設等待時間間隔為 240000 毫秒(即 4 分鍾)。
建議值:60000 毫秒。
Solaris TCP_FIN_WAIT_2_FLUSH_INTERVAL
描述:
指定禁止處於FIN_WAIT_2狀態的連接保持該狀態的計時器時間間隔。
當連接比率較高時,這將累積大量的TCP/IP連接,從而導致伺服器性能下降。在高峰時間段,伺服器會發 生延遲。
如果伺服器延遲,netstat命令顯示對HTTP Server打開的許多套接字處於CLOSE_WAIT或FIN_WAIT_2狀態。
明顯的延遲可能會長達4分鍾,其間伺服器無法發送任何響應,但是CPU利用率保持很高,所有活動都在系統進程中。
查看和設置:
使用get命令來確定當前時間間隔,並使用set命令將時間間隔指定為67.5秒。
例如: