2017-09-18 1 views
1

私はこの問題を回避することができません。私はJenkinsの仕事からSSH上でsymlinkコマンドを実行します。私のJenkinsのパイプラインでは、私はこれらの2つのステップを(他のものの中でも)持っています。symlinkコマンドでワイルドカードを使用すると、Jenkinsから実行すると間違ったリンクが作成される

sh "ssh [email protected]${host} sudo ls -al /etc/nginx/sites-available" 
sh "ssh [email protected]${host} sudo ln -sv /etc/nginx/sites-available/* /etc/nginx/sites-enabled/ -f" 

は、ここでログの関連部分です:

シンボリックリンクが代わり my-nginx-configシンボリックリンクの私のリモートホスト上に作成され
[Pipeline] sh 
[my_job] Running shell script 
+ ssh [email protected] sudo ls -al /etc/nginx/sites-available 
total 12 
drwxr-xr-x 2 root root 4096 Sep 18 17:27 . 
drwxr-xr-x 6 root root 4096 Aug 30 12:27 .. 
-rw-r--r-- 1 ubuntu ubuntu 467 Sep 18 17:27 my-nginx-config 
[Pipeline] sh 
[my_job] Running shell script 
+ ssh [email protected] sudo ln -sv /etc/nginx/sites-available/default /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/ -f 
'/etc/nginx/sites-enabled/default' -> '/etc/nginx/sites-available/default' 
'/etc/nginx/sites-enabled/jenkins' -> '/etc/nginx/sites-available/jenkins' 

/etc/nginx/sites-availableで私のジェンキンスのホスト上にあるdefaultjenkinsファイル( )はシンボリックリンクされています。

私は期待どおりに動作しますが、ワイルドカードを使用すると、これを実行しない場合:

sh "ssh [email protected]${host} sudo ls -al /etc/nginx/sites-available" 
sh "ssh [email protected]${host} sudo ln -sv /etc/nginx/sites-available/my-nginx-conf /etc/nginx/sites-enabled/ -f" 

答えて

1

時々、リモートのsshコマンド(およびscpのための場所)は、余分なエスケープ処理を必要としています。あなたのクエリーをすでに引用していることは分かっていますが、エスケープレベルを1つ追加する必要があるかもしれません(そして、エスケープはSSHコマンドに渡されるのではなく二重引用符で解釈されるため、もう1つ必要です。そのワイルドカードをダブルエスケープしてみてください。

sh "ssh [email protected]${host} sudo ls -al /etc/nginx/sites-available" 
sh "ssh [email protected]${host} sudo ln -sv /etc/nginx/sites-available/\\* /etc/nginx/sites-enabled/ -f" 

ます。また、1つのSSH呼び出しにこれらの組み合わせることができます。

sh "ssh [email protected]${host} sudo ls -al /etc/nginx/sites-available; sudo ln -sv /etc/nginx/sites-available/\\* /etc/nginx/sites-enabled/ -f" 

を私はジェンキンスの専門家ではない、これは動作しない場合は、私が試してみました。さらに別のエスケープペアを使用して、オリジナルを…/sites-available/*からに変更します

+0

おかげで、!私は今もリモートコマンド全体を引用してみました(自分の答えを見てください)。 – finspin

1

(それらのほとんどは、引用符なしで動作が)リモートコマンドを引用符で囲む必要があります。二重のバックスラッシュの作品でエスケープ

sh "ssh [email protected]${host} 'sudo ln -sv /etc/nginx/sites-available/* /etc/nginx/sites-enabled/ -f'" 
+0

ええ、余分な一重引用符は '* 'をローカルで解釈することを防ぎます。ジェンキンスがネストをどのように処理したかはわかりませんでしたので、私は[私の解答](https://stackoverflow.com/a/46285671/519360)で醜いしかし(軽く)より安全なエスケープベースの解決策を検討しました。 –

関連する問題