我是Python的新手。无法让我的第一个脚本运行良好。 我想要的是什么:
此XLS包含大约6k个主机。我对制作多线程有一些想法,但对此却一无所知。将尽快尝试。
问题是,我无法获得好处" print(host)"在控制台输出。脚本工作得很好,但每次第一次IP时都会看到IP的正确名称。
IP列表:
10.1.115.105 10.1.115.108 10.1.115.143 等
我在聊天中看到
[root @ localhost python] #python3.3 telnet_bck.py
10.1.115.105
10.1.115.105
10.1.115.105
但文件正确保存
-rw-r - r-- 1 root root 16536 Apr 8 07:38 10.1.115.105
-rw-r - r-- 1 root root 16536 Apr 8 07:38 10.1.115.108
-rw-r - r-- 1 root root 16536 Apr 8 06:53 10.1.115.243
我猜问题就在附近" host = ip_addr_list [0]"但无法理解在哪里。伙计们,请帮忙。任何帮助将不胜感激。
import xlrd #Excel module
import re #Parser module
import os
import glob
import sys
import telnetlib #telnet module
rb = xlrd.open_workbook('/samba/allaccess/test.xlsx')
sheet = rb.sheet_by_name('IPs')
num_rows = sheet.nrows
num_cols = sheet.ncols
ip_addr_list = [sheet.row_values(rawnum)[0] for rawnum in range(sheet.nrows)]
num_ips = 0
while num_ips < num_rows:
host = ip_addr_list[0]
port = "23"
user = "test"
password = "test"
print(host)
tn = telnetlib.Telnet(host,port)
tn.read_until(b"ser name:")
tn.write(user.encode('ascii')+b"\n")
tn.read_until(b"assword:")
tn.write(password.encode('ascii')+b"\n")
tn.write(b"sh ru"+b"\n")
tn.write(b"exit"+b"\n")
str_all = tn.read_all()
re.sub("^\s+|\n|\r|\s+$", '', str_all.decode())
file = open('{0}'.format(ip_addr_list[num_ips]),"wb")
file.write(str_all)
num_ips += 1
答案 0 :(得分:1)
正如您所正确假设的那样,问题正好在host = ip_addr_list[0]
中。 ip_addr_list
是元素的列表(数组),[0]
是列表中元素的索引。因此,无论您的循环运行多少次,host
将始终是ip_addr_list
的第一个元素。
此外,还有更多的&#34; pythonic&#34;迭代列表的方式。它将是:
for host in ip_addr_list:
port = "23"
user = "test"
password = "test"
print(host)
tn = telnetlib.Telnet(host,port)
tn.read_until(b"ser name:")
tn.write(user.encode('ascii')+b"\n")
tn.read_until(b"assword:")
tn.write(password.encode('ascii')+b"\n")
tn.write(b"sh ru"+b"\n")
tn.write(b"exit"+b"\n")
str_all = tn.read_all()
re.sub("^\s+|\n|\r|\s+$", '', str_all.decode())
file = open('{0}'.format(host),"wb")
file.write(str_all)
num_ips += 1
这种方式在循环的每次迭代中,host
将包含来自ip_addr_list
的下一个元素。
您也可以考虑将port, user
和password
定义移出循环。它们总是一样的,所以每次有价值时都不需要asigne。