2013-02-22 58 views
1

我有CSV文件中的文件conatainning列aranged像IPS:从Python中的文件循环播放一些ips?

10.38.227.233,VLAN-A,23 
10.38.227.233,VLAN-XYZ,27 
10.38.227.233,VLAN-XZ,27 
10,38.169.103,VLAN-ABCD,11 
10,38.169.103,VLAN-ABCD,16 
10,38.169.103,VLAN-ABD,17 

为每个IP我需要登录到Cisco交换机和IP 10.38.227.233执行某些命令( VLAN-A,23 | VLAN-XYZ,27 | VLAN-XZ,27)

所有ips都有相同的密码,所以我试图只从密码提示一次,并从文件中循环播放ips。

我是这方面的新手,已经开始这样,但似乎没有工作。 现在,我通过在远程的* nix机器上执行简单LS开始一些测试,但它不工作

#!/usr/bin/python 
import pexpect 
import getpass 
import time 

iplist = ['10.39.5.41', '10.38.164.103', '10.38.227.229'] 

for ip in iplist: 
       sshCmd = "ssh " + "auto21" + "@" + ip 
       #auto21 is a username 
       print "Command: " + sshCmd + "\n" 

       answer = 'yes/no' 
       prompt = 'password:' 
       password = getpass.getpass('password:') 

       #Sends answer based on target server response/known host 
       p = pexpect.spawn(sshCmd) 
       i = p.expect([answer, prompt]) 
       print i 
       if i==0: 
        print 'Sending yes...' 
        p.sendline('yes') 
        p.expect(prompt) 
        print 'Sending password...' 
        p.sendline(password) 
        p.sendline('ls\r') 
        p.expect(pexpect.EOF,timeout=20) 
        print p.before,p.after 
       if i==1: 
        print 'Sending password...' 
        p.sendline(password) 
        p.sendline(password) 
        p.sendline('ls\r') 
        p.expect(pexpect.EOF) 


       try: 
        p.interact() 
        sys.exit(0) 
       except: 
        sys.exit(1) 

这就是我得到:

bash-3.00# python ip.py 
Command: ssh [email protected] 

password: 
1 
Sending password... 
Traceback (most recent call last): 
    File "ip.py", line 35, in <module> 
    p.expect(pexpect.EOF,timeout=20) 
    File "/G4_Automation/user_mgmt/test/pexpect.py", line 1311, in expect 
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize) 
    File "/G4_Automation/user_mgmt/test/pexpect.py", line 1325, in expect_list 
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize) 
    File "/G4_Automation/user_mgmt/test/pexpect.py", line 1409, in expect_loop 
    raise TIMEOUT (str(e) + '\n' + str(self)) 
pexpect.TIMEOUT: Timeout exceeded in read_nonblocking(). 
<pexpect.spawn object at 0x15aef0> 
version: 2.3 ($Revision: 399 $) 
command: /usr/bin/ssh 
args: ['/usr/bin/ssh', '[email protected]'] 
searcher: searcher_re: 
    0: EOF 
buffer (last 100 chars): st login: Fri Feb 22 08:55:05 2013 from p13adv 
Testgfs2 
-sh-3.2$ ls 
-sh-3.2$ 
-sh-3.2$ 
before (last 100 chars): st login: Fri Feb 22 08:55:05 2013 from p13adv 
Testgfs2 
-sh-3.2$ ls 
-sh-3.2$ 
-sh-3.2$ 
after: <class 'pexpect.TIMEOUT'> 
match: None 
match_index: None 
exitstatus: None 
flag_eof: False 
pid: 29911 
child_fd: 3 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.EOF'> 
logfile: None 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

请帮

此外,我如何循环访问文件中的ips并在ssh作用域中执行一些命令。

注意:每个IP将有多个VLAN,但每个VLAN将只有一个ID(如11,12)

编辑:我需要在SSH范围内运行一些命令

ssh [email protected] "config t 
         int VLAN-A 
         switchport access VLAN-A 23 
         wr 
        #then for next VLAN for the current ip 
         config t 
         int VLAN-A 
         switchport access VLAN-A 23 
         wr 
        #and so on...............       
         " 
+0

请打印输出您期望的结果以及您所看到的错误消息。 – jknupp 2013-02-22 14:38:10

回答

0

首先,您需要将getpass行移至开始循环之前,它将只会要求密码一次。

你得到的错误是超时的结果,基本上ssh的响应时间太长。

因为你想要做的事很简单。结账支票(https://pypi.python.org/pypi/spur)。它有一个非常干净的接口来发送命令。

+0

我不知道我是否可以使用'spur'这种方式来使用pexpect,因为我没有安装pexpect的权限,我只是将'pexpect.py'模块复制到了我正在运行该脚本的目录中,并且它工作正常。 – munish 2013-02-22 15:20:31

+0

是否安装了virtualenv?如果是这样,你应该可以使用它来创建本地软件包回购,然后安装spur。或者让你的服务器管理员安装它。 – 2013-02-22 16:07:11

0

SSH -o NumberOfPasswordPrompts = 1 -o StrictHostKeyChecking =无-o UserKnownHostsFile =的/ dev/null的-l用户[主机名或IP] -p 22

无需发送是