2017-11-15 22 views
0

私はジェンキンスから次のコマンドを実行したいと思います:SSHで特殊文字を含むコマンドを渡すには?

ssh -i ~/.ssh/company.pem -o StrictHostKeyChecking=no [email protected]$hostname "supervisorctl start company-$app ; awk -v app=$app '$0 ~ "program:company-"app {p=NR} p && NR==p+6 && /^autostart/ {$0="autostart=true" ; p=0} 1' /etc/supervisord.conf > $$.tmp && sudo mv $$.tmp /etc/supervisord.conf” 

これはCloudFormationスタックを作成し、ジョブの最後のステップの1つです。

ターゲットサーバの端末からコマンドを実行すると、正常に動作します。

の上記のように、各サーバー(新しいスタック内のASGのメンバー)にsshを送信し、特定の行を検索して置き換えます。基本的には、特定のサービスを自動起動に設定します。

私は、コマンドを実行すると、私は次のエラーを取得する:

Usage: awk [POSIX or GNU style options] -f progfile [--] file ... 
Usage: awk [POSIX or GNU style options] [--] 'program' file ... 

私は、私が間違ってやっている任意のアイデアを二重引用符をエスケープしようとしたが、同じエラーを持っていますか?

+0

www.shellcheck.netからのご提案をお試しください – Androbin

答えて

0

シェルがネストされた引用符を処理する方法が原因で、この問題が発生しています。これは、のユースケースです。またはheredoc - ここでは、ドキュメントは、引用符を気にすることなくbashで渡された複数行のコマンドを書くことができます。次のような構造は、次のとおりです。

$ ssh -t [email protected] <<'END' 
command |\ 
command2 |\ 
END 

< ---そうそう、-tが、それはシェルが対話的に使用されているかのように振る舞うように知ることができますようにsshコマンドに重要であり、警告や予期しないを避けることができます結果。あなたの特定のケースで

、あなたのような何かを試してみてください:私はあなたが実行しているコマンドの希望する出力について確認することができないため、を追跡することをお勧めする、ちょうどノート

$ ssh -t -i ~/.ssh/company.pem -o StrictHostKeyChecking=no [email protected]$hostname <<'END' 
supervisorctl start company-$app |\ 
awk -v app=$app '$0 ~ \"program:company-\"app {p=NR} p && NR==p+6 \ 
&& /^autostart/ {$0="autostart=true" ; p=0} 1' \ 
/etc/supervisord.conf > $$.tmp && sudo mv $$.tmp /etc/supervisord.conf 
END 

を独自の"'のマークを付けて、対話的な端末と同じようにawkコマンドでエスケープします。私は"の周りにprogram:companyがあることに気づいて、私は彼らが少し混乱しています。もしそれらが検索されている文字列のパターンの一部であれば、それに応じてエスケープする必要があります。 P.S.

関連する問題