Home > Article > Operation and Maintenance > Detailed explanation of Linux expect
expect can be seen everywhere
The first time I saw the expect command was the first time I participated in the full launch At that time, it was a set of full-scale online tools for automatic deployment, MD5 comparison, and release written by a talented person in the company using Shell scripts. When I was free, I looked at a few of the scripts and a lot of expect commands. I really couldn’t understand the usage of the expect command, so I found time to summarize this article about the expect command.
Recommended: [Linux Video Tutorial]
First raise a question
There are now two Linux hosts A and B, how to ssh from host A to host B, and then execute commands on host B? How to fully automate this process? You may use this method:
ssh admin@10.220.20.15 "ls"
But this method is clumsy. You have to enter the password every time and cannot execute some complex logic or commands. So how to realize full automation? This will use the expectations summarized in today's article.
What is expect?
expect is a free programming tool used to automate interactive tasks without human intervention. To put it bluntly, expect is a set of software used to implement automatic interaction functions.
In actual work, when we run commands, scripts or programs, these commands, scripts or programs need to enter certain instructions to continue running from the terminal, and these inputs need to be done manually. With expect, you can simulate the standard input provided to the program according to the program's prompts, thereby achieving automated interactive execution. This is what is expected! ! !
expect basics
When using expect, you basically deal with the following four commands:
## The #send command receives a string parameter and sends the parameter to the process. The expect command is opposite to the send command. The expect command is usually used to wait for feedback from a process. We then send the corresponding interactive command based on the feedback from the process. The spawn command is used to start a new process. The send and expect commands after spawn both interact with the process opened using spawn. The interact command is actually not used very much. Generally, the spawn, send and expect commands can complete our tasks well; but in some special occasions, the interact command still needs to be used. The interact command is mainly Used to exit automation and enter manual interaction. For example, we use the spawn, send and expect commands to complete the ftp login host and perform the file download task. However, we hope that after the file download is completed, we can still stay in the ftp command line state so that we can manually execute subsequent commands. In this case, use the interact command. This task can be completed very well.Practical code analysis
The above summarizes expect, especially some commonly used commands are explained in detail. The following is a detailed explanation of how to use expect to complete some daily tasks through some commonly used expect scripts.#!/usr/tcl/bin/expect set timeout 30 set host "101.200.241.109" set username "root" set password "123456" spawn ssh $username@$host expect "*password*" {send "$password\r"} interactThis is a very simple expect sample code that demonstrates the basic use of expect. #!/usr/tcl/bin/expect: Use expect to interpret the script; set timeout 30: Set the timeout in seconds, the default is 10 seconds;set host "101.200.241.109": Set variables; spawn ssh $username@$host: spawn is an internal command of expect that can be executed after entering the expect environment. If expect is not installed or directly The spawn command cannot be found when executed under the default SHELL. Its main function is to add a shell to the ssh running process to deliver interactive instructions; expect "*password*": expect here is also an internal command of expect. This command means to determine the last time Whether the output result contains the string "password", if so, it will be returned immediately; otherwise, it will be returned after a period of time. The waiting time here is the 30 seconds set previously; send "$password\r": When the corresponding output result is matched, the password is sent to the open ssh process and the interactive action is performed; interact: After the execution is completed, the interactive state is maintained and control is handed over to the console. At this time, you can manually Operated. If there is no such sentence, it will exit after the login is completed, instead of staying on the remote terminal. This is the analysis of the above simple script. In the above example, it involves a very important concept in expect - mode-action; that is, the above expect "*password*" {send " $password\r"}The meaning expressed by this code.
Mode-Action
Combined with the code expect "*password*" {send "$password\r"}, let's talk about "Mode-Action". To put it simply, if a pattern is matched, the corresponding action will be performed; if the password string is matched, the password will be entered. You may also see code like this:expect { "password" { send "$password\r" exp_continue } eof { send "eof" } }
其中exp_continue表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。
传参
很多时候,我们需要传递参数到脚本中,现在通过下面这段代码来看看如何在expect中使用参数:
#!/usr/tcl/bin/expect if {$argc < 3} { puts "Usage:cmd <host> <username> <password>" exit 1 } set timeout -1 set host [lindex $argv 0] set username [lindex $argv 1] set password [lindex $argv 2] spawn ssh $username@$host expect "*password*" {send "$password\r"} interact
在expect中,\$argc表示参数个数,而参数值存放在$argv中,比如取第一个参数就是[lindex $argv 0],以此类推。
总结
能够在工作中熟练的使用Shell脚本就可以很大程度的提高工作效率,如果再搭配上expect,那么很多工作都可以自动化进行,对工作的展开如虎添翼。如果你会Python的话,你的视野将会更加开阔,那个时候你又会“嫌弃”expect了。
The above is the detailed content of Detailed explanation of Linux expect. For more information, please follow other related articles on the PHP Chinese website!