カタログタイトル
ヒアドキュメントの無料インタラクション
- 概要概要
- I / Oリダイレクトを使用して、対話型プログラムにコマンドリストを提供します
- 標準入力の代替
- 文法形式
命令 <<标记 #一般使用EOF
...
内容 #标记之间是传入内容
...
标记
ヒアドキュメント使用上の注意
- マークには任意の正当な文字(通常はEOF)を使用できます
- 終了マークは、前に文字を付けずに一番上のグリッドに書き込む必要があります
- 終了タグの後に文字(スペースを含む)を含めることはできません
- 開始タグの前後のスペースは省略されます
ヒアドキュメント通常の使用法
- 行数の統計を実現し、カウント
EOF
するコンテンツをタグの間に配置し、コンテンツをwc -l
統計に直接渡すための相互作用のない方法
wc -l <<EOF
>Line1
>Line2
>EOF
- 入力値の読み取りと印刷を介してコマンド入力を受信するのは、
EOF
変数i
値としてのマーク間の2つの部分です。
read i <<EOF
>hello #hello后面有自带的换行符有回车的功能所以$i只会获取第一行变量
>EOF
echo $i
- passwdを介してユーザーのパスワードを設定します
passwd zhangsan <<EOF
>123456 #这两行是输入的密码和确认密码
>123456
>EOF
- 変数置換のサポート
ファイルを書き込むときに、変数が実際の値に置き換えられ、catコマンドと組み合わされて書き込みが完了します。
#!/bin/bash
file="EOF.txt"
i="substitution"
cat > $file <<EOF
Support variable $i
EOF
cat EOF.txt
- 全体を変数にコピーしてから、echoコマンドを使用して変数値を出力します。
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<EOF
This is Line 1
Todey is Monday
$var
EOF
)
echo $myvar
- 変数置換機能をオフにし、文字をそのまま出力します。変更や置換は行いません。
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<'EOF' #对标记加单引号或双引号,即可关闭变量替换
This is Line 1
Todey is Monday
$var
EOF
)
echo $myvar
- 各行の前のTAB文字を削除します
#!/bin/bash
var="Great! I am going to school!"
myvar=$(cat <<-EOF
This is Line 1 #在标记前加"-",即可压制各种行首TAB
Todey is Monday
$var
EOF
)
echo "$myvar"
- 複数行コメント
Bashのデフォルトのコメントは#
、このコメントメソッドが単一行コメントのみをサポートすることです。ヒアドキュメントの導入により、
:
何もしない空のコマンドを表す複数行コメントの問題が解決されます。ミドルマーク領域の内容は実行されず、bashによって無視されるため、バッチコメントの効果を実現できます。
#!/bin/bash
var="Great! I am going to school!"
: <<-EOF
This is Line 1 .
Today is Monday .
$var
EOF
echo "abcd"
基本的なコマンドを期待する
シェルスクリプトのインタラクティブな問題を解決するために、自動制御とテストによく使用されるtcl言語に基づいて構築されたツール
rpm -q expect
rpm -q tcl
yum install -y expect
スクリプトインタプリタ
- このファイルは、どのシェルが使用されているかを示すために、expectスクリプトで最初に導入されます
#!/ usr / bin / expect
スポーン
- スポーンの後には通常、Linux実行コマンドが続きます。これは、セッションを開き、プロセスを開始し、後続のインタラクション情報を追跡することを意味します。
例:spawn passwd root
期待する
- 最後の出力結果に指定された文字列が含まれているかどうかを判断します。含まれている場合はすぐに戻り、そうでない場合はタイムアウトが戻るのを待ちます。spawnによって開始されたプロセスの出力のみをキャプチャできます。
コマンドの実行後に出力を受け取るために使用されます。そして、期待に応えます文字列照合
送信
- ユーザーの入力をシミュレートするために文字列をプロセスに送信します。このコマンドは自動的に入力して改行することはできません。通常、\ r(キャリッジリターン)または\ nを追加する必要があります。例:
方式一:
expect "密码" {send "abc123\r"} #同一行send部分要有{}
方式二:
expect "密码"
send "abc123\r" #换行send部分不需要有{}
方式三:
expect支持多个分支
expect #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
"密码1" {send "abc123\r"}
"密码2" {send "123456\r"}
"密码3" {send "123123\r"}
}
2種類のターミネータ
eofを期待する
- インタラクションの終了を示し、実行が終了するのを待って、spawnに対応する元のユーザーに戻ります。たとえば
、rootユーザーに切り替えると、expectスクリプトはデフォルトで10秒間待機します。コマンドが実行されると、デフォルトで10秒間留まると、自動的に元のユーザーに戻ります。
相互作用する
- 実行が完了すると、対話状態が維持され、制御がコンソールに移されます。元の端末に戻るのではなく、ターゲット端末に留まります。この時点で、手動で操作できます。対話後のコマンド対話後に終了を追加するなど、機能しません。rootユーザーを終了しません。対話がない場合は、リモート端末にとどまるのではなく、ログインが完了した後にログアウトします
- インタラクションを使用すると、元のターミナルに戻るのではなく、ターミナルにとどまります。たとえば、rootユーザーに切り替えると、常にrootユーザーの状態になります。たとえば、別のサーバーにSSHで接続すると、元のサーバーに切り替えるのではなく、常にターゲットサーバーターミナルにいることになります。
注意:expect eof
でinteract
のみ第二の選挙。
セットタイムアウトセットタイムアウト
- 期待のデフォルトのタイムアウト期間は10秒です。セッションタイムアウト期間はsetコマンドで設定できます。タイムアウト期間が制限されていない場合は、-1に設定する必要があります。
例:タイムアウト30を設定
exp_continueは引き続き一致します
- exp_continueは、特定の期待判断項目に追加されるため、項目が一致した後も、期待
判断文の他の項目と一致し続けることができます。exp_continueは、制御ステートメントのcontinueステートメントに似ています。期待値が命令を下向きに実行し続けることが許可されていることを示します - 次に例を示します。次の例では、インタラクティブ出力にyes / noまたは* asswordがあるかどうかを判別します。yes / noに一致する場合は、yes
を出力し、判断を再実行します。* passwordに一致する場合は、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が実行されることを期待します。エラーを報告します。
send_user
- send_userは、echoと同等のechoコマンドを意味します
受信パラメータセット
- expectスクリプトは、bashコマンドラインから渡されたパラメーターを受け入れ、[lindex $ argvn
]を使用して取得できます。その中で、nは0から始まり、それぞれ1番目、2番目、3番目のパラメーターを表します。
例:
set hostname [lindex $argv 0] 相当于 hostname=$1
set password [lindex $argv 1] 相当于 password=$2
直接実行することを期待する
ユーザーを切り替えるには、expectコマンドを使用してスクリプトsuを実行する必要があります
#!/usr/bin/expect
#设置超时时间
set timeout 5
- パラメータを渡し
set username [lindex $argv 0]
て最初の位置パラメータを
set password [lindex $argv 1]
取得し、2番目の位置パラメータを取得します - コマンド
spawn su $username
呼び出し変数値の追跡を開始します - インタラクティブ実行しない。情報を取得し、マッチング後には
expect "密码"
suコマンドを、パスワードの文字列があるだろう、と予想される文字列がキャプチャされる
send "$password\r"
キャリッジリターン機能がないので、あなたはそれを追加する必要がありますので、\r
または\n
expect "*]#"
、promptコマンドはログイン後に表示されます。したがって、引用符を入力します*]#
send user "ok"
match成功は、OK表示をエコーすることと同じです
interact
#expect eof
終了する場合はコンソールに制御を与え、expecteofを使用して設定されたタイマーを介して終了します
組み込み実行モード
実行と処理を容易にするために、expectプロセスをシェルに統合します
- ユーザーを作成し、パスワードを設定します
#!/bin/bash
user=$1
password=$2
- 非対話型コマンドはexpectの外に配置されます
useradd $user
- 交換せずに
/usr/bin/expect <<-EOF
expectの実行を開始し
spawn passwd $user
ます。startフラグはプロセス追跡passwdコマンドを開始します。expectはプロセス情報のみをキャプチャできます。
expect "新的*"
send "$ {password}\r" .
expect "重新*"
send "$ {password} \r"
expect eof
EOF
ssh自動ログインを実現
#! /usr/bin/ expect
set timeout 5
set hostname [l index $argv 0 ]
set password [l index $argv 1]
spawn ssh $hostname
expect {
"Connection refused" exit
接続障害の可能性はたくさんあります。相手のsshサービスが閉じられ(バージョンが異なるとプロンプトが表示されるコンテンツが異なる場合があります。これはcentos7です)、
"Name or service not known" exit
サーバーが見つからず、IPアドレスが正しく入力されていない可能性があります(プロンプトはバージョンごとに異なる場合があります。これはcentosです7)
" (yes/no)" {send "yes\r" ;exp_ continue}
yes / noの結果と一致する場合は、yesを選択して後続の操作を続行します。
"password:" {send "$password\r"}
残りはこの結果とのみ一致し、このコンテンツを直接実行します。
interact
コマンドを呼び出す$ passwordの相互作用の後は機能しません。
exit
相互作用なしでディスクパーティションを作成する
- 新しいディスクを準備します
- スクリプトの内容
#!/bin/bash
read -p "输入需要创建的磁盘分区" a
/usr/bin/expect <<-EOF
spawn fdisk $a
expect "命令" {send "n\r"}
expect "Select" {send "\r"}
expect "分区" {send "\r"}
expect "起始" {send "\r"}
expect "Last" {send "\r"}
expect "命令(输入 m 获取帮助):" {send "w\r"}
expect eof
EOF
partprobe
mkfs.xfs $a -f &> /dev/null
if [ $? -eq 0 ]
then
echo -e "\033[31m 磁盘格式化完成 \033[0m"
mkdir $a.1
mount $a $a.1
df -h
else
echo "格式化失败,脚本有问题"
fi
- インストール期待
- スクリプトを実行する
sh
かchmod +x提权再./