我正在使用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连接,并期望在将控制权返回给用户之前自动登录。
有什么想法吗?
答案 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
。