Linux에서 네트워크 포트가 열려 있는지 확인하는 방법은 무엇입니까?
파이썬을 사용하여 원격 시스템이 아닌 Linux 우분투에서 특정 포트가 열리고 닫혔는지 어떻게 알 수 있습니까? 파이썬에서 이러한 열린 포트를 어떻게 나열 할 수 있습니까?
- Netstat : netstat 출력을 Python과 통합하는 방법이 있습니까?
소켓 모듈 을 사용하여 포트가 열려 있는지 여부를 간단히 확인할 수 있습니다 .
다음과 같이 보일 것입니다.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
print "Port is open"
else:
print "Port is not open"
sock.close()
좀 더 일반적인 컨텍스트에서 사용하려면 여는 소켓도 닫혀 있는지 확인해야합니다. 따라서 수표는 다음과 비슷해야합니다.
import socket
from contextlib import closing
def check_socket(host, port):
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
if sock.connect_ex((host, port)) == 0:
print "Port is open"
else:
print "Port is not open"
나에게 위의 예는 포트가 열리지 않으면 중단됩니다. 행 4는 정지 를 방지하기 위해 settimeout 사용을 보여줍니다.
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2) #2 Second Timeout
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
print 'port OPEN'
else:
print 'port CLOSED, connect_ex returned: '+str(result)
로컬 시스템에만 관심이있는 경우 psutil 패키지를 사용할 수 있습니다. 다음 중 하나를 수행 할 수 있습니다.
특정 pid에서 사용하는 모든 포트를 확인하십시오.
proc = psutil.Process(pid) print proc.connections()
로컬 시스템에서 사용되는 모든 포트를 확인하십시오.
print psutil.net_connections()
Windows에서도 작동합니다.
https://github.com/giampaolo/psutil
Netstat 도구는 단순히 / proc / net / tcp와 같은 일부 / proc 파일을 구문 분석하여 다른 파일 내용과 결합합니다. 네, 매우 플랫폼별로 다르지만 Linux 전용 솔루션의 경우 그대로 사용할 수 있습니다. Linux 커널 문서는 이러한 파일을 자세히 설명하므로 읽는 방법을 찾을 수 있습니다.
또한 "port"는 직렬 포트 (/ dev / ttyS * 및 아날로그), 병렬 포트 등을 의미 할 수도 있으므로 질문이 너무 모호하다는 점에 유의하십시오. 나는 이것이 네트워크 포트라는 다른 대답에서 이해를 재사용했지만 질문을 더 정확하게 공식화하도록 요청합니다.
수신 할 의도로 TCP 포트를 검색하는 경우 실제로 수신을 호출하는 것이 좋습니다. 연결을 위해 tring을 사용하는 접근 방식은 설정된 연결의 클라이언트 포트를 '보지'않습니다. 그러나 이러한 포트는 수신하는 데 사용할 수 없습니다.
import socket
def check_port(port, rais=True):
""" True -- it's possible to listen on this port for TCP/IPv4 or TCP/IPv6
connections. False -- otherwise.
"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('127.0.0.1', port))
sock.listen(5)
sock.close()
sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
sock.bind(('::1', port))
sock.listen(5)
sock.close()
except socket.error as e:
return False
if rais:
raise RuntimeError(
"The server is already running on port {0}".format(port))
return True
mrjandro의 솔루션에 간단한 연결 오류 / 시간 초과를 제거하는 빠른 해킹을 추가했습니다.
max_error_count 변수 값을 변경하는 임계 값을 조정하고 모든 종류의 알림을 추가 할 수 있습니다.
import socket
max_error_count = 10
def increase_error_count():
# Quick hack to handle false Port not open errors
with open('ErrorCount.log') as f:
for line in f:
error_count = line
error_count = int(error_count)
print "Error counter: " + str(error_count)
file = open('ErrorCount.log', 'w')
file.write(str(error_count + 1))
file.close()
if error_count == max_error_count:
# Send email, pushover, slack or do any other fancy stuff
print "Sending out notification"
# Reset error counter so it won't flood you with notifications
file = open('ErrorCount.log', 'w')
file.write('0')
file.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
print "Port is open"
else:
print "Port is not open"
increase_error_count()
그리고 여기에 Python 3 호환 버전 (고정 된 인쇄 구문)이 있습니다.
import socket
max_error_count = 10
def increase_error_count():
# Quick hack to handle false Port not open errors
with open('ErrorCount.log') as f:
for line in f:
error_count = line
error_count = int(error_count)
print ("Error counter: " + str(error_count))
file = open('ErrorCount.log', 'w')
file.write(str(error_count + 1))
file.close()
if error_count == max_error_count:
# Send email, pushover, slack or do any other fancy stuff
print ("Sending out notification")
# Reset error counter so it won't flood you with notifications
file = open('ErrorCount.log', 'w')
file.write('0')
file.close()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
print ("Port is open")
else:
print ("Port is not open")
increase_error_count()
Please check Michael answer and vote for it. It is the right way to check open ports. Netstat and other tools are not any use if you are developing services or daemons. For instance, I am crating modbus TCP server and client services for an industrial network. The services can listen to any port, but the question is whether that port is open? The program is going to be used in different places, and I cannot check them all manually, so this is what I did:
from contextlib import closing
import socket
class example:
def __init__():
self.machine_ip = socket.gethostbyname(socket.gethostname())
self.ready:bool = self.check_socket()
def check_socket(self)->bool:
result:bool = True
with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
modbus_tcp_port:int = 502
if not sock.connect_ex((self.machine_ip, modbus_tcp_port)) == 0:
result = False
return result
Here's a fast multi-threaded port scanner:
from time import sleep
import socket, ipaddress, threading
max_threads = 50
final = {}
def check_port(ip, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
#sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
socket.setdefaulttimeout(2.0) # seconds (float)
result = sock.connect_ex((ip,port))
if result == 0:
# print ("Port is open")
final[ip] = "OPEN"
else:
# print ("Port is closed/filtered")
final[ip] = "CLOSED"
sock.close()
except:
pass
port = 80
for ip in ipaddress.IPv4Network('192.168.1.0/24'):
threading.Thread(target=check_port, args=[str(ip), port]).start()
#sleep(0.1)
# limit the number of threads.
while threading.active_count() > max_threads :
sleep(1)
print(final)
참고URL : https://stackoverflow.com/questions/19196105/how-to-check-if-a-network-port-is-open-on-linux
'Programing' 카테고리의 다른 글
예외 : AAPT2 오류 : 자세한 내용은 로그 확인 (0) | 2020.12.06 |
---|---|
클래스 인스턴스 Python 목록 정렬 (0) | 2020.12.06 |
Django 프로젝트에서`from django.conf import settings`와`import settings`의 차이점은 무엇입니까? (0) | 2020.12.05 |
Atlassian Greenhopper / PivotalTracker의 무료 대안? (0) | 2020.12.05 |
String.Format 인수 Null 예외 (0) | 2020.12.05 |