日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Shell Here Document 免交互命令和Expect

發布時間:2024/2/28 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shell Here Document 免交互命令和Expect 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Shell Here Document 免交互命令和Expect

  • 一、Here Document 免交互命令
  • 二、Expect
    • 1.基本命令
    • 2.示例
    • 3.嵌入執行模式
    • 4.實現ssh自動登錄
    • 5.免交互創建磁盤

一、Here Document 免交互命令

使用I/O重定向的方式將命令列表提供給交互式程序或命令,比如ftp、cat或read命令。
是標準輸入的一種替代品可以幫助腳本開發人員不必使用臨時文件來構建輸入信息,而是直接就地生成出一個“文件”并用作“命令”的標準輸入。Here Document 也可以與非交互式程序和命令一起使用。

語法格式: 命令 <<標記 ... 內容 #標記直接是傳入內容 ... 標記

注意事項:
標記可以使用任意合法字符 (通常使用EOF)
結尾的標記一定要頂格寫,前面不能有任何字符
結尾的標記后面也不能有任何字符(包括空格)
開頭標記前后的空格會被省略掉

1.免交互方式實現對行數的統計,將要統計的內容置于標記“EOF”之間,直接將內容傳給wc -l 來統計 wc -l <<EOF >Line1 >Line2 >EOF

通過read 命令接收輸入并打印,輸入值是兩個EOF標記之間的部分,作為變量i的值read i <<EOF >Hi >EOF echo $i

通過passwd給用戶設置密碼passwd zhangsan <<EOF >35123512 >35123512 EOF

支持變量替換 在寫入文件時會先將變量替換成實際值,再結合cat 命令完成寫入#!/bin/bash file="eof1.txt" i="school" cat > $file <<EOF I am going to $i EOF


整體賦值給變量,然后通過echo命令將變量值打印出來#!/bin/bash var="Great! I am going to school!" myvar=$(cat <<EOF This is Line 1. Today is Monday. $var EOF ) echo $myvar


關閉變量替換的功能,按照字符原本的樣子輸出,不做任何修改或替換#!/bin/bash var="Great! I am going to school!" myvar=$(cat <<'EOF' This is Line 1. Today is Monday. $var EOF )echo $myvar


去掉每行之前的TAB字符#!/bin/bash var="Great! I am going to school!" myvar=$(cat <<-'EOF' #在標記前加“-”,即可抑制各行tab字符This is Line 1.Today is Monay.$var EOF ) echo "$myvar"


多行注釋 Bash 的默認注釋是“#”,該注釋方法只支持單行注釋:Here Document 的引入解決了多行注釋的問題。 ":"代表什么都不做的空命令。中間標記區域的內容不會被執行,會被bash忽略掉,因此可達到批量注釋的效果。#!/bin/bash var="Great! I am going to school!" : <<-EOF This is Line1.Today is Monday.$var EOF echo "abcd"


二、Expect

建立在tcl語言基礎上的一個工具,常被用于進行自動化控制和測試,解決shell腳本中交互相關的問題。

rpm -q expect rpm -q tcl yum -y install expect

1.基本命令

1.腳本解釋器
expect腳本中首先引入文件,表明使用的是哪一個shell

#!/usr/bin/expect

2.spawn
spawn后面通常跟一個Linux執行命令,表示開啟一個會話、啟動進程,并追蹤后續交互信息。

例: spawn passwd root

3.expect
判斷上次輸入結果中是否包含指定的字符串,如果有則立即返回,否則就等待超時時間后返回:只能捕捉由spawn啟動的進程的輸出;
用于接收命令執行后的輸出,然后和期望的字符串匹配

4.send
向進程發送字符串,用于模擬用戶的輸入;該命令不能自動回車換行。一般要加\r(回車)或者\n

方式一: expect “密碼” {send “abc123\r”} #同一行send部分要由{} 方式二: expect “密碼” send “$abc123\r” #換行send部分不需要有{} 方式三: expect “支持多個分支 expect { #只要匹配了其中一個情況,執行相應的send語句后退出該expect語句 "密碼1 {send "abc123\r"}" "密碼2 {send "123123\r"}" "密碼3 {send "123123\r"}" }

5.結束符
expect eof
表示交互結束,等待執行結束,退回到原用戶,與spawn對應
比如切換到root用戶,expect腳本默認的是等待10s,當執行完命令后,默認停留10s后,自動切回了原用戶

interact
執行完成后保持交互狀態,把控制權交給控制臺,會停留在目標終端,這個時候就可以手工操作了,interact后的命令不起作用,比如interact會保持在終端而不會退回到原終端,比如切換到root用戶,會一直在root用戶狀態下;比如ssh到另一服務器,會一直在目標服務器終端,而不會切回的原服務器。

6.set
expect 默認的超時時間是10秒,通過set命令可以設置會話超時時間,若不限制超時時間則應設置為-1.

例:set timeout 30

7.exp_continue
exp_continue 附加于某個expect判斷項之后,可以使該項匹配后,還能繼續匹配該expect判斷語句內的其他項。exp_continue類似于控制語句中continue語句。表示允許expect繼續向下執行指令

下例將判斷交互輸出中是否存在yes/no 或*password。 如果匹配yes/no 則輸出yes 并再次執行判斷;如果匹配 *assword則輸出abc123 并結束該段expect 語句。

expect "(yes/no)" {send "yes\r"; exp_ continue; } "*password" {set timeout 300; send "abc123\r";}

注意:使用exp_ continue時,如果跟蹤像passwd 這樣的輸入密碼后就結束進程的命令,expect{}外不要 再加上expect eof
因為spawn進程結束后會默認向expect發送eof,,會導致后面的expect eof 執行報錯

8.send_ user
send_ user 表示回顯命令,相當于echo

9.接收參數
expect腳本可以接受從bash命令行傳遞的參數,使用[lindex $argv n] 獲得。其中n從0開始,分別表示第一一個, 第二個,第三個…參數。

: set hostname [lindex $argv 0] 相當于hostname=$1 set password [lindex $argv 1] 相當于password=$2

2.示例

expect直接執行,需要使用expect 命令去執行腳本 su切換用戶 #! /usr/bin/expect #設置超時時間 set timeout 5 #參數傳入 set username [lindex $argv 0] set password [lindex $argv 1] #開始追蹤命令 spawn su $username #免交互執行,捕捉信息并匹配 expect "密碼" send "password\r" expect "*]#" send user "ok" . #把控制權交給控制臺 interact #expect eof


3.嵌入執行模式

創建用戶并設置密碼

#! /bin/bash user=$1 password=$2 #非交互命令放在expect外面 useradd $user #開始免交換執行 /usr/bin/expect <<-EOF #expect開始標志 spawn passwd $user #開啟-一個進程跟蹤passwd命令,expect只能捕捉該進程信息 expect "新的*" send "$ {password}\r" . expect "重新*" send "$ {password} \r" expect eof EOF

4.實現ssh自動登錄

#! /usr/bin/expect set timeout 5 set hostname [lindex $argv 0 ] set password [lindex $argv 1]spawn ssh $hostname expect {"Connection refused" exit #連接失敗情況,比如對方ssh服務關閉"Name or service not known" exit #找不到服務器,比如輸入的IP地址不正確" (yes/no)" {send "yes\r" ;exp_continue}"password:" {send "$password\r"} interact exit #interact后的命令不起作用

嵌入式:

#!/bin/bash hostname=$1 password=$2/usr/bin/expect <<EOF spawn ssh root@${hostname}expect {"Connection refused" exit"No route to host" exit"(yes/no)" {send "yes\r";exp_continue}"password" {send "$password\r"} } expect "*]#" send "ifconfig\r" expect eof EOF

5.免交互創建磁盤

#!/bin/bash disk=$1 /usr/bin/expect <<EOF spawn fdisk $disk expect "命令" {send "n\r"} expect "Select" {send "p\r"} expect "分區" {send "\r"} expect "起始" {send "\r"} expect "Last" {send "\r"} expect "命令" {send "w\r"} expect eof EOF


總結

以上是生活随笔為你收集整理的Shell Here Document 免交互命令和Expect的全部內容,希望文章能夠幫你解決所遇到的問題。

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