【问题标题】:Expect in Alias期待别名
【发布时间】:2014-10-28 19:39:40
【问题描述】:

我正在使用 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 连接,并希望在将控制权返回给用户之前自动登录。

有什么想法吗?

【问题讨论】:

  • 您的别名 z 指向的是 sshFunc 而不是 sshFuncB。我希望这是一个错字。一个问题。你有任何输出吗?

标签: bash ssh expect


【解决方案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

注意expect-c标志的使用,有任何疑问可以参考here

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

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

还有一个更新。由于这是连接到路由器并进行一些手动操作,因此最好在末尾加上interact

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 2019-10-29
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多