我正在使用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连接,并期望在将控制权返回给用户之前自动登录。有任何想法吗?
最佳答案
这可以按如下方式完成:
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
请注意,您可以从here中引用
-c
中的expect
标志,您对此有任何疑问。如果我们对带有
expect
标志的-c
代码使用双引号,则将允许bash替换。如果您使用单引号将其引起来,则bash替换将不起作用。 (您在Expect中使用了@1
,这就是为什么我使用双引号的原因)因为我在整个Expect代码中使用了双引号,所以我们必须在Expect语句中使用反斜杠对每个双引号进行转义,如下所示, expect {
# Escaping the double quote with backslash
\"password: \" {some_action_here}
}
再更新一次。由于这是关于连接到路由器并执行一些手动操作的,因此最好在末尾添加
interact
。
关于bash - 期望别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26606513/