요구 배경: 최근 특정 소프트웨어를 설치하는 동안 다음 단계를 계속하려면 설치 과정에서 일부 정보를 입력해야 한다는 사실을 발견했습니다. 머신 수가 적을 때 로그인하여 설치를 완료할 수 있습니다. 단일 머신에 설치 작업을 수행하지만 머신 수가 일정 지점을 초과할 때 수동으로 다시 로그인하면 많은 반복 작업이 발생하므로 효과적인 학습 능력이 향상되지는 않지만 생성이 크게 발생합니다. 불확실성과 작업 효율성 감소를 초래합니다. 그렇다면 특정 작업, 특히 계정 및 비밀번호 입력과 같은 대화형 기능이 있는 단계를 자동화하는 방법은 무엇입니까? 1. EOF 다중 텍스트 입력 요구 사항 1 새로 제공되는 머신에는 하나의 디스크만 할당됩니다. 이제 요구 사항에 따라 디스크가 분할되고 마운트됩니다. 요구 사항 분석: 디스크의 경우 일반적으로 파티션을 다른 디렉터리에 마운트하는 두 가지 아이디어가 있습니다. 방법 1: 전체 디스크를 PV로 처리하고 VG 볼륨에 통합한 다음 LV 볼륨 크기를 나눕니다. 서로 다른 크기로 서로 다른 디렉토리에 할당하는 방법 2: fdisk를 사용하여 디스크를 필요한 크기로 직접 나눈 다음 디스크를 초기화하고 마운트를 완료합니다 Solution 여기에서는 대화형 기능을 시연하기 위해 방법 2를 선택하고 구현 스크립트는 다음과 같습니다.#!/bin/bash fdisk /dev/sdb <> /etc/fstab로그인 후 복사 위 스크립트를 분석한 결과 EOF 키워드가 사용된 것을 발견했습니다 EOFEOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.EOF一般会配合cat能够多行文本输出.其用法如下:<.... //需要输入的内容EOF //结束例如使用 cat、<<、EOF和>以交互方式编写bash脚本,如下所示。cat << EOF > script.sh #!/bin/bash printf "Hello\n" printf "Wordl!\n" EOF로그인 후 복사合理 利用这三个,即可以完成对应多文本交互输入,例如修改用户密码,正常情况下,需要连续输入两次密码,两次密码一致才能修改成功,如下:上面我们学会了EOF 这个关键字,那么我们试试通过它来修改密码。脚本如下:#!/bin/bash cat << EOF| passwd 新密码 新密码,与上述需一致 EOF # or 不使用管道符 passwd << EOF 新密码 新密码,与上述需一致 EOF로그인 후 복사实战结果,成功修改密码:2. Expect 自动交互需求案例 2 新交付了一批机器,需要给每台机器分发文件,如何实现?需求分析:远程拷贝文件常用密令是scp 或者 rsync ,但是在给每台机器传输时需要若输入密码,有的机器可能还需要输入YES,录入机器指纹信息,如下:Expect 是在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程主要有以下5步:0 定义变量1 spawn启动指定脚本或命令2 expect匹配结果关键词3 send针对指定关键词发送指定指令4 执行完成, 退出但可惜的是os默认没有安装,因此需要先安装才能使用Expect is a tcl application for automating and testing interactive applications such as telnet, ftp, passwd, fsck, rlogin, tip, etc. Expect makes it easy for a script to control another program and interact with it.方案解决:1. 先检查本机是否安装了expect ,如果没有安装,需要手动安装# 检查是否安装了expect: [root@localhost ~]# rpm -qi expect Name : expect Version : 5.45 Release : 14.el7_1 Architecture: x86_64 Install Date: Fri 05 Aug 2022 07:26:04 AM CST Group : Development/Languages .... # 如果没有安装, 使用yum安装expect ,通常会顺带把依赖包tcl 也安装了: [root@localhost ~]# yum install -y expect # -y 其实也是安装过程中一个交互,发现没,只是作为参数传入了 [root@localhost ~]# yum install -y tcl # 如果上述命令提示已安装tcl了,此步可以忽略 # 查看expect的安装路径: [root@localhost ~]# which expect /usr/bin/expect로그인 후 복사2 .对应功能脚本开发,本案例脚本参考如下:[root@test01 ~]# cat scp.exp #! /usr/bin/expect set file [lindex $argv 0] set file2 [lindex $argv 1] spawn scp -rp $file $file2 root@192.168.31.89:/tmp expect { "(yes/no)" {send "yes\r";exp_continue} "*password:*" {send "Password\r"} } expect eof exit -onexit { send_user "bye \n" }로그인 후 복사3. 分析上述脚本,有几个点需要说明#!/usr/bin/expect로그인 후 복사脚本文件的第一行指明expect 安装位置,具体可以参考2 中命令查看,指明脚本解析器,和Shell类似,表示程序使用Expect解析,这里与一般bash 脚本不同,因此需要注意,通常我们会将expect脚本后缀修改成exp来和bash 脚本 sh区别set 设置变量值set file [lindex $argv 0] 将传入的第一个参数赋给file ,类似第二、三个参数[lindex $argv 1] [lindex $argv 2] 等,后续调用时使用 $file ,和shell 一样。特殊参数:$argc表示传参的个数,$argv0EOF 는 파일의 END입니다. 약어는 사용자 정의되어 있으므로 EOF는 고정되지 않습니다. Linux에서는 ctrl-d를 눌러 EOF를 나타낼 수 있습니다. li>EOF일반적으로 cat와 함께 여러 줄의 텍스트를 출력하는 데 사용됩니다.🎜사용 방법은 다음과 같습니다.🎜 🎜<🎜예를 들어 cat, << , EOF 및 >를 사용하여 아래와 같이 대화형 bash 스크립트를 작성합니다. 🎜#! /usr/bin/expect set time 30 set ip [lindex $argv 0] spawn ssh root@$ip uptime expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$password\r" } } expect eof로그인 후 복사로그인 후 복사🎜🎜🎜 🎜🎜이 세 가지를 활용하세요 사용자 비밀번호 변경과 같은 다중 텍스트 대화형 입력에 해당합니다. 일반적인 상황에서는 다음과 같이 두 비밀번호를 연속해서 두 번 입력해야 합니다. 🎜🎜 🎜🎜우리는 위의 키워드 EOF를 사용하여 비밀번호를 변경해 보겠습니다. 스크립트는 다음과 같습니다: 🎜#!/bin/bash ip="192.168.31.89" username="root" password="123456" cmd=" df -PTh|grep ^/dev" # 指定执行引擎 expect <로그인 후 복사로그인 후 복사🎜실제 결과, 비밀번호가 성공적으로 변경되었습니다: 🎜🎜🎜🎜2. 자동 상호 작용을 기대합니다🎜🎜 요구 사항 사례 2🎜🎜 새로 제공되는 머신의 배치는 각 머신에 파일을 배포해야 합니다. 이를 달성하는 방법은 무엇입니까? 🎜🎜요구 사항 분석: 🎜🎜파일 원격 복사에 일반적으로 사용되는 비밀번호는 scp 또는 rsync입니다. 그러나 일부 기기에서는 다음과 같이 YES를 입력하고 기기 지문 정보를 입력해야 할 수도 있습니다. : 🎜🎜🎜🎜 Expect는 tcl을 기반으로 하며 대화형 지침 입력이 필요한 일부 시나리오에서는 스크립트 설정을 통해 자동으로 대화형 통신을 수행할 수 있습니다. 상호 작용 프로세스는 주로 다음 5단계로 구성됩니다. 🎜🎜0 변수 정의 🎜🎜1 시작을 위한 생성 지정된 스크립트 또는 명령 🎜🎜2 예상 일치하는 결과 키워드 🎜🎜3 send 지정된 키워드에 대해 지정된 지침을 보냅니다 🎜🎜4 실행 완료, 종료 🎜🎜하지만 안타깝게도 os는 기본으로 설치되어 있지 않으므로 사용하기 전에 설치해야 합니다 🎜< blockquote>🎜Expect는 telnet, ftp, passwd, fsck, rlogin,tip 등과 같은 대화형 응용 프로그램을 자동화하고 테스트하기 위한 tcl 응용 프로그램입니다. Expect를 사용하면 스크립트가 다른 프로그램을 쉽게 제어하고 상호 작용할 수 있습니다.🎜🎜해결책:🎜🎜1. 먼저 이 머신에 Expect가 설치되어 있는지 확인하세요. 설치되어 있지 않으면 수동으로 설치해야 합니다.🎜rrreee🎜2. 해당 함수 스크립트 개발에 대한 참조 스크립트는 다음과 같습니다. 🎜rrreee🎜3. 위 스크립트를 분석해 보면 몇 가지 설명해야 할 점이 있습니다🎜rrreee🎜 스크립트 파일의 첫 번째 줄은 예상 설치 위치를 나타냅니다. 자세한 내용은 2의 명령을 참조하세요. Shell과 유사한 스크립트 파서인데, 이는 일반 bash 스크립트와 다르기 때문에 주의가 필요합니다. bash 스크립트와 구별하기 위해 sh🎜🎜set는 변수 값을 설정합니다🎜🎜set file [linindex $argv 0]은 두 번째와 유사하게 file에 전달된 첫 번째 매개변수를 할당합니다. 세 개의 매개변수 [linindex $argv 1] [linindex $argv 2] 등. 쉘과 마찬가지로 후속 호출에는 $file을 사용하세요. 특수 매개변수: 🎜🎜$argc는 전달된 매개변수의 수를 나타내고, $argv0는 스크립트 이름을 나타냅니다. 🎜🎜spawn 테이블 이름은 실행할 스크립트 또는 프로그램 명령입니다. , SSH, SCP 등🎜格式: spawn [选项] [需要自动交互的命令或程序]例如:spawn scp -rp $file $file2 root@192.168.31.89:/tmp #<==执行scp命令(注意开头必须要有spawn, 否则无法实现交互)expect需和spawn 配合使用 ,表示匹配spawn指定的脚本或命令的输出结果,如果与expect后面的字符串匹配,就执行下面的send命令,表示对结果响应反馈有时命令的输出提示信息有可能会变化,所以可以在expect中使用模糊匹配,比如*。注意:匹配的动作也可以放在下一行,这样就不需要使用{}(大括号)了send在expect命令匹配指定的字符串后,发送指定的字符串给系统,这些命令可以支持一些特殊转义符号,例如:\r表示回车、\n表示换行、\t表示制表符等exp_continue从命令的拼写就可以看出命令的作用,即让Expect程序继续匹配的意思,如果需要一次匹配多个字符串,那么不同的匹配之间就要加上exp_continue,否则expect将不会自动输入指定的字符串。由于前面的都已经完成,最后一个不必加上exp_continue,它已经是最后一个了exit功能类似于Shell中的exit,即直接退出脚本,还可以利用这个命令对脚本做一些关闭前提示等工作send_user打印Expect脚本信息,类似Shell里的echo. 例如打印变量信息,验证数据传入是否正常在掌握expect 基本使用方式后,我们写一个批量查看机器负载信息的小脚本,加强记忆#! /usr/bin/expect set time 30 set ip [lindex $argv 0] spawn ssh root@$ip uptime expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$password\r" } } expect eof로그인 후 복사로그인 후 복사实战结果:小试牛刀在学习完以上两个方法,我们试着写一个脚本,结合上述两种方式,批量查看各机器目录挂载情况,并列举出来,参考脚本如下:#!/bin/bash ip="192.168.31.89" username="root" password="123456" cmd=" df -PTh|grep ^/dev" # 指定执行引擎 expect <로그인 후 복사로그인 후 복사