每次循环在网络中找到新计算机时,都尝试将主机名写入文件

时间:2018-05-21 18:22:07

标签: python networking

我正在尝试查找网络上的所有Windows计算机。每当程序在网络中找到并运行的计算机时,它将为该计算机打开一个新文件。在文件中,我想查看机器的名称及其IP地址。

一旦我完成了这项工作,我想将特定计算机上安装的应用程序记录到该计算机的文件中,这就是为什么我为该程序找到的每台计算机都有一个新文件。

但是,当我运行它时,机器每次都有相同的名称。我尝试使用导入套接字,但每当我使用它附带的任何方法时,我都会收到错误,说明套接字没有属性。我需要从套接字导入*为我的is_up方法工作。

这是我的代码:

from socket import *

ipa = '192.168.1.'

def is_up(adr):
    s = socket(AF_INET, SOCK_STREAM)
    s.settimeout(0.01)
    if not s.connect_ex((adr, 135)):
        s.close()
        return 1
    else:
        s.close()

def main():
    for i in range(1, 256):
        adr = ipa + str(i)
        if is_up(adr):
            f = open("Machine " + str(i) + ".txt", "w+")
            f.write('%s \t- %s \n' % ("Name: " + gethostname(), adr))

        if is_up(adr):
            print(gethostbyaddr(adr))

main()

修改:我在此处添加新代码以反映gethostbyaddr(adr)的使用情况。我仍然收到以下错误:

  

[Errno 11004]未找到主持人

def main():
    for i in range(1, 256):
        adr = ipa + str(i)
        if is_up(adr):
            print(gethostbyaddr(adr))

追溯

Traceback (most recent call last):
  File "C:/Users/eread/PycharmProjects/SoftwareScanner/SoftwareScanner", line 30, in <module>
    main()
  File "C:/Users/eread/PycharmProjects/SoftwareScanner/SoftwareScanner", line 20, in main
    print(gethostbyaddr(adr))
socket.herror: [Errno 11004] host not found

1 个答案:

答案 0 :(得分:0)

此处的问题是用于获取主机名的函数,gethostname()返回您正在执行脚本的计算机的名称。

如果你想要正在检查的远程机器的名称,你需要另一个函数,如gethostbyaddr,它返回一个由3个成员组成的元组:名称,别名列表和IP列表

if is_up(adr):
    print(gethostbyaddr(adr))

#>>> ('machine_name', [], ['192.168.1.14'])

使用这样一个函数的另一个好处是,当你在一个对象中获得所有细节时,我认为你不需要使用文件来存储它们,至少在你在脚本的第二部分使用它们之前。

您可以解压缩gethostbyaddr返回的值,以在下一部分中声明所需的变量:

host_name, _, adresses = gethostbyaddr(adr)
print(host_name)
print(adresses[0]) #this member is a list, use index to access the first

#>>> result :
#machine_name
#192.168.1.14