linux系统shell语言的自动化交互

2024-01-07 19:24:29

自动化交互

expect交互

yum -y install expect tcl tcl-devel      //安装expect交互工具

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

sshpass

概念

实用程序旨在使用键盘交互密码身份验证模式运行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 解压路径

shhpass的脚本

批量拷贝文件
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 老密码

文章来源:https://blog.csdn.net/qq_59207739/article/details/135393298
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。