웹사이트 검색

Scientific Linux 7.1 및 Python으로 네트워크 장비를 감지하는 방법 알아보기


이 페이지에서

  1. Python에서 Linux 라이브러리 사용
  2. 올바른 인수 감지
  3. 루프\n

때때로 사용 중인 IP 주소를 찾기 위해 네트워크 스캔이 필요한 내부 네트워크 또는 방화벽 문제가 있을 수 있습니다. 이를 위해 nmap, zmap 또는 AngerIP와 같은 기성 도구를 사용할 수 있습니다. 그러나 이러한 도구를 다운로드할 수 있는 인터넷 액세스 권한이 없는 경우 수동 명령만 사용하여 검사를 수행할 수 있습니다. 그러나 수동 검색은 네트워크에 지정된 각 IP 주소에 대해 수행되어야 하는 이해와 함께 매우 지루할 수 있습니다.

위의 사항을 고려하여 이 튜토리얼에서는 Python을 사용하여 이 작업을 자동화하는 방법을 보여줍니다. Python은 시중에서 구할 수 있는 거의 모든 Linux 배포판에서 사용할 수 있습니다.

Python은 OS가 실행할 수 있는 모든 작업을 자동화할 수 있게 해주고 올바른 라이브러리를 사용하기만 하면 되기 때문에 이에 대한 완벽한 선택입니다.

Python에서 Linux 라이브러리 사용

현재 연구의 초점은 네트워크에서 연결되고 켜져 있는 모든 장비를 감지하는 ping 스윕 명령입니다. 우리가 만들고 있는 스크립트는 네트워크의 각 IP 주소에 ping을 보냅니다. 예를 들어 서브넷 마스크/24를 사용하면 IP의 처음 3옥텟까지만 반복됩니다. 이 스크립트에 대해 고려해야 할 첫 번째 사항은 작업에 사용할 수 있는 시스템 라이브러리이며 sys 및 하위 프로세스 라이브러리를 가져와야 합니다. 이러한 라이브러리를 사용하면 Python 인터프리터의 특정 명령과 운영 체제 자체(이 경우에는 Scientific Linux 7.1)를 사용할 수 있습니다.

import sys, subprocess

내 스크립트를 networkmonitor.py라는 이름으로 저장하겠습니다.

올바른 인수 감지

명령을 사용하여 스크립트를 실행할 때

>>python networkmonitor.py 10.0.0.

셸에서 명령의 인수가 잘못된 경우(len(sys.argv)<>2:인 경우) 스크립트는 올바른 예를 표시합니다. (\networkmonitor.py 10.0.0.\ 인쇄).

인수는 스캔된 서브넷의 IP 주소이며 처음 3개의 옥텟만 사용됩니다. 따라서 인수가 올바르면 \ping -c1 \+sys.argv[1] 명령의 결과가 변수에 저장됩니다. 여기서는 cmdping이고 sys.argv[1]는\argument" 변수를 sys 모듈에 저장하고 스크립트에 제공된 첫 번째 인수를 저장합니다. UNIX 환경에서는 ping 명령이 무한대로 실행되기 때문에 ping -c1을 사용해야 합니다.

if len(sys.argv)<>2:
    print "networkmonitor 10.0.0."

하위 프로세스 명령, 해당 인수 및 for 루프


다음 줄에서 우리가 설정한 제한(중지 조건)에 도달할 때까지 실행되는 for 루프를 시작합니다. 조건은 우리가 스캔하려는 IP 범위입니다. 이 시점에서 스크립트가 범위를 스캔하는 데 필요한 시간을 고려하는 것이 중요합니다. 범위가 클수록 스크립트가 더 오래 실행됩니다. subprocess.Popen을 사용하면 셸 명령을 실행하고 완료될 때까지 기다릴 수 있습니다. 완료되면 명령이 반환된 상태를 확인합니다. 하위 프로세스에 의해 실행되는 cmdping+str(x).열기, for 루프의 각 주기에서 인수가 제공하는 IP에 대한 인덱스를 증가시킵니다. .

shell=true는 프로세스가 쉘에서 실행됨을 의미합니다. 그러나 Python 문서 웹 사이트에서는 shell=true 사용의 위험에 대해 경고하므로 어떤 명령을 실행할지 주의해야 합니다. subprocess.PIPE using as stderr 인수는 Python이 표준 스트림에 대한 파이프를 열어야 함을 나타냅니다.

for x in range(99,110):
        p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)

이 경우에는 11개의 IP 주소(99에서 110까지)만 테스트했습니다.

이제 stderr의 내용을 확인해야 합니다. 변수가 비어 있으면 중지(중단)하고, 그렇지 않으면 stdout 내용을 표시합니다.

out = p.stderr.read(1)
            if out == '' and p.poll() != None:
                break
            if out != '':
                sys.stdout.write(out)
                sys.stdout.flush()

이 마지막 코드는 쉘이 참 상태로 유지되는 경우 실행되어야 합니다.

완전한 코드는 이제 다음과 같습니다.

import sys, subprocess
if len(sys.argv)<>2:
    print "networkmonitor 10.0.0."
else:
    cmdping ="ping -c1 "+sys.argv[1]
    for x in range(99,110):
        p = subprocess.Popen(cmdping+str(x), shell=True, stderr=subprocess.PIPE)
        while True:
            out = p.stderr.read(1)
            if out == '' and p.poll() != None:
                break
            if out != '':
                sys.stdout.write(out)
                sys.stdout.flush()

작은 스크립트의 출력은 다음과 같습니다.



스크린샷과 같이 이 도구는 ping만 하여 긍정 또는 부정 응답을 받은 후 다음 IP 주소로 이동하는 식으로 전체 주소 범위를 분석합니다.

위에서 분석한 코드의 소유권을 주장하지 않는다는 점을 언급해야 합니다. 시스템 명령과 네트워크 기능을 더 잘 이해하기 위해 기능을 단계별로 설명하고 있습니다. 저자에게 신용을 부여합니다.