Linux expect命令

在文章Iterm2保存服务器账密当中介绍到了如何使用Iterm2保存服务器账密实现自动登录。那么可能会有人对第一步中脚本的内容以及expect ~/.ssh/aliyun-six命令心存疑惑,在猜想这是什么东东。那么本片文章就带大家了解一下Linux中的expect命令。

首先简单的介绍一下expect命令:expect是一个用来处理交互的命令。借助expect,我们可以将交互过程写在一个脚本上,使之自动化完成。形象的说,ssh登录,ftp登录等都符合交互的定义。

expect中最关键的四个命令
send:用于向进程发送字符串,send命令接收一个字符串参数,并将该参数发送到进程。
expect:从进程接收字符串,expect通常是用来等待一个进程的反馈。expect可以接收一个字符串参数,也可以接收正则表达式参数。和send命令结合使用。
spawn:启动新的进程,spawn后的send和expect命令都是和spawn打开的进程进行交互的。

# spawn+expect+send Demo:
set timeout -1				#设置超时时间为无限期(下面会解释到为什么设置超时时间)
spawn ftp ftp.test.com      #打开新的进程,该进程用户连接远程ftp服务器
expect "Name"               #进程返回Name时
send "user\r"               #向进程输入user\r
expect "Password:"          #进程返回Password:时
send "123456\r"             #向进程输入123456\r
expect "ftp> "              #进程返回ftp>时
send "binary\r"             #向进程输入binary\r
expect "ftp> "              #进程返回ftp>时
send "get test.tar.gz\r"    #向进程输入get test.tar.gz\r
# 这段代码的作用是登录到ftp服务器ftp ftp.test.com上,并以二进制的方式下载服务器上的文件test.tar.gz。

interact:允许用户交互
到现在为止,我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是,如何让人在适当的时候干预这个过程呢?比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。interact便可以达到这些目的。

#使用excpet保存服务器用户名和密码实现自动登录
set user root
set host 59.110.111.222
set password xxxxxxxxx

spawn ssh $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof

expect eof这行命令用来做什么?
由spawn启动的程序在结束的时候会产生一个eof标示。如果是spawn命令出现交互式提问的但是expect匹配不上的话,那么程序会按照timeout的设置进行等待(默认10秒超时),这时可能就会存在问题(脚本未正常执行完任务便退出),所以一般将timeout设置为-1,然后再脚本的最后加入该命令,确保该脚本执行完毕相应的任务后正常退出。

发布了40 篇原创文章 · 获赞 10 · 访问量 4051

猜你喜欢

转载自blog.csdn.net/qq_41693150/article/details/99227922