前言:java
ssh命令, 沒有指定密碼的參數. 以致於在腳本中使用ssh命令的時候, 必須手動輸入密碼, 才能繼續執行. 這樣使得腳本的自動化執行變得不好, 尤爲當ssh對應的機器數不少的時候, 會使人抓狂.本文講解了兩種方式, 一種藉助expect腳本, 一種藉助sshpass來實現.shell
*) 藉助expect腳原本實現
1. expect不是系統自帶的工具, 須要安裝
yum install expect -yvim
2. expect腳本的編寫規則數組
1. [#!/usr/bin/expect] 告知系統腳本里的代碼使用那一個shell來執行。 注意:這一行須要在腳本的第一行。 2. [set timeout <timeout>] 基本上認識英文的都知道這是設置超時時間的,如今你只要記住他的計時單位是:秒. timeout -1 爲永不超時 3. [spawn <command>] spawn是進入expect環境後才能夠執行的expect內部命令, 主要給後續的命令加個殼, 用來傳遞交互指令. 4. [expect "<match_string>"] 這裏的expect也是expect的一個內部命令,請不要驚訝. 5. [send "<response_string>\r"] 這裏就是執行交互動做,與手工輸入內容的動做等效。 舒適提示: 命令字符串結尾別忘記加上「\r」,若是出現異常等待的狀態能夠覈查一下. 6. [interact] 執行完成後保持交互狀態,把控制權交給控制檯, 若要退出,使用expect eof代替 7. $argv 參數數組 expect腳本能夠接受從bash傳遞過來的參數.能夠使用[lindex $argv n]得到,n從0開始,分別表示第一個,第二個,第三個....參數
簡單例子:bash
#! /usr/bin/expect spawn sudo apt-get install vim expect "password" send "<password>\r" expect eof
這樣就能夠避免輸入sudo密碼了ssh
3. 案例編寫工具
#! /bin/bash function auto_ssh() { username_server="$1" password="$2" command="$3" ssh_warpper=" spawn ssh -o StrictHostKeyChecking=no $username_server \"$command\"\n expect { \n -nocase \"password:\" {send \"$password\r\"} \n } \n expect eof \n " echo -e $ssh_warpper | /usr/bin/expect } auto_ssh root@172.16.1.121 123456 "ifconfig eth0"
評註:
ssh -o StrictHostKeyChecking=no 對首次登陸的機器不進行檢查, 避免了用戶手動輸入yes/no
echo -e $ssh_warpper, -e參數對後續字符串, 打開轉義支持開關.spa
*) sshpass的使用.net
官網地址: http://sourceforge.net/projects/sshpass/
1. 安裝sshpass
wget http://nchc.dl.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
tar zxvf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure
make && make install3d
2. sshpass命令的詳解
3. sshpass簡單示例
sshpass -p <password> ssh <username>@<server_ip> "<command>"