相互作用のないシェルスクリプト(EOFのない相互作用、期待のない相互作用)

ヒアドキュメントの無料インタラクション

  • I / Oリダイレクトを使用して、ftp、cat、readコマンドなどの対話型プログラムにコマンドのリストを提供します

  • 標準入力の代わりになることで、スクリプト開発者は一時ファイルを使用して入力情報を作成するのではなく、「ファイル」を直接生成して「コマンド」の標準入力として使用できます。ヒアドキュメントは、非対話型のプログラムやコマンドでも使用できます。

  • 文法形式

    命令 <<标记(EOF)
    …       (标记之间是传入的内容)
    …       
    标记(EOF)
    

予防

  • マーキングには、任意の正当な文字(大文字)を使用できます(EOF、FOE、前後で同じ)
  • 終了マークは、前に文字を付けずに一番上のグリッドに書き込む必要があります
  • 終了マークの
    後に文字(スペースを含む)を含めることはできません。開始マークの前後のスペースは省略されます。

例:

行数の統計を実現するための相互作用のない方法

カウントするコンテンツをタグ「EOF」の間に置き、統計のためにコンテンツをwc-lに直接渡します。

wc -l <<EOF
> sheng
> mo
>  EOF
> EOF 
> EOF

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

入力を受け取り、読み取りコマンドを介して印刷します

入力値は、変数iの値としての2つのEOFタグ間の部分です。

read i <<EOF
> ni hao!
> EOF
echo $i

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

passwdを介してユーザーのパスワードを設定します
passwd shengmo <<EOF
> zxc123
> zxc123
> EOF

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

変数置換

ファイルを書き込むとき、最初に変数を実際の値に置き換え、次にcatコマンドで書き込みを完了します。

vim 1.sh
#!/bin/bash
gong="hong.txt"
name="dizu"
cat > $gong <<EOF
ni hao $name
EOF
sh 1.sh
cat hong.txt

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

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

可変設定

値全体を変数に割り当ててから、echoコマンドを使用して変数を出力します。

vim 2.sh
#!/bin/bash
xyz="ni hao!"
di=$(cat <<EOF
this is xiaosuo
$xyz
EOF
)
echo $di
sh 2.sh

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

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

変数置換をオフにします

文字の元の外観に従って出力され、変更や置換は行われず、一重引用符で変数が置換され、EOFの変数は文字列と見なされます。

vim 2.sh

#!/bin/bash
xyz="ni hao!"
di=$(cat <<'EOF'
this is xiaosuo
$xyz
EOF
)
echo $di
sh 2.sh

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

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

各行の前のTAB文字を削除します

行頭のTAB効果が抑制されていることを示します

vim 2.sh

#!/bin/bash
xyz="ni hao!"
di=$(cat <<-EOF   #对标记前加“-”,即可抑制各行首TAB
    this is xiaosuo
  $xyz
EOF
)
echo "$di"
sh 2.sh

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

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

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

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

複数行コメント
  • Bashのデフォルトのコメントは「#」です。このコメントメソッドは単一行コメントのみをサポートします。ヒアドキュメントの導入により、複数行コメントの問題が解決されます。

  • ヒアドキュメントの導入により、複数行コメントの問題が解決されます。「:」は、何もしない空のコマンドを表します。ミドルマーク領域の内容は実行されず、bashによって無視されるため、バッチコメントの効果を得ることができます。

    vim 2.sh
    
    #!/bin/bash
    xyz="ni hao!"
    : di=$(cat <<-EOF
      this is xiaosuo
    $xyz
    EOF
    )
    echo "$di"
    echo "$xyz"
    sh 2.sh
    

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

相互作用を期待しない

  • Expectはtcl言語に基づくツールであり、自動制御とテストによく使用されます。主にシェルスクリプトの非相互作用の問題を解決します。これは、大規模なLinuxの運用と保守に非常に役立ちます。

インストールを期待する

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

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

基本コマンド

(1)スクリプトインタプリタ

このファイルは、どのシェルが使用されているかを示すために、expectスクリプトで最初に導入されます。

#!/usr/bin/expect
(2)スポーン

スポーンの後には通常、セッションを開き、プロセスを開始し、後続の対話情報を追跡するコマンドが続きます。

例:spawn passwd root
(3)期待する
  • 指定された文字列が最後の出力結果に含まれているかどうかを判別し、含まれている場合はすぐに戻ります。含まれていない場合は、タイムアウト期間を待ってから戻ります。
  • スポーンによって開始されたプロセスの出力のみをキャプチャできます
  • コマンドの実行後に出力を受け取り、期待される文字列と一致させるために使用されます
(4)送信

ユーザーの入力をシミュレートするために文字列をプロセスに送信します。このコマンドは自動的に入力して改行することはできません。通常は\ r(キャリッジリターン)または\ nを追加します。

例如:发送密码
方式一:
expect "密码" {send "123456\r"}		#同一行send部分要有{}
方式二:
expect  "密码"
send  "$abc123\r"      #换行send部分不需要有()
方式三:
expect					#只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
{
"密码1" {send "123456\r"}
"密码2"  {send "123456\r"}
"密码3"  {send "123123\r"}
}
(5)ターミネーター
expect eof
  • インタラクションの終了を示し、実行が終了するのを待って、元のユーザーに戻り、スポーンに対応します

  • たとえば、rootユーザーに切り替えると、expectスクリプトはデフォルトで10秒間待機します。コマンドを実行すると、デフォルトで10秒間待機した後、自動的に元のユーザーに戻ります。

    interact
    
  • 実行が完了すると、対話状態が維持され、制御がコンソールに移されます。元の端末に戻るのではなく、ターゲット端末に留まります。この時点で、手動で操作できます。対話後のコマンド対話後に終了を追加するなど、機能しません。rootユーザーを終了しません。対話がない場合は、リモート端末にとどまるのではなく、ログイン後にログアウトします。

  • インタラクションを使用すると、ターミナルに残り、元のターミナルに戻りません。たとえば、rootユーザーに切り替えると、常にrootユーザーの状態になります。たとえば、別のサーバーにsshを実行すると、常に元のサーバーに切り替えるのではなく、ターゲットサーバー端末にいる。

注:eofを期待し、対話できるのは1つだけです

(6)セット

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

例:设置超时时间为30秒
set timeout 30
(7)exp_continue

exp_continueは、特定の期待判断項目に追加されるため、項目が一致した後も、期待判断文の他の項目と一致し続けることができます。exp_continueは、制御ステートメントのcontinueステートメントに似ています。期待値が命令の実行を継続できることを示します。
次に例を示します。次の例では、対話型出力にyes / noまたは* passwordがあるかどうかを判別します。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を追加しないでください。スポーンプロセスが終了した後、eofがexpectに送信されます。後続のexpecteofが実行される原因になります。エラーを報告します。

(8)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

直接実行を期待する

vim 1.sh

#!/uer/bin/expect
set timeout 5
set username [lindex $argv 0]
set password [lindex $argv 1]
spawn su $username
expect "密码"
send "$password\r"
expect eof    #或者interact

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

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

埋め込まれた実行を期待する

実行と処理を容易にするために、expectプロセスをシェルに統合します

vim 4.sh

#!/bin/bash
user=$1
password=$2
useradd $user
/usr/bin/expect <<EOF
spawn passwd $user
expect "新的*"
send "${password}\r"
expect "重新*"
send "${password}\r"
expect eof
EOF

sh 4.sh

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

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

ssh自動ログインを実現

vim 5.sh

#!/usr/bin/expect
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {
  "Connection refused" exit
  "Name or service not known" exit
  "to continue" {send "yes\r";exp_continue}
  "password:" {send "$password\r"}
}

interact
exit

expect 5.sh 192.168.100.128 123456

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

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

おすすめ

転載: blog.csdn.net/shengmodizu/article/details/114894314
おすすめ