2017-02-06 4 views
2

私はsshのパイプラインコマンドエラー

ssh [email protected] cat /root/devops/giveAllArtifacts.txt | xargs -I {} sh -c "grep {} /ci/test.log;" 

が、私はgrepを取得していないのですマシン上で実行しています:/ci/test.logを:そのようなファイルやディレクトリ

が、同じコマンド(cat /root/devops/giveAllArtifacts.txt | xargs -I {} sh -c "grep {} /ci/test.log;")を上サーバー:lPServerHglはエラーなしで動作します。

P.SS接続に問題はありません。他のすべてのコマンドはsshで動作しています。パイプコマンドには問題があるようです。

答えて

1

パイプはリモートサーバーではなくローカルコンピュータで実行されています。

ssh [email protected] remote-cmd [...args] | local-cmd [...args] 
--------- runs in server --------- | --- runs locally ---- 

パイプはあなたシェルではなく、リモートのいずれかで解釈されます。 ssh接続の反対側でパイプラインを実行するには、そこにシェルを呼び出す必要があります。例:

ssh [email protected] bash -c "'cat file.txt | grep foo'" 

内部引用符に注意してください。これにより、パイプラインが他のマシンのbashプロセスに送信されます。

これらのコマンドを入力するのは面倒でバグが多い可能性があります。リモートマシンにすぐに実行できるスクリプトを配置して、単一のコマンドで呼び出すことができます。

+0

あなたが言ったことが正しいかどうかをテストする私はこれを実行しました ssh user @ host ls -l/ci | grep drwx これは、ローカルマシンの代わりにremotehostの結果を与えました。 bashを2回呼び出すことは、xrags sh -c – christoph

+0

'ssh user @ host bash -c" cat file.txt | grep foo "'で既に行われているため動作しません。 sshは 'bash -c cat file.txt | grep foo'をリモートで実行しますが、これは意図したことをしません。 – Kenster

+0

リモートで実行するコマンドをsshに指定する方法はありません。これを試しました。これを試しました。これを試しました。 ssh root @ lPServerHgl 'cat /root/devops/giveAllArtifacts.txt | xargs -I {} sh -c "grep {} /ci/test.log;" まだ動作しません – christoph