2013-07-24 42 views
1

我试图使用期望脚本来更改我的密码在多个服务器上,但我有点困惑如何将服务器列表传递给它。如何将多个服务器传递给期望脚本?

,我使用的脚本如下:

#!/usr/bin/expect -f 
# wrapper to make passwd(1) be non-interactive 
# username is passed as 1st arg, passwd as 2nd 

set username [lindex $argv 0] 
set password [lindex $argv 1] 
set serverid [lindex $argv 2] 
set newpassword [lindex $argv 3] 

spawn ssh -t $serverid passwd 
expect "assword:" 
sleep 3 
send "$password\r" 
expect "UNIX password:" 
sleep 3 
send "$password\r" 
expect "password:" 
sleep 3 
send "$newpassword\r" 
expect "password:" 
sleep 3 
send "$newpassword\r" 
expect eof 

而且我试图运行它是这样:

[[email protected] ~]$ ./setkey1 blah password 'cat serverlist' meh 

这给了我下面的输出:

spawn ssh -t cat serverid passwd 
ssh: cat serverid: Name or service not known 
send: spawn id exp6 not open 
    while executing 
"send "$password\r"" 
    (file "./setkey1" line 13) 

所以我试着运行下面的循环:

[[email protected] ~]$ for i in serverid; do `cat serverid`; ./setkey1 blah password $i meh; done 

这给了我如下:

-bash: staging01v: command not found 
spawn ssh -t serverid passwd 
ssh: serverid: Name or service not known 
send: spawn id exp6 not open 
    while executing 
"send "$password\r"" 
    (file "./setkey1" line 13) 

如果我尝试使用expect脚本,只是在一个服务器名称输入,它的工作原理是......嗯......期待。

我在做什么错?

回答

1

有很多方法可以解决这个问题。我会改变你的参数的顺序,以便能够通过多个服务器。

在期待程序:

foreach {username password newpassword} $argv break 
set servers [lrange $argv 3 end] 

foreach serverid $servers { 
    # your existing code goes here 
} 
从外壳

然后调用它像这样

./setkey1 userid pass newpass $(cat servers.txt) 

如果你使用bash,你可以做

./setkey1 userid pass newpass $(<servers.txt) 
+0

有趣。因此,要清楚,我更换: 组用户名[LINDEX $ ARGV 0] 设置的密码[LINDEX $ ARGV 1] 组服务器ID [LINDEX $ ARGV 2] 设定新密码[LINDEX $ ARGV 3] 与 的foreach {用户名密码新密码} $ argv的突破 组服务器[lrange $ argv的3月底] 的foreach服务器ID $服务器{ #现有的代码放在这里 } 这看起来像它使一个很大的意义。 非常感谢! –

+0

在'foreach'循环内将会是你的产卵,期望和发送语句。 –

+0

非常感谢Glenn的帮助。 –

0

我做了什么类似这里是我的方式

set servers "server1 server2 server3" 
set users "user1 user2 user3" 
set passwords "password1 password2 password3" 
set newpasswords "new1 new2 new3" 

foreach server $servers user $users password $passwords newpassword $newpasswords 
{ 

Your commands using the variables server/user/password/newpassword 

} 

这将在集 与在循环中与第一密码第一用户所以第一服务器然后进入第二等在运行用于每个元件的环路中的命令..

相关问题