sshpass

前言:java

  ssh命令, 沒有指定密碼的參數. 以致於在腳本中使用ssh命令的時候, 必須手動輸入密碼, 才能繼續執行. 這樣使得腳本的自動化執行變得不好, 尤爲當ssh對應的機器數不少的時候, 會使人抓狂.本文講解了兩種方式, 一種藉助expect腳本, 一種藉助sshpass來實現.shell

*) 藉助expect腳原本實現
1. expect不是系統自帶的工具, 須要安裝
yum install expect -yvim

2. expect腳本的編寫規則數組

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

1
2
3
4
5
6
#! /usr/bin/expect
 
spawn sudo apt-get install vim
expect  "password"
send  "<password>\r"
expect eof

這樣就能夠避免輸入sudo密碼了ssh

3. 案例編寫ide

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#! /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參數對後續字符串, 打開轉義支持開關.工具

*) sshpass的使用this

官網地址: http://sourceforge.net/projects/sshpass/
 安裝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 installspa

或者

# yum install epel-release

已加載插件:fastestmirror

# yum repolist

# yum -y install sshpass

用法:

# sshpass

Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters

   -f filename   Take password to use from file

   -d number     Use number as file descriptor for getting password

   -p password   Provide password as argument (security unwise)

   -e            Password is passed as env-var "SSHPASS"

   With no parameters - password will be taken from stdin


   -P prompt     Which string should sshpass search for to detect a password prompt

   -v            Be verbose about what you're doing

   -h            Show help (this screen)

   -V            Print version information

At most one of -f, -d, -p or -e should be used

# export SSHPASS="user_password"

# sshpass -e ssh -p22022 root@192.168.5.77 "hostname"

Nasty PTR record "192.168.5.77" is set up for 192.168.5.77, ignoring

vic8

相關文章
相關標籤/搜索