Linux expect spawn用法

背景

开发中,经常会有一些任务需要人机交互,比如登录到某台server上,远程拷贝其上的软件,并分发到其他sever上。
传统的操作方式,会产生开发人员与计算机的交互,如等待用户输入密码之类的操作会打断自动化流程的实现。

解决方案

使用expect + 其内部命令 spawn 可以实现类似的自动化需求。
centos可以通过如下命令快速安装expect组件:

yum -y install expect

案例1

脚本1:test1.sh
实现功能:

远程登录到server上,并执行指定的操作,如:
①、启动某服务进程;
②、文件或文件夹操作;
③、scp操作;

#!/usr/bin/expect

set timeout 10
spawn ssh [email protected]
expect "*password*"
send "abc123\r"
expect "#"
#send "service scm-agent status\r"
send "mkdir -p ~/david/test \r"
expect eof

案例2

脚本:test2.sh
实现功能:

①、远程登录到server上;
②、在超时时间内(这里为60秒),等待用户在远程server上实现交互式操作。

#!/usr/bin/expect 
set timeout 60 
spawn ssh -l root 111.111.111.111
expect "password:"
send "abc123\r"
interact

案例3(进阶)

脚本:test3.sh
实现功能:

①、远程登录到JumpServer上;
②、将JumpServer上的文件拉到当前主机;

TRANSFER_HOST=111.111.111.111
TRANSFER_SSH_PORT=2233
TRANSFER_USER=my_admin
TRANSFER_PASSWORD=mypassword
TRANSFER_PROJECT=/home/my_admin/deploy/transfer/*
DEPLOY_DIR=$(cd -P -- "$(dirname -- "$0")" && pwd -P)

fuction remote_transfer(){
    echo "$1"
    shift 1
    expect << EOF
        set timeout 30
        spawn $@
        expect {
            "(yes/no)" {send "yes\r"; exp_continue}
            "password:" {send "`echo $TRANSFER_PASSWORD |base64 -d`\r"}
        }
        expect eof 
EOF
}

remote_transfer "Download files from remote JumpServer now ......" "scp -P ${TRANSFER_SSH_PORT}  ${TRANSFER_USER}@${TRANSFER_HOST}:${TRANSFER_PROJECT} ${DEPLOY_DIR}"

脚本说明:

  1. 首次ssh到一台server上,会有如下提示,内部expect第一行为自动填入yes操作;

$ ssh -p 2233 111.111.111.111
The authenticity of host ‘[111.111.111.111]:2233 ([111.111.111.111]:2233)’ can’t be established.
ECDSA key fingerprint is SHA256:tsX+R0d8maofjGIJc01fcGidEsEqG0I6q6tzm3DF+2o.
ECDSA key fingerprint is MD5:c4:b6:b0:da:31:e5:db:20:fe:d3:d0:53:fb:96:40:72.
Are you sure you want to continue connecting (yes/no)?

关于Linux base64进行加解密的方法:
A).加密
$ echo password|base64
cGFzc3dvcmQK

B).解密
$ echo cGFzc3dvcmQK|base64 -d
password

参考列表

  • shell expect spawn、linux expect 用法小记
  • linux expect spawn的用法

你可能感兴趣的:(LinuxShell)