私が知る限り、bashで推奨されるパターンは常にシェル変数を引用することです。
例えば。"$VAR"
代わりに、引用符が解釈される変数に提供するのと同じ安全性をどのように取得できますか?$VAR
離れて?
たとえば、次のようになります。
ssh server.com<<CODE
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )
echo \$COUNT > count.txt
CODE
コードが機能するには、および$COUNT
をエスケープする必要があります$TARGET
。
しかし、この特定のケースに対して「$COUNT」または「$TARGET」が提供するのと同じセキュリティをどのように達成できますか?
修正する
問題のある部分だけを貼り付けました。
変数が区切られた文書の外側に定義された他の行があるため<<'CODE'
。
より完全な例:
SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo $SOME_VALUE > test_file.txt # <--- does not work if I use <<'CODE'
TARGET="target dir"
COUNT= \$( ls /foo/bar/\$TARGET | wc -l )
echo \$COUNT > count.txt
CODE
答え1
この記事では二重引用符が保持されているようです。たとえば、次のコマンドを考えてみましょう。
cat <<HEREDOC
"this will still be quoted"
HEREDOC
これにより、出力として次の引用符付き文字列が生成されます。
"this will still be quoted:
したがって、通常どおり変数を参照できる必要があります。
SOME_STRING="SOME VALUE"
ssh server.com<<CODE
echo "$SOME_VALUE" > test_file.txt
TARGET="target dir"
COUNT="\$( ls /foo/bar/\$TARGET | wc -l )"
echo "\$COUNT" > count.txt
CODE
コマンド置換で変数を参照する方法については、次の記事を参照してください。Bashで$(コマンドを置き換える)内で引用
SOME_STRING
コードスニペットをそのままコピーしましたが、代わりに変数を使用しようとしていたようですSOME_VALUE
。以下は、ローカルで実行して予想される結果を得るために少し変更されたコードの一部です。
mkdir -p "/foo/bar/target dir"
SOME_STRING="SOME VALUE"
ssh localhost<<CODE
echo "$SOME_STRING" > test_file.txt
TARGET="target dir"
COUNT="\$( ls "/foo/bar/\$TARGET" | wc -l )"
echo "\$COUNT" > count.txt
CODE
答え2
過去数日間、私たちはこの問題について多くの異なる意見を持っているようです。
その場合は、ここにある文書を引用してください。
ssh server.com <<'CODE'
TARGET="target dir"
COUNT= $( ls /foo/bar/$TARGET | wc -l )
echo $COUNT > count.txt
then
fi
CODE
'CODE'
(onlyとは反対)CODE
は、変数を拡張したりコマンド置換を実行したりすることなく、hereドキュメントが作成されたとおりにユーティリティに渡されるようにします。
ここのドキュメントにも構文エラーがあります(周囲のスペース=
と不一致if
)then
。また、通常どおり拡張を$COUNT
二重引用符で囲む必要があります$TARGET
。
ssh server.com <<'CODE'
TARGET="target dir"
COUNT=$( ls "/foo/bar/$TARGET" | wc -l )
printf '%s\n' "$COUNT" >count.txt
CODE
リモートディレクトリのファイル数を数える場合は、次のコマンドを使用します。
ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \;' | wc -l
これは正しく計算されます/path/to/dir
。
結果をリモートファイルに書き込むには:
ssh server 'find "/path/to/dir" -maxdepth 1 -type f -exec echo . \; | wc -l >file'
リモートで実行する必要があるコードが非常に複雑な場合は、サーバーでスクリプトを作成して実行する方が良いかもしれません。スクリプトに渡す必要がある変数は、コマンドラインから渡すことができます。
ssh server ./script.sh "$SOME_VARIABLE"
スクリプト:
#!/bin/sh
VAR="$1"
# do stuff