《Linux运维总结:sshpass一个很棒的免交互SSH登录工具》

  • Post author:
  • Post category:linux






一、sshpass介绍




ssh登陆不能在命令行中指定密码,也不能以shell中随处可见的,sshpass的出现,解决了这一问题。它允许你用“-p”参数指定明文密码,然后直接登录远程服务器。 它支持密码从命令行,文件,环境变量中读取。





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






二、sshpass安装

# 源码包安装
wget http://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz 
tar xvzf sshpass-1.05.tar.gz 
cd sshpass-1.05
./configure 
make 
make install 

# yum安装
yum install -y epel-release
yum  -y install sshpass




三、sshpass使用

[root@localhost ~]# 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 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

参数:
-p   password    #将参数password作为密码。
-f   passwordfile #提取文件passwordfile的第一行作为密码。
-d   使用数字作为文件描述符来获取密码
-e   将环境变量SSHPASS作为密码。




实例如下:


# 1、免密码登录
sshpass -p "123456" ssh -o 'StrictHostKeyChecking=no' root@192.168.1.149

# 2、远程执行命令
sshpass -p "123456" ssh root@192.168.1.149 "yum install vim -y"

# 3、从文件中读取密码
echo 123456 > password.txt
sshpass -f password.txt ssh root@192.168.1.149 "ip a | grep ens33"

# 4、从变量中读取密码
export SSHPASS="123456"
sshpass -e ssh root@192.168.1.149 
sshpass -e ssh root@192.168.1.149 "ip a | grep ens33"

# 5、本地文件发送到远程主机
sshpass -p "123456" scp /tmp/b.txt root@192.168.1.149:/tmp

# 6、从远程主机上拉取文件到本地
sshpass -p "123456" scp root@192.168.1.149:/tmp/b.txt /tmp




说明:sshpass不可以直接接带特殊字符意义的密码,需要转义或者用小括号,或者指定文件的方式来连接都可以规避这个问题。






四、sshpass实例




背景:定期修改服务器(1000台左右)密码之后,验证是否修改成功。


#cat ip.txt
192.168.1.149
192.168.1.150
192.168.1.151

#cat check_passwd.sh
#!/bin/bash
ips=`cat ip.txt`
for ip in $ips
do
    echo ==========$ip===========
    sshpass -p "123456" ssh root@$ip ":" 
    [ $? -eq 0 ] && echo -e  "\033[32m ==$ip==password is ok... \033[0m" || echo -e "\033[31m ==$ip==Password is error!!! \033[0m"
done




总结:整理不易,如果对你有帮助,可否点赞关注一下?




更多详细内容请参考:

Linux运维实战总结





版权声明:本文为m0_37814112原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。