2014-10-28 56 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