sshpass

前言:

  ssh命令, 没有指定密码的参数. 以至于在脚本中使用ssh命令的时候, 必须手动输入密码, 才能继续执行. 这样使得脚本的自动化执行变得很差, 尤其当ssh对应的机器数很多的时候, 会令人抓狂.本文讲解了两种方式, 一种借助expect脚本, 一种借助sshpass来实现.

*) 借助expect脚本来实现
1. expect不是系统自带的工具, 需要安装
yum install expect -y

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开始,分别表示第一个,第二个,第三个....参数

简单例子:


1

2

3

4

5

6


#! /usr/bin/expect

spawn sudo apt-get install vim

expect "password"

send "<password>\r"

expect eof

这样就可以避免输入sudo密码了

3. 案例编写


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的使用

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

或者

# 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 [email protected] "hostname"

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

vic8

时间: 2024-10-11 05:48:05

sshpass的相关文章

sshpass 配置与用法介绍

sshpass 配置安装 一.sshpass介绍 ssh登陆不能在命令行中指定密码,需要用户交互输入密码,sshpass 的出现,解决了这一问题.它允许你用 -p 参数指定明文密码,然后直接登录远程服务器, 它支持密码从命令行.文件.环境变量中读取.所以,通过sshpass实现以非交互的形式为ssh提供密码. 二.安装配置 1.下载:目前1.0.5是最新版本,下载地址: wget http://sourceforge.net/projects/sshpass/files/sshpass/1.05

sshpass+expect解决交互式问题

1.sshpass: 使用场景: ssh登陆不能在命令行中指定密码,sshpass 的出现,解决了这一问题,用于非交互的ssh 密码验证 它支持密码从命令行,文件,环境变量中读取. 安装 [[email protected] ~]# yum install sshpass -y 已安装:   sshpass.x86_64 0:1.05-1.el6                                                                            

利用sshpass和ssh编写脚本远程执行命令

import subprocess import os (rfd, wfd) = os.pipe() arg = "-d%d" % rfd try: p = subprocess.Popen(["sshpass",arg,"ssh","-l","haohzhang","phxaishdc9dn1447.stratus.phx.ebay.com","ls","

推送文件(expect交互式方式与sshpass非交互式方式)

前提条件 以下两种推送的文件是SSH的公钥,推送方式依赖于SSH,基于SSH的相关方面操作和机器相关配置请参考我的上一篇博文"ssh服务批量管理例子" 1.expect交互式方式 1.1上传文件及文件内容 #以10机器为例. #执行rz –y分别上传"dis-sshkey"."expect-copy-sshkey.exp"和"iplist",三者文件内容如下: [[email protected] ~]$ ls -l dis-

sshpass批量执行操作

while read line do ./sshpass -p 密码 ssh [email protected]$line “ls” done<./backup while read line ;do /usr/bin/sshpass -p 密码 ssh [email protected] “ls”; done <./ip.list for i in `cat ip.list` ;do /usr/bin/sshpass -p 密码 ssh [email protected] “ls”; don

sshpass: 用于非交互的ssh 密码验证

ssh登陆不能在命令行中指定密码,也不能以shell中随处可见的,sshpass 的出现,解决了这一问题.它允许你用 -p 参数指定明文密码,然后直接登录远程服务器. 它支持密码从命令行,文件,环境变量中读取 $> sshpass -h Usage: sshpass [-f|-d|-p|-e] [-hV] command parameters -f filename Take password to use from file -d number Use number as file descr

shell 密码输入不显示,Shell输出内容不显示密码,Shell实现有密码自动登录sshpass 应用实践

在很多实践项目中,我们经常会通过SSH来进行认证,如通过SSH拷贝文件,虽然我们可以使用公钥与私钥实现ssh 无密码登录,在不同的服务器上又需要配对相应的密钥,切换用户麻烦等问题,在一些需要交互但会涉及到批量处理的时候,通过shell 密码输入不显示,Shell输出内容不显示密码,Shell实现有密码自动登录会大大的提高工作效率 #! /bin/bash ############################################## #Author:                

Ansible 必须安装sshpass计划(you must install the sshpass program)

安装ansible远程执行命令时报错 未能使用的ssh连接类型和密码,您必须安装sshpass计划 Ansible使用sshpass程序通过SSH登录到服务器时使用的密码. 出于安全原因,你应该Ansible登录服务器使用SSH密钥,但对于新服务器最初是简单的登录密码,Ansible设置用户和SSH密钥,然后后续登录使用SSH密钥. sshpass错误,可以从源代码安装sshpass有以下步骤: curl -O -L http://downloads.sourceforge.net/projec

远程连接服务器工具:sshpass

有些时候,服务器需要登录其它服务器执行远程命令,比如说为了安全考虑,公司的activemq服务器是没有外网权限的,但是如果activemq出了故障需要告警,这个时候就需要让activemq的服务器连接到一台有外网权限的服务器上去执行告警的脚本. 遇到这种情况,方法之一就是SSH互信,虽然前期生成指纹麻烦一点,这样以后每次的连接就不用输入密码了,而且这个方法是最安全的!或者使用expect和sshpass这种小工具来达到我们的目的.这里我没有使用expect,因为它里面文件的格式太奇葩了,所以我使