2013-03-16 2 views
0

현재 개발중인 간단한 Python 프로그램이 있는데 어떤 이유로 작동하지 않습니다.
전체 프로그램 작동 방식은 20 개의 포트 목록을 가지고 있으며 기본적으로 선택한 포트에서 호스트에 대해 ping을 수행하는 목록을 반복합니다. 여기 코드는 다음과 같습니다Python - 내 소켓 코드에 무엇이 문제입니까?

import socket 
import sys 

print ' +-====================================================-+' 
print '/              \ ' 
print '|      PyPortScanner      |' 
print '|      by Ag3ntChr0m      |' 
print ' \              /' 
print ' +-====================================================-+' 
print '' 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
except socket.error, msg: 
    print 'Failed to create socket. Error code: ' + str(msg[0]) + 'Error message: ' + msg[1] 
    sys.exit() 
print 'Socket Created' 

host = raw_input('Enter the desired host to scan: ') 
port = [80, 443, 21, 22, 4567, 8080, 25, 3389, 23, 53, 1723, 110, 135, 445, 
     139, 1863, 143, 8081, 10000, 1025] 
portFail = [] 
print 'Scanning top 20 most often open ports ...' 

try: 
    remote_ip = socket.gethostbyname(host) 

except socket.gaierror: 
    #couldn't resolve host at port 
    print 'Hostname could not be resolved. Program exiting' 
    sys.exit() 

print 'IP address of ' + host + ' is ' + remote_ip 

print '+-===================================-+' 
print '| Ports Scanned:----------------------|' 
print '+-===================================-+' 
print '' 

#Connect to remote server 
for i in range(0, 20): 
    portScan = int(str(port[i])) <---- 
    try: 

     s.connect((remote_ip, portScan)) 
     print "\t" + str(portScan) 
     s.close() 

    except: 

     portFail.append(portScan) 
     err = True 

raw_input('Press Enter to Continue...') 

if err: 
    print '+-=============================-+' 
    print '| Failed Port Scan:-------------|' 
    print '+-=============================-+' 
    print '' 
    size = len(portFail) 
    for i in range(1, size): 
     print "\t" + str(portFail[i]) 

당신은 s.socket가 사용할 수있는 변수로 포트 번호 (화살표로 표시된 라인에서) 그 다음

  • 부하로 가정되는 프로그램을 실행하면 연결을 시도하십시오.
  • 그런 다음 호스트에서 소켓을 열고 (기본적으로 ping) 소켓을 닫으려고 시도합니다.
  • 연결되면 스캔 된 포트의 화면에이 내용이 기록됩니다.
  • 그러나 실패한 경우 (최근에 있었던 경우) 포트 스캔 실패로 인쇄됩니다.

프로그램을 실행하면 스캔 된 포트 아래의 목록 (80)에있는 첫 번째 포트가 인쇄되지만 나머지 포트는 실패한 포트 스캔 아래에 배치됩니다 - 적어도 일부는 열려 있음을 알고 있지만.

이 프로그램이 첫 번째 포트보다 더 많은 포트를 ping하면 어떻게됩니까?

답변

0

@cnicutar의 답변에서 언급했듯이 socket을 다시 사용할 수 없습니다. 그러나 기본 리소스를 해제하므로 사용 후 소켓을 close()으로 설정해야합니다. 이것은 api documentation에있는 예제에서도 볼 수 있습니다.

포트에 성공적으로 연결되면 shutdown()을 호출하여 포트가 닫혀 있는지 확인해야합니다.

여기에 코드의 관련 부분입니다 :

for portScan in port: 
    try: 
     print "scanning: %s" % portScan 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.connect((remote_ip, portScan)) 
     s.shutdown(socket.SHUT_RDWR) 
    except: 
     portFail.append(portScan) 
     err = True 
    finally: 
     s.close() 

가 나는 또한 루프를 단순화하기 위해 자유를했다.

참고 : 실험 결과 shutdown()socket을 다시 사용할 수 없다는 것을 보여주었습니다.

+0

감사합니다. 이것은 작동하는 것처럼 보입니다!구글을 쫓아 가지는 않겠지 만, 그것은 나쁜 것을 얼려 버린다. –

1

동일한 소켓을 다시 사용하고 다시 연결할 수 없습니다. 새로운 소켓을 매번 만들어보십시오 :

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((remote_ip, portScan)) 

을 비록 당신 close가 다시 연결할 수있는 위치에 다시 넣어하지 않는 소켓 경우.

+0

가'가까운하지()'또는'종료()'이 할 것 :
당신은 포트, 같은 스캔을위한 for 루프를 사용해야합니까? –

+0

@ user2176286 내 대답을 편집했습니다. 'close'는 그렇게하지 않는다. – cnicutar

+0

오케이, 편집을 보았습니다. shutdown()은 어떨까요? –

0

@cnicutar가 지적한대로 소켓을 다시 사용할 수는 없지만 항상 새로운 연결마다 새 소켓을 시작할 수 있습니다.

for p2scan in port: 
    try: 
     print "scanning: %s" % p2scan 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.connect((remote_ip, p2scan)) 
    except: 
     portFail.append(p2scan) 
     err = True 
    finally: 
     s.close() 
관련 문제