1. 程式人生 > >與bash script指令碼自動化互動

與bash script指令碼自動化互動

如果bash指令碼中一些命令需要手工輸入進行互動的時候,那麼指令碼的自動化就沒法進行下去。比如:ssh somehost需要輸入使用者名稱和密碼,指令碼執行到這個命令後,便會停止,等待使用者輸入。
如果在簡單情景下,比如只需要使用者輸入一次,即一次性互動時,可以直接這樣:

# ... some directives here

# Remove the machine, confirming "y" when asked by docker-machine
echo 'y' | docker-machine rm default

# ... more directives here

通常情況下需要expect

工具。使用expect自動化ssh登陸的示例如下:

#timeout is a predefined variable in expect which by default is set to 10 sec
#spawn_id is another default variable in expect.
#It is good practice to close spawn_id handle created by spawn command
set timeout 60
spawn ssh $user@machine
while {1} {
  expect {

    eof                          {break
} "The authenticity of host" {send "yes\r"} "password:" {send "$password\r"} "*\]" {send "exit\r"} } } wait close $spawn_id

另外一個telnet的例子:

# Assume $remote_server, $my_user_id, $my_password, and $my_command were read in earlier
# in the script.
# Open a telnet session to a remote server, and wait for a username prompt. spawn telnet $remote_server expect "username:" # Send the username, and then wait for a password prompt. send "$my_user_id\r" expect "password:" # Send the password, and then wait for a shell prompt. send "$my_password\r" expect "%" # Send the prebuilt command, and then wait for another shell prompt. send "$my_command\r" expect "%" # Capture the results of the command into a variable. This can be displayed, or written to disk. set results $expect_out(buffer) # Exit the telnet session, and wait for a special end-of-file character. send "exit\r" expect eof