Alias期待

时间:2014-10-28 10:55:53

标签: bash ssh expect

我正在使用Bash别名,允许我缩短SSH命令,以便我登录我的路由器。相当琐碎,但节省时间!我现在要做的是更进一步,完全自动化登录路由器。

例如,在我的~/.bashrc文件中,我有以下条目:

sshFuncB()
{
    ssh -o StrictHostKeyChecking=no superuser@$1 - | /usr/bin/expect<<EOF  
    set timeout 5
    set send_human {.1 .3 1 .05 2}

    expect {
        "password: " { send -h "MYPASSWORD\r" }
        "No route to host" { exit 1 }
        timeout { exit 1 }
    }
    set timeout 2
    sleep 1
    expect { 
        "N]?" { send "y\r"; exp_continue }
        timeout { exit 1 }
    }
    expect eof
EOF
}

alias z=sshFunc

但是,当我输入z myrouterhostname时,这不会提供所需的输出。我必须找到一种方法来启动SSH连接,并期望在将控制权返回给用户之前自动登录。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这可以按照以下方式完成,

sshFuncB()
{
    expect -c "
    spawn ssh -o StrictHostKeyChecking=no superuser@$1   
    set timeout 5
    set send_human {.1 .3 1 .05 2}

    expect {
        \"password: \" { send -h \"MYPASSWORD\r\" }
        \"No route to host\" { exit 1 }
        timeout { exit 1 }
    }
    set timeout 2
    sleep 1
    expect { 
        \"N]?\" { send \"y\r\"; exp_continue }
        timeout { exit 1 }
    }
    expect eof
   "
}

alias z=sshFuncB

请注意,-c中使用expect标记,您可以从here引用您的标记有任何疑问。

如果我们对带有expect标志的-c代码使用双引号,它将允许bash替换。如果你使用单引号,那么bash替换将不起作用。 (你在expect中使用了@1,这就是我使用双引号的原因)因为我对整个期望代码使用了双引号,我们必须在expect语句中使用反斜杠转义每个双引号,如下所示,

   expect {
        # Escaping the double quote with backslash
        \"password: \" {some_action_here}
   }

还有一次更新。由于这是关于连接到路由器并执行一些手动操作,因此最好在最后使用interact