0

デバイスのリストが ssh または telnet に対応しているかどうかを確認する小さなスクリプトがあります。これが私のコードです:

import socket
import sys
file = open('list', 'r')
file = file.readlines()

list = []

for i in file:
    i=i.replace('\n','')
    list.append(i)
for i in list:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((i, 22))
        s.shutdown(2)
        s.close()
        print (i+' SSH ')
    except:
        try:
            s.connect((i, 23))
            s.shutdown(2)
            s.close()
            print (i+' Telnet')
        except:
            print (i + 'disable')
            pass

例外が発生したら、ctrl + c を押して次のデバイスに移動する必要があります。私は何を間違っていますか?ありがとう

4

3 に答える 3

1

I cannot really run the code because I don't have the list file you open on my machine. Still made few edits, any difference?

import socket
import sys
file = open('list', 'r')
file = file.readlines()

list = []

for i in file:
    i=i.replace('\n','')
    list.append(i)
for i in list:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
         s.connect((i, 22))
         s.shutdown(2)
         s.close()
         print (i+' SSH ')
    except:
         s.connect((i, 23))
         s.shutdown(2)
         s.close()
         print (i+' Telnet')
    else:
         print (i + 'disable')
         pass
于 2013-06-13T17:17:05.237 に答える
1

タイムアウトを追加しようとしましたか?

import socket
import sys
with open('list', 'r') as f:# file is a global class

    # per default it reads the file line by line, 
    # readlines() loads the whole file in memory at once, using more memory
    # and you don't need the list.
    for i in f:
        i=i.replace('\n','')
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.settimeout(10)
        try:
            s.connect((i, 22))
            s.shutdown(2)
            s.close()
            print (i+' SSH ')
        except:
            try:
                s.connect((i, 23))
                s.shutdown(2)
                s.close()
                print (i+' Telnet')
            except:
                print (i + 'disable')
                pass

タイムアウトを設定すると、タイムアウト後にストリームが閉じられます。それ以外の場合は、永久にブロックされます。

于 2013-06-13T17:39:37.710 に答える
0

繰り返しますが、ファイル「リスト」がないため、コードを実際に実行することはできません (かなり誤解を招きます..) が、さらにリファクタリングを行い、提案を提供しました。

import socket
import sys

with open('list', 'r') as f:
    # Don't call anything 'list' as it is the name for pythons inbuilt type
    # Using `with` will automatically close the file after you've used it.
    content = f.readlines()
    # We can use a list comprehension to quickly strip any newline characters.
    content = [x.replace('\n','') for x in content]

for x in content:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        s.connect((x, 22))
        s.shutdown(2)
        s.close()
        print (x+' SSH')
    except:
    # This should catch a specific exception, e.g. TimeoutError etc
    # e.g. `except ConnectionError`
        try:
            s.connect((i, 23))
            s.shutdown(2)
            s.close()
            print (i+' Telnet')
        except:
            print (i + 'disable')
            pass

私の推測では、例外が発生するのではなく、接続がハングしています。接続できないため、タイムアウトが原因である可能性があります。

次のタイムアウト オプションを追加します。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(60)
于 2013-06-13T17:45:54.257 に答える