我尝试了各种方法将主机名的变量替换为 socket.connect 调用,但我无法让它工作。我正在进行替换 b/c 我想从文件中读取主机 IP 列表并连接到每个主机 IP。我已将变量正确格式化为带有单引号的字符串,但它不会连接:
# Connect to the Servers LOOP
with open(sys.argv[2], 'r') as f1:
for server in f1:
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = server.strip('\n')
server = "'%s'" % server
print 'Connecting to ' + server
#connect=s.connect(('10.11.1.229',25))
connect=s.connect((server,25))
# Receive the banner
banner=s.recv(1024)
print banner
s.close
如果我对主机名进行硬编码,它就可以正常工作。执行结果为:
Connecting to '10.11.1.8'
Traceback (most recent call last):
File "./connect-loop.py", line 19, in <module>
connect=s.connect((server,25))
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.gaierror: [Errno -2] Name or service not known
感谢任何帮助...
最佳答案
问题是您在服务器名称中添加了勾号(我猜,是为了在打印时正确格式化它),然后在解析主机名时对其进行解释。
尝试:
with open(sys.argv[2], 'r') as f1:
for server in f1:
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server = server.strip('\n')
print 'Connecting to {} ...'.format(repr(server))
connect=s.connect((server,25))
banner=s.recv(1024)
print repr(banner)
s.close()
变化:
- 直接在
print
行中设置主机名格式,并使用repr
引用它。 - 删除不需要的主机名格式行
- 在
close()
末尾添加缺少的括号。
关于repr
的注意事项:它返回给定值的“人类表示”,对于字符串值来说,它与引用的字符串相同。
关于主机名的 Python 套接字替换变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40695582/