後ろに引用符を使用して複数のコマンドをSSHにリンクする

後ろに引用符を使用して複数のコマンドをSSHにリンクする

変数割り当て機能があるため、多くの引用符が必要な複数のコマンドを使用して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

私の考えでは、これはメンテナンスがより簡単だと思います。

おすすめ記事