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

我正在尝试这样运行它:

[blah@blah ~]$ ./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)

所以我然后尝试运行以下 for 循环:

[blah@blah ~]$ 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 脚本,并且只输入一个服务器名称,它的工作原理就像......嗯......预期的那样。

我究竟做错了什么?

4

2 回答 2

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)
于 2013-07-24T14:47:00.527 回答
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

 }

这将为集合中的每个元素循环运行命令,因此第一个服务器与第一个用户和第一个密码在循环中然后转到第二个等等。

于 2013-07-29T23:21:41.013 回答