変数割り当て機能があるため、多くの引用符が必要な複数のコマンドを使用してsshアクセスに使用する必要があるサーバーがあります。スクリプトを考えると、次のようになります。
ssh user@host "kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host ;
set -x
touch health_check.log ;
echo \"Starting HDFS health check\" > health_check.log ;
echo \"/path/to\" >> health_check.log ;
hdfs dfs -du -h /path/to &>> health_check.log ;
echo \"**************************************************************************
/path/to/dir\" >> health_check.log ;
hdfs dfs -du -h /path/to/dir &>> health_check.log ;
subject=\"HDFS Health Check\" ;
from=\"[email protected]\" ;
recipients=\"[email protected]\" ;
mail=\"subject:$subject\nfrom:$from\nContent-Type: text/html\nMIME-Version: 1.0\n\n$(cat health_check.log)\" ;
echo -e $mail | sendmail \"$recipients\" ;
set +x
rm health_check.log
"
スクリプトを実行すると、次のデバッグ出力が表示されます。
++ subject='HDFS Health Check'
++ [email protected]
++ [email protected]
++ mail='subject:\nfrom:\nContent-Type: text/html\nMIME-Version: 1.0\n\nStarting HDFS health check /data/gftocon'
++ echo -e
++ sendmail ''
私の変数が必要な空の文字列を確認してください。エスケープ引用符が機能しないのはなぜですか?
ベストアンサー1
これは、スクリプトが二重引用符で囲まれているためです。あなたの殻変数の置換今後SSH コマンドを開始します。バックスラッシュを追加または使用できます。ここに引用このように:
ssh user@host <<'END_COMMANDS'
# ...............^............^ these quotes make the whole document single-quoted
kinit -k -t /path/to/dir/`whoami`.`hostname -s`.keytab `whoami`/`hostname -f`@host
set -x
echo "Starting HDFS health check" > health_check.log
echo "/path/to" >> health_check.log
hdfs dfs -du -h /path/to &>> health_check.log
echo "**************************************************************************
/path/to/dir" >> health_check.log
hdfs dfs -du -h /path/to/dir &>> health_check.log
subject="HDFS Health Check"
from="[email protected]"
recipients="[email protected]"
headers="subject:$subject
from:$from
Content-Type: text/html
MIME-Version: 1.0"
{ echo "$headers"; echo; cat health_check.log; } | sendmail "$recipients"
set +x
rm health_check.log
END_COMMANDS
私の考えでは、これはメンテナンスがより簡単だと思います。