首页 > 系统相关 >linux expect,linux ssh免密登录

linux expect,linux ssh免密登录

时间:2024-08-16 17:49:29浏览次数:9  
标签:spawn 免密 send 命令 expect linux 交互 ssh

一、概述

1.0 ssh 免密登录最佳实践

二、expect工具实现免密交互
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。 CentOS安装:yum install expect -y

CentOS离线安装方式:https://www.cnblogs.com/tozh/p/10096688.html

安装结束记得看一下expect的命令目录 :which expect

1、免交互查看远程主机内存

复制代码
#!/bin/bash
user=root
pass='Admin@123'
ip='172.20.2.89'
/usr/local/bin/expect << EOF
set timeout 30
spawn ssh $user@$ip   
expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send "$pass\r"}
}
expect "root@*"  {send "free -m\r"}
expect "root@*"  {send "exit\r"}
expect eof 
EOF

2、批量执行命令
复制代码
#!/bin/bash

ip=`cat /root/ip.txt`
user=root
pass=Admin@123

for i in $ip;
do
expect -c "
    spawn ssh $user@$i
    expect {
        \"(yes/no)\" {send \"yes\r\"; exp_continue}
        \"password:\" {send \"$pass\r\"; exp_continue}
        \"root@*\" {send \"free -m\r exit\r\"; exp_continue}
    }"

done
复制代码
参数说明:set:可以设置超时,也可以设置变量timeout:expect超时等待时间,默认10Sspawn:执行一个命令expect "":匹配输出的内容exp_continue:继续执行下面匹配\r:可以理解为回车

1,以此类推puts:打印字符串,类似于echoawk−vI="

 

1.1 命令简介

expect 是由Don Libes基于Tcl(Tool Command Language )语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。

1.2 使用场景

(1)根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您

(2)远程连接设备并执行自动化操作

(3)需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具

1.3 expect命令安装

yum install expect -y

二、expect使用原理

2.1 命令原理介绍

spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出

spawn命令

  spawm命令就是用来启动新的进程的(执行linux命令)。spawn后的send和expect命令都是和spawn打开的进程进行交互的、

send命令

  send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码。

send_user命令

  send 命令输出

interact命令

  结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令

三、expect使用语法

3.1 expect 启用选项

-c 执行脚本前先执行的命令,可多次使用

-d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。

-D 启用交换调式器,可设一整数参数。

-f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。

-i 交互式输入命令,使用"exit"或"EOF"退出输入状态

-- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --

-v 显示expect版本信息

 

3.2 expect命令参数

spawn: 交互程序开始,执行后面的命令或程序。需要进入到expect环境才可以执行,不能直接在shell环境下直接执行

set timeout n : 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时

set: 定义变量

$argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推

expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句

send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查

exp_continue 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。

exit 退出expect脚本

expect eof: spawn进程结束后会向expect发送eof,接收到eof代表该进程结束

interact 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上

puts 输出变量

四、实战案例

4.1 登录远程服务器并在远程服务器上执行命令

#!/usr/bin/expect
spawn ssh [email protected] df -h
expect "*password:"
send "winner@001\n"
expect eof

4.2 本机免密实现

#! /bin/bash
#
# Author: kangll
# CreateTime: 2023-11-10
# Desc: 基础环境配置,包括服务器设置,JDK,免密,kerberos配置
# 可扩展到批量操作
#
#set -x
BASEDIR=$(cd "$(dirname "$0")"; pwd)
# 加载配置 source $BASEDIR/config/global.sh ssh_networkname=(windp-aio) ssh_passwd=winner@#2023 ########################
# 生成本地ssh公钥 ######################## create_ssh_pub(){ echo "生成本地ssh公钥" /usr/bin/expect << eof # 设置捕获字符串后,期待回复的超时时间 set timeout 30 # 执行命令开启一个新的进程 spawn ssh-keygen -t rsa -b 1024 ## 开始进连续捕获 expect { ".ssh/id_rsa)" { send "\n"; exp_continue } "Overwrite (y/n)?" { send "y\n"; exp_continue } "no passphrase):" { send "\n"; exp_continue } "passphrase again:" { send "\n"; exp_continue } } eof }
######################## # 定义复制ssh公钥方法 ######################## copy_ssh(){ if [ ! -f /root/.ssh/id_rsa.pub ];then create_ssh_pub fi echo "复制公钥到对应的主机上" /usr/bin/expect << eof # 设置捕获字符串后,期待回复的超时时间 set timeout 30 # 命令执行 spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $1@$2 ## 开始进连续捕获 expect { "connecting (yes/no)?" { send "yes\n"; exp_continue } "s password:" { send "${ssh_passwd}\n"; exp_continue } } eof } ######################## # 配置免密 ######################## config_ssh() { # 主机遍历 for name in ${ssh_networkname[*]};do timeout 5 ssh root@${name} "echo ${name}: 'This is success!'" if [[ $? -ne 0 ]];then echo "复制文件到: ${name}" copy_ssh root ${name} > /dev/null fi done echo "********** ssh installation completed **********" } # 配置root用户免密 config_ssh

转自:https://blog.csdn.net/qq_35995514/article/details/134426603

标签:spawn,免密,send,命令,expect,linux,交互,ssh
From: https://www.cnblogs.com/gered/p/18363370

相关文章

  • 简单的linux系统学习笔记——01
    一、准备环境1.创建虚拟主机软件:vmware(是一个管理虚拟机的平台)vmware官网流程:1.点击创建新的虚拟机2.选择自定义3.兼容选最大4.选稍后安装操作系统5.选择想创建的系统6.命名,选择位置(保存位置)7.选择cpu和内存配置8.选nat模式9.选推荐10.创建新的虚拟磁盘11设置磁......
  • 简单的linux系统学习笔记——07
    一、虚拟机克隆本体删了,克隆机也会消失1.先关闭虚拟机2.右键虚拟机点管理,点击克隆3.克隆源选择“虚拟机中的当前状态”4.克隆类型选择“创建链接克隆”5.编辑虚拟机名字,设置存放路径6.点击完成7.修改主机名8.更改ip,修改网卡9.重启,保存快照二、文件文件属性:1)权限2......
  • Linux安装Nginx详细教程
    1.安装nginx依赖yum-yinstallgccgcc-c++pcrepcre-develzlibzlib-developensslopenssl-devel2.安装wgetyum-yinstallwget我这里是已经安装好的,运行代码会是下面的结果,不确定自己有没有安装,可以执行试下 3.创建nginx安装目录    /usr/local/目录下......
  • 韩顺平linux——centos安装
    centos安装选redhat红帽,centos是红帽的分支。 开发工具包含gccjdkmysql。 软件选择,默认最小安装,很多功能如gcc不带,学习过程需要一个桌面。磁盘分区boot分区1G设备类型:标准分区 文件类型ext4swap分区1G 设备类型:标准分区 文件类型swaproot分区17G 设备类......
  • 【linux学习指南】Linux管理文件与处理数据二(重定向与管道)
    文章目录......
  • [笔记]关于在linux中通过yum安装mysql错误--因为Centos 7官方镜像不可用的解决方法
     因为Centos7在2024年6月30号停止维护   在执行命令时找不到镜像源, 在下载时出现的错误为,还有一种错误由于没有截图,但是问题一样先通过yumremovemariadb*-y去删除自带的sql包通过命令编辑这个文本文件 vim/etc/yum.repos.d/CentOS-Base.repo这里举......
  • 【Linux操作系统】——Linux基本命令3
    1、vi与vim的简介  在Linux下,绝大部分的配置文件都是以ASCII码的纯文本形式存在的,可以利用一些简单的编辑软件修改配置。  在Linux命令行界面下的文本编辑器有很多,比如nano,Emacs,vim等。但是所有的UNIXLike系统都会内置vi文本编辑器,而其他的文本编辑器则不一定存在......
  • Linux中yum、vim、gcc/g++的使用
    目录一、Linux软件包管理器yum什么是软件包关于rzsz查看软件包★如何安装软件★如何卸载软件★Linux开发工具二、Linux编译器-vim使用vim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集vim操作总结如果在vim界面不小心按了Ctrl+Z怎么处理批......
  • Linux shell脚本实战案例
    文章目录1.基础案例:显示系统信息2.文件备份案例3.自动安装软件案例4.批量重命名文件案例5.监控磁盘空间案例6.定时任务案例:定期清理日志文件7.错误处理和日志记录案例:安全地运行命令8.备份数据库案例:定期备份MySQL数据库9.系统监控案例:CPU和内存使用率10.用户......
  • Linux进程管理(保姆级教程)
    目录一、Linux中的进程和服务二、service服务管理(CentOS6版本-了解)(1).基本语法(2).经验技巧(3).案例实操三、chkconfig设置后台服务的自启配置(CentOS6版本)(1).基本语法(2).Linux运行级别(3).ntsysv服务界面控制自启动针对级别2345(4).案例实操四、systemctl(Ce......