日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux非交互式脚本,Linux expect非交互式执行脚本

發(fā)布時間:2025/3/15 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux非交互式脚本,Linux expect非交互式执行脚本 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

expect簡介

expect是一款自動化的腳本解釋型的工具。

expect基于tcl腳本,expect腳本的運行需要tcl的支持。

expect對一些需要交互輸入的命令很有幫助,比如ssh ftp scp telnet。

遠程登錄linux服務器的時候,ssh命令需要手工輸入密碼,當?shù)卿浂嗯_機器的時候就會非常繁瑣。

expect就可以根據(jù)設定的規(guī)則,自動幫我們輸入密碼,大大節(jié)省了時間。

expect安裝

一般機器不會自帶expect,需要手動安裝。

系統(tǒng)為RHEL/CentOS:

yum install expect

系統(tǒng)為Debian/Ubuntu:

apt-get install expect

expect基礎知識

expect腳本

腳本開頭

expect腳本一般以#!/usr/bin/expect -f開頭,類似bash腳本。

常用后綴

expect腳本常常以.exp或者.ex結束。

expect主要命令

spawn 新建一個進程,這個進程的交互由expect控制

expect 等待接受進程返回的字符串,直到超時時間,根據(jù)規(guī)則決定下一步操作

send 發(fā)送字符串給expect控制的進程

set 設定變量為某個值

exp_continue 重新執(zhí)行expect命令分支

[lindex $argv 0] 獲取expect腳本的第1個參數(shù)

[lindex $argv 1] 獲取expect腳本的第2個參數(shù)

set timeout -1 設置超時方式為永遠等待

set timeout 30 設置超時時間為30秒

interact 將腳本的控制權交給用戶,用戶可繼續(xù)輸入命令

expect eof 等待spawn進程結束后退出信號eof

expect命令分支

expect命令采用了tcl的模式-動作語法,此語法有以下幾種模式:

單一分支語法

set password 123456

expect "*assword:" { send "$password\r" }

當輸出中匹配*assword:時,輸出password變量的數(shù)值和回車。

多分支模式語法

set password 123456

expect {

"(yes/no)?" { send "yes\r"; exp_continue }

"*assword:" { send "$password\r" }

}

當輸出中包含(yes/no)?時,輸出yes和回車,同時重新執(zhí)行此多分支語句。

當輸出中匹配*assword:時,輸出password變量的數(shù)值和回車。

expect詳細講解

ssh遠程登錄expect腳本

下面是一個自動登錄系統(tǒng)hostname1和hostname2執(zhí)行uname -a后斷開連接的腳本。

先建立login.exp

touch login.exp

chmod +x login.exp

vim login.exp

內容如下:

#!/usr/bin/expect -f

set timeout -1 //永遠等待,不會超時

spawn ssh root@hostname1 //spawn 后面跟命令名稱和參數(shù)

//如果匹配到*assword,那么發(fā)送密碼,并進入下面的expect語句(uname -a語句)。

//如果匹配到y(tǒng)es/no,那么發(fā)送yes,并重新執(zhí)行這個expect語句。

expect {

"*assword" {send "123456\r";}

"yes/no" {send "yes\r";exp_continue}

}

//匹配到*]#,那么運行uname -a命令

expect "*]#" {send "uname -a\r"}

send "exit\r" //退出遠程登錄

expect eof //結束spawn

//開始下一個命令

spawn ssh root@hostname2

expect {

"*assword" {send "123456\r";}

"yes/no" {send "yes\r";exp_continue}

}

expect "*]#" {send "uname -a\r"}

send "exit\r" //退出遠程登錄

expect eof //結束spawn

exit //退出expect腳本

ssh遠程登錄shell腳本(嵌套expect)

shell中使用expect -c "expect腳本內容"來完成嵌套。

注意:

expect腳本里面的"都需要在前面加上轉義符號。

每個expect語句后面加上分號";"。

vim expect_in_shell.sh

#!/usr/bin/bash

HOSTS="hostname1 hostname2"

for host in $HOSTS

do

expect -c "

set timeout 5;

spawn ssh root@${host};

expect {

\"*assword\" { send \"123456\r\" }

\"yes/no\" { send \"yes\r\"; exp_continue }

} ;

expect \"*]#\" {send \"uname -a\r\" } ;

send \"exit\r\" //退出遠程登錄

expect eof

"

done

帶參數(shù)的expect腳本ssh登錄

vim login_arg.exp

#!/usr/bin/expect -f

set ip [lindex $argv 0] //第一個參數(shù)賦值給變量ip

set password [lindex $argv 1] //第二個參數(shù)復制給變量password

set timeout -1

spawn ssh root@$ip

expect {

"password" {send "$password\r";}

"yes/no" {send "yes\r";exp_continue}

}

interact //停留在遠程shell

帶參數(shù)運行l(wèi)ogin_arg.exp

chmod +x login_arg.exp

./login_arg.exp 127.0.0.1 123456

1.expect 腳本用 ./expectscripts 的形式運行,如果用 sh 的方式運行則會出現(xiàn) 命令找不到等情況,因為這是調用sh 的環(huán)境變量,從而頭行#!/usr/bin/expect 等形式失效

2. 必須將#!/usr/bin/expect 這句聲明語句放在文件的首行

總結

以上是生活随笔為你收集整理的linux非交互式脚本,Linux expect非交互式执行脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。