def discover(data: ConnectionData) -> None:
assert isinstance(data, ConnectionData)
ip_net, iface = data
try:
ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=ip_net), iface=iface, timeout=2, verbose=False)
for s, r in ans:
line = r.sprintf("%Ether.src% %ARP.psrc%")
try:
hostname = socket.gethostbyaddr(r.psrc)
line += ' ' + hostname[0]
except socket.herror:
pass
print(line)
except PermissionError:
print('Cannot execute necessary code, did you run as root?')
sys.exit(1)
except:
raise
python类gethostbyaddr()的实例源码
discovery.py 文件源码
项目:SupercomputerInABriefcase
作者: SupercomputerInABriefcase
项目源码
文件源码
阅读 36
收藏 0
点赞 0
评论 0
def getOSCTarget(self, address):
"""Returns the OSCTarget matching the given address as a ((host, port), [prefix, filters]) tuple.
'address' can be a (host, port) tuple, or a 'host' (string), in which case the first matching OSCTarget is returned
Returns (None, ['',{}]) if address not found.
"""
if type(address) in str:
address = self._searchHostAddr(address)
if (type(address) == tuple):
(host, port) = address[:2]
try:
host = socket.gethostbyname(host)
except socket.error:
pass
address = (host, port)
if (address in list(self.targets.keys())):
try:
(host, _, _) = socket.gethostbyaddr(host)
except socket.error:
pass
return ((host, port), self.targets[address])
return (None, ['',{}])
def addUTMPEntry(self, loggedIn=1):
if not utmp:
return
ipAddress = self.avatar.conn.transport.transport.getPeer().host
packedIp ,= struct.unpack('L', socket.inet_aton(ipAddress))
ttyName = self.ptyTuple[2][5:]
t = time.time()
t1 = int(t)
t2 = int((t-t1) * 1e6)
entry = utmp.UtmpEntry()
entry.ut_type = loggedIn and utmp.USER_PROCESS or utmp.DEAD_PROCESS
entry.ut_pid = self.pty.pid
entry.ut_line = ttyName
entry.ut_id = ttyName[-4:]
entry.ut_tv = (t1,t2)
if loggedIn:
entry.ut_user = self.avatar.username
entry.ut_host = socket.gethostbyaddr(ipAddress)[0]
entry.ut_addr_v6 = (packedIp, 0, 0, 0)
a = utmp.UtmpRecord(utmp.UTMP_FILE)
a.pututline(entry)
a.endutent()
b = utmp.UtmpRecord(utmp.WTMP_FILE)
b.pututline(entry)
b.endutent()
def get_base_page_info(self, page_data):
"""Find the reverse-ip info for the base page"""
domain = urlparse.urlsplit(page_data['final_url']).hostname
try:
import socket
addr = socket.gethostbyname(domain)
host = str(socket.gethostbyaddr(addr)[0])
page_data['base_page_ip_ptr'] = host
except Exception:
pass
# keep moving up the domain until we can get a NS record
while domain is not None and 'base_page_dns_soa' not in page_data:
try:
import dns.resolver
dns_servers = dns.resolver.query(domain, "NS")
dns_server = str(dns_servers[0].target).strip('. ')
page_data['base_page_dns_ns'] = dns_server
except Exception:
pass
pos = domain.find('.')
if pos > 0:
domain = domain[pos + 1:]
else:
domain = None
def resolveIP(self, ipaddr):
ret = list()
self.sf.debug("Performing reverse-resolve of " + ipaddr)
if ipaddr in self.resolveCache:
self.sf.debug("Returning cached result for " + ipaddr + " (" +
str(self.resolveCache[ipaddr]) + ")")
return self.resolveCache[ipaddr]
try:
addrs = self.sf.normalizeDNS(socket.gethostbyaddr(ipaddr))
self.resolveCache[ipaddr] = addrs
self.sf.debug("Resolved " + ipaddr + " to: " + str(addrs))
return addrs
except BaseException as e:
self.sf.debug("Unable to resolve " + ipaddr + " (" + str(e) + ")")
self.resolveCache[ipaddr] = list()
return ret
# Resolve a host
def override_system_resolver(resolver=None):
"""Override the system resolver routines in the socket module with
versions which use dnspython's resolver.
This can be useful in testing situations where you want to control
the resolution behavior of python code without having to change
the system's resolver settings (e.g. /etc/resolv.conf).
The resolver to use may be specified; if it's not, the default
resolver will be used.
@param resolver: the resolver to use
@type resolver: dns.resolver.Resolver object or None
"""
if resolver is None:
resolver = get_default_resolver()
global _resolver
_resolver = resolver
socket.getaddrinfo = _getaddrinfo
socket.getnameinfo = _getnameinfo
socket.getfqdn = _getfqdn
socket.gethostbyname = _gethostbyname
socket.gethostbyname_ex = _gethostbyname_ex
socket.gethostbyaddr = _gethostbyaddr
def get_name_from_ip(self, addr): # pylint: disable=no-self-use
"""Returns a reverse dns name if available.
:param addr: IP Address
:type addr: ~.common.Addr
:returns: name or empty string if name cannot be determined
:rtype: str
"""
# If it isn't a private IP, do a reverse DNS lookup
if not common.private_ips_regex.match(addr.get_addr()):
try:
socket.inet_aton(addr.get_addr())
return socket.gethostbyaddr(addr.get_addr())[0]
except (socket.error, socket.herror, socket.timeout):
pass
return ""
def run(self):
#do pings
for x in range(0, self.repeat):
self.one_ping(self.ip, self.port, self.identifier, self.sequence, self.ttl, self.timeout)
self.sequence += 1
if x != self.repeat -1:
time.sleep(self.sleep)
#count packet loss
self.result['packet_loss'] /= self.repeat
#try to get hostname
try:
self.result['hostname'] = socket.gethostbyaddr(self.ip)[0]
except socket.herror:
self.result['hostname'] = None
#calculate averate time
if len(self.result['times']) != 0:
self.result['avg_time'] = sum(self.result['times']) / len(self.result['times'])
#and calculate mdev
mean = sum([float(x) for x in self.result['times']]) / len(self.result['times'])
self.result['mdev'] = sum([abs(x - mean) for x in self.result['times']]) / len(self.result['times'])
return self.result
def scan_and_print_neighbors(net, interface, timeout=1):
global ips_o
print_fmt("\n\033[94m[ARP]\033[0m %s sur %s" % (net, interface))
try:
ans, unans = scapy.layers.l2.arping(net, iface=interface, timeout=timeout, verbose=False)
for s, r in ans.res:
line = r.sprintf("%Ether.src% %ARP.psrc%")
ips_o.append(line.split(' ')[2])
line = mac_address_id(line)
try:
hostname = socket.gethostbyaddr(r.psrc)
line += " " + hostname[0]
except socket.herror:
pass
except KeyboardInterrupt:
print '\033[91m[-]\033[0m L\'utilisateur a choisi l\'interruption du process.'
break
logger.info("\033[96m[ONLINE]\033[0m " + line)
except socket.error as e:
if e.errno == errno.EPERM:
logger.error("\033[91m[-]\033[0m %s. Vous n'etes pas root?", e.strerror)
else:
raise
def override_system_resolver(resolver=None):
"""Override the system resolver routines in the socket module with
versions which use dnspython's resolver.
This can be useful in testing situations where you want to control
the resolution behavior of python code without having to change
the system's resolver settings (e.g. /etc/resolv.conf).
The resolver to use may be specified; if it's not, the default
resolver will be used.
@param resolver: the resolver to use
@type resolver: dns.resolver.Resolver object or None
"""
if resolver is None:
resolver = get_default_resolver()
global _resolver
_resolver = resolver
socket.getaddrinfo = _getaddrinfo
socket.getnameinfo = _getnameinfo
socket.getfqdn = _getfqdn
socket.gethostbyname = _gethostbyname
socket.gethostbyname_ex = _gethostbyname_ex
socket.gethostbyaddr = _gethostbyaddr
def whois(url, command=False):
# clean domain to expose netloc
ip_match = re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", url)
if ip_match:
domain = url
try:
result = socket.gethostbyaddr(url)
except socket.herror as e:
pass
else:
domain = result[0]
else:
domain = extract_domain(url)
if command:
# try native whois command
r = subprocess.Popen(['whois', domain], stdout=subprocess.PIPE)
text = r.stdout.read()
else:
# try builtin client
nic_client = NICClient()
text = nic_client.whois_lookup(None, domain, 0)
return WhoisEntry.load(domain, text)
def validate_hostname(hostname):
"""
Validates that the Foreman API uses a FQDN as hostname.
Also looks up the "real" hostname if "localhost" is specified.
Otherwise, the picky Foreman API won't connect.
:param hostname: the hostname to validate
:type hostname: str
"""
if hostname == "localhost":
#get real hostname
hostname = socket.gethostname()
else:
#convert to FQDN if possible:
fqdn = socket.gethostbyaddr(hostname)
if "." in fqdn[0]:
hostname = fqdn[0]
return hostname
def _hostname_linux(self):
"""
Returns system hostname.
"""
# Default value found using platform
hostname = platform.node()
try:
# Try to get hostname (FQDN) using 'hostname -f'
(rc, out, err) = exec_command([which('hostname'), '-f'])
if rc == 0:
hostname = out.encode('utf-8').strip()
except Exception:
try:
# Try to get hostname (FQDN) using socket module
(hostname, _, _) = socket.gethostbyaddr(socket.gethostname())
hostname = hostname.strip()
except Exception:
pass
return hostname
def _check_address(address):
ipv4 = ""
hostname = ""
if is_valid_address(address):
ipv4 = address
try:
hostname = socket.gethostbyaddr(address)[0]
except Exception:
pass # no DNS
else:
hostname = socket.getfqdn(address)
try:
ipv4 = socket.gethostbyname(hostname)
except Exception:
pass # host not valid or offline
return ipv4, hostname
def whois(url, command=False):
# clean domain to expose netloc
ip_match = re.match(r"^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", url)
if ip_match:
domain = url
try:
result = socket.gethostbyaddr(url)
except socket.herror as e:
pass
else:
domain = result[0]
else:
domain = extract_domain(url)
if command:
# try native whois command
r = subprocess.Popen(['whois', domain], stdout=subprocess.PIPE)
text = r.stdout.read()
else:
# try builtin client
nic_client = NICClient()
text = nic_client.whois_lookup(None, domain, 0)
return WhoisEntry.load(domain, text)
def testHostnameRes(self):
# Testing hostname resolution mechanisms
hostname = socket.gethostname()
try:
ip = socket.gethostbyname(hostname)
except socket.error:
# Probably name lookup wasn't set up right; skip this test
return
self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
try:
hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
except socket.error:
# Probably a similar problem as above; skip this test
return
all_host_names = [hostname, hname] + aliases
fqhn = socket.getfqdn(ip)
if not fqhn in all_host_names:
self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
def get_name_from_ip(self, addr): # pylint: disable=no-self-use
"""Returns a reverse dns name if available.
:param addr: IP Address
:type addr: ~.common.Addr
:returns: name or empty string if name cannot be determined
:rtype: str
"""
# If it isn't a private IP, do a reverse DNS lookup
if not common.private_ips_regex.match(addr.get_addr()):
try:
socket.inet_aton(addr.get_addr())
return socket.gethostbyaddr(addr.get_addr())[0]
except (socket.error, socket.herror, socket.timeout):
pass
return ""
def ip2hostname(ip):
try:
hostname = socket.gethostbyaddr(ip)[0]
return hostname
except:
pass
try:
query_data = "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x20\x43\x4b\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x00\x21\x00\x01"
dport = 137
_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
_s.sendto(query_data, (ip, dport))
x = _s.recvfrom(1024)
tmp = x[0][57:]
hostname = tmp.split("\x00", 2)[0].strip()
hostname = hostname.split()[0]
return hostname
except:
pass
def ip2hostname(self,ip):
try:
hostname = socket.gethostbyaddr(ip)[0]
return hostname
except:
pass
try:
query_data = "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x20\x43\x4b\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x00\x21\x00\x01"
dport = 137
_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
_s.settimeout(3)
_s.sendto(query_data, (ip, dport))
x = _s.recvfrom(1024)
tmp = x[0][57:]
hostname = tmp.split("\x00", 2)[0].strip()
hostname = hostname.split()[0]
return hostname
except:
pass
def testHostnameRes(self):
# Testing hostname resolution mechanisms
hostname = socket.gethostname()
try:
ip = socket.gethostbyname(hostname)
except socket.error:
# Probably name lookup wasn't set up right; skip this test
self.skipTest('name lookup failure')
self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
try:
hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
except socket.error:
# Probably a similar problem as above; skip this test
self.skipTest('address lookup failure')
all_host_names = [hostname, hname] + aliases
fqhn = socket.getfqdn(ip)
if not fqhn in all_host_names:
self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
def testHostnameRes(self):
# Testing hostname resolution mechanisms
hostname = socket.gethostname()
try:
ip = socket.gethostbyname(hostname)
except socket.error:
# Probably name lookup wasn't set up right; skip this test
self.skipTest('name lookup failure')
self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
try:
hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
except socket.error:
# Probably a similar problem as above; skip this test
self.skipTest('address lookup failure')
all_host_names = [hostname, hname] + aliases
fqhn = socket.getfqdn(ip)
if not fqhn in all_host_names:
self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
def dnslookup(self, str):
""" Perform DNS lookup on str. If first character of digit is numeric,
assume that str contains an IP address. Otherwise, assume that str
contains a hostname."""
if str == '': str = ' '
if str[0] in string.digits:
try:
value = socket.gethostbyaddr(str)[0]
except:
value = 'Lookup failed'
else:
try:
value = socket.gethostbyname(str)
except:
value = 'Lookup failed'
return value
def dnslookup(str):
""" Perform DNS lookup on str. If first character of digit is numeric,
assume that str contains an IP address. Otherwise, assume that str
contains a hostname."""
if str == '': str = ' '
if str[0] in string.digits:
try:
value = socket.gethostbyaddr(str)[0]
except:
value = 'Lookup failed'
else:
try:
value = socket.gethostbyname(str)
except:
value = 'Lookup failed'
return value
def traceIP(target):
try:
base = GeoIP('GeoLiteCity.dat')
data = base.record_by_addr(target)
dnsName = socket.gethostbyaddr(target)[0]
formatedData = '''IP: {}
City: {}
State/Province: {}
Country: {}
Continent: {}
Zip/Postal code: {}
Timezone: {}
Latitude: {}
Longitude: {}
DNS name: {}'''.format(target, data['city'], data['region_code'], data['country_name'], data['continent'], data['postal_code'], data['time_zone'], str(data['latitude']), str(data['longitude']), dnsName)
print formatedData
# compares target to database and print results to console
askSave = raw_input('Save data? Y/n: ').lower()
if askSave == 'y':
ipFileName = raw_input('Filename: ')
with open(ipFileName, 'w') as fileName:
fileName.write(formatedData)
print 'Output saved as {}'.format(ipFileName)
else:
pass
# asks user if they want to save the output
pause()
main()
except socket.herror:
pass
def ip2hostname(ip):
try:
hostname = socket.gethostbyaddr(ip)[0]
return hostname
except:
pass
try:
query_data = "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x20\x43\x4b\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x00\x21\x00\x01"
dport = 137
_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
_s.sendto(query_data, (ip, dport))
x = _s.recvfrom(1024)
tmp = x[0][57:]
hostname = tmp.split("\x00", 2)[0].strip()
hostname = hostname.split()[0]
return hostname
except:
pass
def ip2hostname(self,ip):
try:
hostname = socket.gethostbyaddr(ip)[0]
return hostname
except:
pass
try:
query_data = "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x20\x43\x4b\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41" + \
"\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x41\x00\x00\x21\x00\x01"
dport = 137
_s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
_s.sendto(query_data, (ip, dport))
x = _s.recvfrom(1024)
tmp = x[0][57:]
hostname = tmp.split("\x00", 2)[0].strip()
hostname = hostname.split()[0]
return hostname
except:
pass
def override_system_resolver(resolver=None):
"""Override the system resolver routines in the socket module with
versions which use dnspython's resolver.
This can be useful in testing situations where you want to control
the resolution behavior of python code without having to change
the system's resolver settings (e.g. /etc/resolv.conf).
The resolver to use may be specified; if it's not, the default
resolver will be used.
@param resolver: the resolver to use
@type resolver: dns.resolver.Resolver object or None
"""
if resolver is None:
resolver = get_default_resolver()
global _resolver
_resolver = resolver
socket.getaddrinfo = _getaddrinfo
socket.getnameinfo = _getnameinfo
socket.getfqdn = _getfqdn
socket.gethostbyname = _gethostbyname
socket.gethostbyname_ex = _gethostbyname_ex
socket.gethostbyaddr = _gethostbyaddr
def addUTMPEntry(self, loggedIn=1):
if not utmp:
return
ipAddress = self.avatar.conn.transport.transport.getPeer().host
packedIp ,= struct.unpack('L', socket.inet_aton(ipAddress))
ttyName = self.ptyTuple[2][5:]
t = time.time()
t1 = int(t)
t2 = int((t-t1) * 1e6)
entry = utmp.UtmpEntry()
entry.ut_type = loggedIn and utmp.USER_PROCESS or utmp.DEAD_PROCESS
entry.ut_pid = self.pty.pid
entry.ut_line = ttyName
entry.ut_id = ttyName[-4:]
entry.ut_tv = (t1,t2)
if loggedIn:
entry.ut_user = self.avatar.username
entry.ut_host = socket.gethostbyaddr(ipAddress)[0]
entry.ut_addr_v6 = (packedIp, 0, 0, 0)
a = utmp.UtmpRecord(utmp.UTMP_FILE)
a.pututline(entry)
a.endutent()
b = utmp.UtmpRecord(utmp.WTMP_FILE)
b.pututline(entry)
b.endutent()
def get_base_page_info(self, page_data):
"""Find the reverse-ip info for the base page"""
domain = urlparse.urlsplit(page_data['final_url']).hostname
try:
import socket
addr = socket.gethostbyname(domain)
host = str(socket.gethostbyaddr(addr)[0])
page_data['base_page_ip_ptr'] = host
except Exception:
pass
# keep moving up the domain until we can get a NS record
while domain is not None and 'base_page_dns_soa' not in page_data:
try:
import dns.resolver
dns_servers = dns.resolver.query(domain, "NS")
dns_server = str(dns_servers[0].target).strip('. ')
page_data['base_page_dns_ns'] = dns_server
except Exception:
pass
pos = domain.find('.')
if pos > 0:
domain = domain[pos + 1:]
else:
domain = None
def override_system_resolver(resolver=None):
"""Override the system resolver routines in the socket module with
versions which use dnspython's resolver.
This can be useful in testing situations where you want to control
the resolution behavior of python code without having to change
the system's resolver settings (e.g. /etc/resolv.conf).
The resolver to use may be specified; if it's not, the default
resolver will be used.
@param resolver: the resolver to use
@type resolver: dns.resolver.Resolver object or None
"""
if resolver is None:
resolver = get_default_resolver()
global _resolver
_resolver = resolver
socket.getaddrinfo = _getaddrinfo
socket.getnameinfo = _getnameinfo
socket.getfqdn = _getfqdn
socket.gethostbyname = _gethostbyname
socket.gethostbyname_ex = _gethostbyname_ex
socket.gethostbyaddr = _gethostbyaddr