yum -y install expect tcl tcl-devel //安装expect交互工具
用法:
1)#!/usr/bin/expect //定义脚本执行的shell
2)set timeout 30 //设置超时时间30s
3)spawn //传递交互命令
4)expect //判断输出结果是否包含某项字符串,没有则立即返回
5)send //执行交互动作
6)interact //执行完后保持交互状态,把控制权交给控制台
7)exp_continue //继续执行接下来的操作
vim expect.exp //运行脚本使用命令:expect expect.exp
#!/usr/bin/expect //定义脚本执行的shell
spawn ssh root@ip地址 //启动系统中需要交互的程序
expect
{
"yes/no" {send "yes\r"; exp_continue} //send发送回答,\r代表回车
//exp_continue,在"yes/no"没出现时忽略这句话
"passwd:" {send "密码\r"}
}
interact //停留在当前程序位置
========================================================
bash调用expect语言
/usr/bin/expect <<-EOF
expect语言内容
expect eof //运行结束后,离开当前程序位置,返回之前工作位置
EOF
实用程序旨在使用键盘交互密码身份验证模式运行SSH ,但以非交互方式运行。
SSH使用直接TTY访问来确保密码确实是由交互式键盘用户发出的。在专用的TTY中运行SSH
yum -y install sshpass //安装sshpass
第一次使用ssh登录时需要输入yes/no
sshpass -p0 ssh -o StrictHostKeyChecking=no root@10.12.153.146
使用sshpass获取ip地址
sshpass -p0 ssh root@10.12.153.146 "ip a"
指定文件
echo "0" > password
sshpass -f password ssh root@10.36.182.100 "ip a"
结合scp一起使用
sshpass -p 密码 scp file root@ip:/路径
远程解压
sshpass -p 密码 ssh root@ip -tt tar -xzf 远程文件.tar包 -C 解压路径
vim pass.txt
10.12.153.146 root 0 22
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
INFO=pass.txt
for IP in $(awk '{print $1}' $INFO)
do
USER=$(awk -v I=$IP 'I==$1{print $2}' $INFO)
PASS=$(awk -v I=$IP 'I==$1{print $3}' $INFO)
PORT=$(awk -v I=$IP 'I==$1{print $4}' $INFO)
sshpass -p $PASS scp -o StrictHostKeyChecking=no $1 ${USER}@${IP}:$2 && \
action "拷贝成功 $IP" /bin/true || action "拷贝失败 $IP" /bin/false
done
sshpass -p $PASS scp -o StrictHostKeyChecking=no $1 ${USER}@${IP}:$2 && action "拷贝成功 $IP" /bin/true || action "拷贝失败 $IP" /bin/false
$1:要scp的文件
$2:scp的目标路径
vim pass.txt
10.12.153.146 root 0 22
#!/bin/bash
[ ! -f $HOME/.ssh/id_rsa ] && ssh-keygen -t rsa -b 2048 -N "" -f $HOME/.ssh/id_rsa
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
INFO=pass.txt
for IP in $(awk '/^[^#]/{print $1}' $INFO)
do
USER=$(awk -v I=$IP 'I==$1{print $2}' $INFO)
PASS=$(awk -v I=$IP 'I==$1{print $3}' $INFO)
PORT=$(awk -v I=$IP 'I==$1{print $4}' $INFO)
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no ${USER}@${IP} && action "秘钥传输成功 $IP" /bin/true || action "秘钥传输失败 $IP" /bin/false
done
ssh-keygen -t rsa -b 2048 -N "" -f $HOME/.ssh/id_rsa
-t:指定要创建的密钥类型
-b:指定密钥长度
-N:提供一个新密语
-f:指定用来保存密钥的文件名
ssh-copy-id:传输公钥的命令
vim pass.txt
10.12.153.146 root 0 22
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
OLD_INFO=old_pass.txt
NEW_INFO=new_pass.txt
for IP in $(awk '/^[^#]/{print $1}' $OLD_INFO); do
USER=$(awk -v I=$IP 'I==$1{print $2}' $OLD_INFO)
PASS=$(awk -v I=$IP 'I==$1{print $3}' $OLD_INFO)
PORT=$(awk -v I=$IP 'I==$1{print $4}' $OLD_INFO)
NEW_PASS=$(openssl rand -base64 8)
sshpass -p "$PASS" ssh -p $PORT $USER@$IP -o StrictHostKeyChecking=no "echo $NEW_PASS | passwd --stdin $USER" && ( echo "$IP $USER $NEW_PASS $PORT [`date '+%F %T'`]" >> $NEW_INFO && action "配置成功 $USER $IP $NEW_PASS" /bin/true ) || action "配置失败 $USER $IP $PASS" /bin/false
done
sshpass -p "$PASS" ssh -p $PORT $USER@$IP -o StrictHostKeyChecking=no "echo $NEW_PASS | passwd --stdin $USER" && ( echo "$IP $USER $NEW_PASS $PORT [`date '+%F %T'`]" >> $NEW_INFO && action "配置成功 $USER $IP $NEW_PASS" /bin/true ) || action "配置失败 $USER $IP $PASS" /bin/false
远程连接,使用免交互方式更改用户密码,成功的情况下,将ip 用户 新密码 端口 日期追加到新密码的文件内,并输入配置成功;失败的情况下,输出配置失败 用户 ip 老密码