for loop,expect和pssh

时间:2016-11-23 18:49:00

标签: for-loop ssh expect

我需要一个脚本来修改多个服务器中的相同数据。现在for循环生成命令行,但我遇到了expect和pssh的一些问题。

for循环:

<code>
    for ((var1=1;var1<=14; var1++))
    {
      cda stm add "$var1/$var2/$var3" ss 1
        for ((var2=1;var2<=8;var2++))
        {
          cda stm add "$var1/$var2/$var3" ss 1
            for ((var3=1; var3<64; var3++))
            {
              cda stm add "$var1/$var2/$var3" ss 1
            }
        }
    }
</code>

我在期望剧本中使用pssh代替ssh。

完整代码:

<code>

    #!/usr/bin/expect

    set timeout 20

    set ip [lindex $argv 0]
    set user [lindex $argv 1]
    set password [lindex $argv 2]

        for ((var1=1;var1<=14; var1++))
{
  cda stm add "$var1/$var2/$var3" ss 1
    for ((var2=1;var2<=8;var2++))
    {
      cda stm add "$var1/$var2/$var3" ss 1
        for ((var3=1; var3<64; var3++))
        {
          cda stm add "$var1/$var2/$var3" ss 1
        }
    }
}        
    spawn pssh "$user\@$ip"

    expect "yes/no" {
            send "yes\r"
            expect "*?assword" { send "[lindex $argv 2]\r" }
            } "*?assword" { send "[lindex $argv 2]\r" }
            expect "SH"

    interact
</code>

我收到以下错误:

<code>
wrong # args: should be "for start test next command"
    while executing
"for ((var1=1"
    (file "./ssh" line 9)
</code>

2 个答案:

答案 0 :(得分:0)

expect中的

for循环和Tcl必须如下所示:

for {set var1 1} {$var1<=14} {incr var1} {
    commands...
}

换句话说,for命令需要 四个参数:起始码,条件,“下一个”代码和循环体。请注意,换行符是Tcl中的命令分隔符,因此循环体的左括号必须for命令位于同一行(或者必须使用反斜杠换行符续行)

您使用的是bash / ksh语法。

答案 1 :(得分:0)

除了for循环中的语法错误之外,问题中的代码片段存在逻辑问题:

  • var2不能在最外层循环中打印(第一次)。
  • var3不能在第二次循环中打印(第一次)。

这可能是你需要的:

for {set var1 1} {$var1 <=14} {incr var1} {
    puts "LEVEL_1: $var1"
    # cda stm add "$var1" ss 1
    for {set var2 1} {$var2 <=8} {incr var2} {
        puts "LEVEL_2: $var1/$var2"
        # cda stm add "$var1/$var2" ss 1
        for {set var3 1} {$var3 <64} {incr var3} {
            puts "LEVEL_3: $var1/$var2/$var3"
            # cda stm add "$var1/$var2/$var3" ss 1
        }
    }
}