[쉘] expect 명령에 대한 자세한 설명: 자동 대화식 작업을 실현하려면 expect를 사용하십시오.

1. 적용 시나리오

Expect는 주로 자동화된 대화형 작업 시나리오에서 사용되며, 대화형 명령을 처리하기 위한 Expect의 도움으로 ssh 로그인, ftp 로그인 등과 같은 대화형 프로세스를 스크립트로 작성하여 자동화할 수 있습니다. 특히 여러 대의 서버에서 동일한 작업을 수행해야 하는 환경에 적합하며 시스템 관리자의 업무 효율성을 크게 향상시킬 수 있습니다.

 

2. 문법적 설명

참고: 이 스크립트를 실행할 수 있다는 전제는 expect가 설치되어 있다는 것입니다.

yum install -y expect

expect를 사용할 때 몇 가지 일반적인 명령이 있습니다.
여기에 이미지 설명 삽입

설명:
스폰

새 프로세스를 시작하는 데 사용되며, spawn 이후의 expect 및 send 명령은 spawn을 사용하여 시작된 새 프로세스와 상호 작용합니다.
spawn은 wait의 초기 명령으로 프로세스를 시작하는 데 사용되며 이 프로세스에서 모든 작업이 수행됩니다. spawn이 없으면 이 expect를 수행할 수 없습니다.

 
예상하다

프로세스의 피드백을 기다리는 데 사용되며 프로세스의 피드백에 따라 send 명령을 사용하여 해당 대화식 명령을 보냅니다.

 
보내다

문자열 인수를 수신하고 해당 인수를 프로세스로 보냅니다.

 
상호 작용하다

실제로 많이 사용되는 것은 아니며, interact 명령은 주로 자동화를 종료하고 수동 상호 작용에 들어가는 데 사용됩니다.
예를 들어, spawn, send 및 expect 명령을 사용하여 호스트에 대한 ftp 로그인을 완료하고 파일 다운로드 작업을 수행하지만 파일 다운로드가 완료된 후에도 여전히 ftp 명령줄 상태를 유지할 수 있기를 바랍니다. 후속 명령을 수동으로 실행하려면 이때 interact 명령을 사용하면 이 작업을 매우 잘 수행할 수 있습니다.

 

3. 예시

1. scp 파일 전송 자동화

scp 명령을 사용할 때 첫 번째 통신인 경우 대화형 방식으로 수동으로 예를 눌러 두 번째 단계로 들어간 다음 수동으로 암호를 입력하여 파일을 전송해야 합니다.

#!/usr/bin/expect -d

set timeout 10
spawn -noecho ssh -o StrictHostKeyChecking=no -l test 192.168.2.151 -p 22
#spawn命令是expect的初始命令,他用于启动一个进程,之后所有操作都在这个进程中进行,
#如果没有spawn,这个expect都无法进行
#StrictHostKeyChecking=no参数让ssh默认添加新主机的公钥指纹,也就不会出现出现是否继续yes/no的提示了

expect "password:" {
    
    send "123456\r"}
expect "Last login" {
    
    send "echo test1\r"}
expect "*\$*" {
    
    send "echo test2\r"}
expect eof

# EOF(End Of File),表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),
# 也可以是标准输入(stdin),EOF是不可输出字符,因此不能在屏幕上显示。
# 由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。
#即当读入的字符值等于EOF时,表示读入的已不是正常的字符而是文件结束符。

 

2. SSH 원격 로그인

#!/bin/bash

passwd='123456'

/usr/bin/expect <<-EOF

# exp_continue 用于多次匹配
set time 30
spawn ssh saneri@192.168.56.103 df -Th
expect {
    
    
"*yes/no" {
    
     send "yes\r"; exp_continue }
"*password:" {
    
     send "$passwd\r" }
}
expect eof
EOF

 

3. 루트 사용자로 전환

#!/usr/bin/expect -f

set timeout 10

spawn sudo su - root
expect "*password*"
send "123456\r"
expect "#*"
send "ls\r"
expect "#*"
send "df -Th\r"
send "exit\r"
expect eof

 

4. SSH 키 생성

1.创建主机配置文件

[root@localhost script]# cat host 
192.168.1.10 root 123456
192.168.1.20 root 123456
192.168.1.30 root 123456




2.编写copykey.sh脚本,自动生成密钥并分发key.

#!/bin/bash
# 判断id_rsa密钥文件是否存在
if [ ! -f ~/.ssh/id_rsa ];then
 ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa
else
 echo "id_rsa has created ..."
fi

#分发到各个节点,这里分发到host文件中的主机中.
while read line
  do
    user=`echo $line | cut -d " " -f 2`
    ip=`echo $line | cut -d " " -f 1`
    passwd=`echo $line | cut -d " " -f 3`
    
    expect <<EOF
      set timeout 10
      spawn ssh-copy-id $user@$ip
      expect {
    
    
        "yes/no" {
    
     send "yes\n";exp_continue }
        "password" {
    
     send "$passwd\n" }
      }
     expect "password" {
    
     send "$passwd\n" }
EOF
  done <  hosts

 

5. 사용자 생성을 위해 노드에 ssh

#!/bin/bash 
ip=$1  
user=$2 
password=$3 

expect <<EOF  
    set timeout 10 
    spawn ssh $user@$ip 
    expect {
    
     
        "yes/no" {
    
     send "yes\n";exp_continue } 
        "password" {
    
     send "$password\n" }
    } 
    expect "]#" {
    
     send "useradd hehe\n" } 
    expect "]#" {
    
     send "touch /tmp/test.txt\n" } 
    expect "]#" {
    
     send "exit\n" } expect eof 
 EOF  
 
 
 #./ssh5.sh 192.168.1.10 root 123456

 
 
참고:
https://www.cnblogs.com/saneri/p/10819348.html
https://blog.csdn.net/givenchy_yzl/article/details/118079170
https://sites.google.com/site/chinainventor/ language/2009-04-03-02

추천

출처blog.csdn.net/hiliang521/article/details/131447176