2014-10-28 58 views
1

我正在使用Bash别名,它允许我缩短SSH命令以便登录到我的路由器。相当微不足道,但节省时间!我现在想要做的就是更进一步,并完全自动化路由器的登录。期待别名

举例来说,在我的~/.bashrc文件我有以下条目:

sshFuncB() 
{ 
    ssh -o StrictHostKeyChecking=no [email protected]$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

您的别名'z'指向'sshFunc'而不是'sshFuncB'。我希望这是一个错字。一个问题。你得到任何输出? – Dinesh 2014-10-28 11:12:23

回答

1

这是可以做到如下,

sshFuncB() 
{ 
    expect -c " 
    spawn ssh -o StrictHostKeyChecking=no [email protected]$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参考的任何疑问。

如果我们使用expect代码的双引号与-c标志,它将允许bash替换。如果你使用相同的单引号,则bash替换将不起作用。 (你已经在期望中使用了@1,这就是为什么我使用双引号)因为我已经对整个期望代码使用了双引号,所以我们必须在期望语句内部使用反斜杠来转义每个双引号,如下所示:

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

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