2015-04-08 105 views
0

我是Python新手。无法让我的第一个脚本正常工作。 我想要什么:从XLSPython IP输出(打印)无法正常工作

  1. 获取IP
  2. 打印的是IP
  3. 远程登录到IP
  4. 授权
  5. 显示运行\ -N,退出\ n
  6. 写输出到文件命名“IP”
  7. 从xls获取下一个IP

此XLS包含约6k个主机。我对制作多线程有一些想法,但对此还一无所知。将很快尝试。

问题是,我无法在控制台中获得好的“打印(主机)”输出。脚本运行良好,但不是正确的IP名称,而是每次都看到第一个IP。

IP列表:

10.1.115.105 10.1.115.108 10.1.115.143 等

我在聊天

[根@本地蟒蛇]#python3.3 telnet_bck.py看

10.1.115.105

10.1.115.105

10.1.115.105

但文件正确保存

-rw-R - R-- 1根根16536年04月08 7点38分10.1.115.105

-rw-R --r-- 1根根16536年04月08 7点38 10.1.115.108

-rw-R - R-- 1根根16536年04月08 6点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 
+1

您正在打印'ip_addr_list [0]',但正在创建'ip_addr_list [num_ips]'文件名。 –

+0

谢谢。麻烦真的在这里。是否有可能+评论,而不是答案? –

回答

1

正如您正确地假设,问题正好在host = ip_addr_list[0]ip_addr_list是元素列表(数组),[0]是元素列表中的索引。所以无论您的循环运行多少次,host将永远是您的ip_addr_list的第一个元素。 另外,迭代列表还有更多的“pythonic”方式。这将是:

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, userpassword定义移出循环。它们总是一样的,所以每次都不需要价值。

+0

非常感谢!它现在有效。顺便说一下,什么意思是“更多”pythonic“”的方式?为什么在xy中使用yx比“while”更好?我在官方网站 –

+0

的主要手册中发现了简短的回答是,“对于yy中的xx”循环负责遍历列表中的每个元素。你不必担心增加索引变量。而且,列表的当前元素直接以“xx”变量结束,您不必将其作为“some_list [index]”引用。 如果你关心更广泛的消除,你可以在这里阅读http://blog.startifact.com/posts/older/what-is-pythonic.html –

+0

谢谢你的答案! –