Bashスクリプトで区切り文字をエスケープする方法

Bashスクリプトで区切り文字をエスケープする方法

入力ファイルを読み込み、heredocを使用してサーバーにsshで接続するbashスクリプトがありますが、入力ファイルからいくつかの特殊文字をエスケープするのに問題があります。これが私が持っているものです...


以下を含む input.txt というファイルがあります。

1.2.3.4:abcdefg
2.3.4.5:abc$def

以下のようにbashスクリプトがあります。パスワードに「$」文字が含まれていない場合はうまく機能しますが、パスワードに「$」が含まれている場合は$の後ろの部分を変数として扱うため、操作は中断されます。

#!/bin/bash

if [ -e "input.txt" ]; then
    while read i; do

/usr/bin/expect <(cat << EOD
set timeout 15
spawn ssh "user@$(echo $i | cut -d: -f 1)"
#######################

expect "yes/no" {
    send "yes\r"
    expect "Password:" { send "$(echo $i | cut -d: -f 2)\r" }
} "Password:" { send "$(echo $i | cut -d: -f 2)\r" }
expect -re "day: $" { send "\r" }
expect ":" { send "\r" }
expect -re "# $" { send "date\r" }
expect -re "# $" { send "exit\r" }
EOD
)
    done < input.txt
fi

これを実行して2番目のIPセットに達すると、次のエラーが発生します。

spawn ssh [email protected]

Unauthorized use of this system is prohibited and may be prosecuted
to the fullest extent of the law. By using this system, you implicitly
agree to monitoring by system management and law enforcement authorities.
If you do not agree with these terms, DISCONNECT NOW.

Password: can't read "def": no such variable
    while executing
"send "abc$def\r" "
    invoked from within
"expect "yes/no" {
    send "yes\r"
    expect "Password:" { send "abc$def\r" }
} "Password:" { send "abc$def\r" }"
    (file "/dev/fd/63" line 5)

誰でもどんなアイデアがありますか?私は二重引用符の中に一重引用符と私が考えることができるすべてを試しましたが、まだ動作しませんでした。事前にありがとう

ベストアンサー1

ここでドキュメントの変数を拡張したくない場合は、EODを引用してください。

cat << 'EOD'
...
EOD

たとえば、次のファイルは次のようになります。

cat <<EOF
test\$literal
var$(echo this)
EOF

次の結果が生成されます。

test$literal
varthis

おすすめ記事