Shell script implementation SSH Automatic login remote Server example:
#!/usr/bin/expectspawn ssh [email protected]expect "*password:" Send "123\r" expect "*#" interact
Original link: http://www.xuanhao360.com/linux-expects/
Expect is a command to handle interactions . With expect, we can write the interactive process on a script so that it is done automatically. The image of the said, SSH login, FTP login and so on are consistent with the definition of interaction . Here we first ask a question, then introduce the basic knowledge of the four commands, and finally propose a workaround.
Problem
How do I ssh from machine A to machine B, and then execute the command on machine b? How do I automate it?
Four commands
The most critical four commands in expect are send,expect,spawn,interact.
send:用于向进程发送字符串expect:从进程接收字符串spawn:启动新的进程interact:允许用户交互
1. Send command
The Send command receives a string parameter and sends the parameter to the process.
expect1.1> send "hello world\n"hello world
2. Expect command (1) Basic knowledge
The expect command is just the opposite of the Send command, and expect is typically used to wait for feedback from a process. Expect can receive a string parameter, or it can receive a regular expression parameter. In conjunction with the Send command above, we can now look at one of the simplest interactive examples:
expect "hi\n"send "hello there!\n"
These two lines of code mean: After the standard input medium to hi and the newline key, output hello there to the standard output .
tips: $expect_out(buffer)存储了所有对expect的输入,<$expect_out(0,string)>存储了匹配到expect参数的输入。
For example, the following programs:
expect "hi\n"send "you typed <$expect_out(buffer)>"send "but I only expected <$expect_out(0,string)>"
When entering in the standard input
testhi
Yes, the result of the operation is as follows
you typed: testhiI only expect: hi
(2) Mode-action
The most commonly used syntax for expect is the mode-action from the TCL language. This syntax is extremely flexible, so let's explain each of the various syntaxes below.
Single branch mode syntax:
expect "hi" {send "You said hi"}
After matching to Hi, it will output "you said HI"
Multi-branch mode syntax:
expect "hi" { send "You said hi\n" } "hello" { send "Hello yourself\n" } "bye" { send "That was unexpected\n" }
Executes the corresponding output when matched to any one of the Hi,hello,bye strings. Equivalent to the following wording:
expect {"hi" { send "You said hi\n"}"hello" { send "Hello yourself\n"}"bye" { send "That was unexpected\n"}}
3. Spawn command
All of the demos above are interacting with the standard input and output, but we want him to interact with a process. The SPAWM command is used to start a new process. The send and expect commands after spawn are interactive with the spawn open process. In conjunction with the send and expect commands above, we can look at the more complex pieces of the program.
SetTimeout-1SpawnFtpFtp.Test.ComOpens a new process where the user connects to the remote FTP serverExpect"Name"//Process returns name when send "User\r" //to process input Anonymous\rexpect "Password:" //process return Password: When send "123456\r" //to process input [email protected]\rexpect "ftp>" //when the process returns to Ftp> send "Binary\r" //to process input binary\ Rexpect "ftp>" //process returns ftp> when send "get Test.tar.gz\r" //to process input get test.tar.gz\r
The purpose of this code is to log on to the FTP server FTP ftp.uu.net and download the file test.tar.gz on the server in binary mode. There are detailed comments in the program.
4.interact
So far, we have been able to combine spawn, expect, and send automation to accomplish many tasks. But how to get people to intervene in the process at the right time. For example, when downloading the ftp file, you can still stay in the FTP command line state, in order to manually execute subsequent commands. Interact can achieve these goals. The following demo allows users to interact after automatically logging on to FTP.
spawn ftp ftp.test.comexpect "Name"send "user\r"expect "Password:"send "123456\r"interact
Workaround
The above mentioned:
How do I ssh from machine A to machine B, and then execute the command on machine b? How do I automate it?
The following script implements a login from machine A to machine B, then executes the PWD command on machine B and stays on the B machine, waiting for user interaction. Please refer to the above for specific meanings.
#!/home/tools/bin/64/expect -f set timeout -1 spawn ssh $BUser@$BHost expect "*password:" { send "$password\r" } expect "$*" { send "pwd\r" } interact
[Turn]expect for automatic ssh interaction