一、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 版权协议,转载请附上原文出处链接和本声明。