シェルヒアドキュメント無料のインタラクティブコマンドと期待

1つ、ヒアドキュメント無料のインタラクティブコマンド

I / Oリダイレクトを使用して、ftp、cat、readコマンドなどの対話型プログラムまたはコマンドにコマンドのリストを提供します。
標準入力の代わりになります。スクリプト開発者は、一時ファイルを使用して入力情報を作成するのではなく、その場で直接「ファイル」を生成し、それを「コマンド」の標準入力として使用できます。ヒアドキュメントは、非対話型のプログラムやコマンドでも使用できます。

语法格式:
命令 <<标记
...
内容    #标记直接是传入内容
...
标记

予防:
マークには任意の有効な文字(通常は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"

ここに画像の説明を挿入します
ここに画像の説明を挿入します

二、期待する

tcl言語に基づいて構築されたツールは、シェルスクリプトのインタラクティブな問題を解決するための自動制御とテストによく使用されます。

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

1.基本的なコマンド

1.スクリプトインタープリター
は、スクリプトが最初にファイルを導入し、使用されているシェルを示すことを期待します

#!/usr/bin/expect

2.
spawn spawnの後には通常、Linux実行コマンドが続きますこれは、セッションを開き、プロセスを開始し、後続の対話情報を追跡することを意味します。

例:
spawn passwd root

3.expectの
がある場合は、最後の入力結果は、指定された文字列が含まれているか否かを判断するには、戻り値に、そうでない場合は、すぐにタイムアウト時間待ちを返す:産卵によって開始されたプロセスの出力のみをキャプチャすることができ、されて
受信するために使用しますコマンド実行後の出力次に、期待される文字列と一致します

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.終了文字
expecteof
は、対話の終了を示し、実行が終了するのを待って、元のユーザーに戻ります。root
ユーザーへの切り替えなどのスポーンに対応して、expectスクリプトはデフォルトで10秒待機します。コマンドが実行されると、デフォルトは10秒間そのままになり、元のユーザーに自動的に戻ります。

対話が
実行された後、対話状態が維持され、制御がコンソールに転送されます。制御はターゲット端末に残ります。この時点では、手動で操作できます。対話後のコマンドは機能しません。たとえば、対話ルートユーザーへの切り替えなど、ターミナルは常にルートユーザー状態になります。たとえば、別のサーバーにsshを実行すると、常にターゲットサーバーターミナルになります。元のサーバーに切り替える代わりに。

6. setexpectの
デフォルトのタイムアウト時間は10秒です。セッションタイムアウト時間はsetコマンドで設定できます。タイムアウト時間が制限されていない場合は-1に設定する必要があります。

例:set timeout 30

7.exp_continue
exp_continueは、特定の期待判断項目に追加されるため、項目が一致した後も、期待判断ステートメント内の他の項目との一致を継続できます。exp_continueは、制御ステートメントのcontinueステートメントに似ています。期待が命令を下向きに実行し続けることを示します

次の例では、対話型出力に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 {}の外にexpecteofを追加しないでください。
これは、spawnプロセスの終了後、eofがデフォルトでexpectに送信されるためです。これにより、後でeof実行エラーが発生する可能性があります

8. send_ user
send_ userは、echoコマンドと同等のechoコマンドを表します。

9.パラメーターの受信
expectスクリプトは、bashコマンドラインから渡されたパラメーターを受け入れ、[lindex $ argvn]を使用してパラメーターを取得できます。その中で、nは0から始まり、それぞれ1番目、2番目、3番目のパラメーターを表します。

:
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

ここに画像の説明を挿入します
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/IHBOS/article/details/114973763