shell 腳本實戰筆記(8)--ssh免密碼輸入執行命令


前言:

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

*) 借助expect腳本來實現
1. expect不是系統自帶的工具, 需要安裝
yum install expect -y

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開始,分別表示第一個,第二個,第三個....參數

簡單例子:

#! /usr/bin/expect

spawn sudo apt-get install vim
expect "password"
send "<password>\r"
expect eof

這樣就可以避免輸入sudo密碼了

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參數對后續字符串, 打開轉義支持開關.

*) sshpass的使用

官網地址: 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 install

2. sshpass命令的詳解

3. sshpass簡單示例
sshpass -p <password> ssh <username>@<server_ip> "<command>"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM