shell 脚本实战笔记(8)--ssh免密码输入执行命令

前言: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>"