SSHを介してリモートで文字列を実行しようとしていますが、バックスラッシュは繰り返されます。

SSHを介してリモートで文字列を実行しようとしていますが、バックスラッシュは繰り返されます。

リモートサーバーからPMD(Poll Mode Driver)のCPUデータを抽出しようとしています。次のようにする必要があります。

pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU
01:48:19 PM   UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
01:48:20 PM   997         -     28553    0.00    0.00    0.00    0.00    14  |__pmd8
01:48:20 PM   997         -     28555  100.00    0.00    0.00  100.00    27  |__pmd9
01:48:20 PM   997         -     28556  100.00    1.00    0.00  100.00    38  |__pmd10
01:48:20 PM   997         -     28557    0.00    0.00    0.00    0.00    39  |__pmd12
01:48:20 PM   997         -     28558  100.00    0.00    0.00  100.00     2  |__pmd11
01:48:20 PM   997         -     28559  100.00    0.00    0.00  100.00    15  |__pmd14
01:48:20 PM   997         -     28560  100.00    1.00    0.00  100.00     3  |__pmd13
01:48:20 PM   997         -     28561  100.00    0.00    0.00  100.00    26  |__pmd15
Average:      UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
Average:      997         -     28553    0.00    0.00    0.00    0.00     -  |__pmd8
Average:      997         -     28555  100.00    0.00    0.00  100.00     -  |__pmd9
Average:      997         -     28556  100.00    1.00    0.00  100.00     -  |__pmd10
Average:      997         -     28557    0.00    0.00    0.00    0.00     -  |__pmd12
Average:      997         -     28558  100.00    0.00    0.00  100.00     -  |__pmd11
Average:      997         -     28559  100.00    0.00    0.00  100.00     -  |__pmd14
Average:      997         -     28560  100.00    1.00    0.00  100.00     -  |__pmd13
Average:      997         -     28561  100.00    0.00    0.00  100.00     -  |__pmd15

これはリモートサーバーに送信するコマンド文字列です。

ssh -vvvv  [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'

私が見た内容は次のとおりです。

pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E pmd\\|%CPU

単一のスラッシュでなければならない二重バックスラッシュを除いて、すべてが正しいです。

ベストアンサー1

SSHは実際にサーバーに送信するバックスラッシュの数に依存しているようです。いくつかの簡単な例を見てみましょう。

ssh -v juha@goliath 'echo h\ello'
...
debug1: Sending command: echo h\\ello
hello
...


ssh -v juha@goliath 'echo h\\ello'
...
debug1: Sending command: echo h\\\\ello
h\ello
...


ssh -v juha@goliath 'echo h\\\ello'
...
debug1: Sending command: echo h\\\\\\ello
h\ello
...


ssh -v juha@goliath 'echo h\\\\ello'
...
debug1: Sending command: echo h\\\\\\\\ello
h\\ello
...

SSHは、引用されたコマンドをリモートシェルに正しく渡すようです。後者の出力は、ローカルでコマンドを実行したときに得られるものとまったく同じです。

一方、SSHはデバッグメッセージのバックスラッシュ数を盲目的に倍増するようです。追加の参照レベルが導入された場合(例:

ssh -v juha@goliath "echo 'h"'\\'"ello'"
...
debug1: Sending command: echo 'h\\\\ello'
h\\ello
...

最後の例の引用方式をより明確にするには、SSHコマンドの最後のパラメータは、および"echo 'h"3'\\'つの文字列を連結することです"ello'"。ローカルシェルはそれを変換してecho 'h\\ello'最初にSSHに渡します。

それでは、次のコマンドを実行してみてください。

ssh -vvvv  [email protected] ''pidstat -t -p '`pidof ovs-vswitchd` 1 1 | grep -E pmd\|%CPU'

2つの一重引用符の前にpidstat。これはpidstat -t -p参照されませんが、これは害を与えません。したがって、上から見ると、リモートシェルは最後の引数を正しく受け取り、grep必要に応じて渡された拡張pmd\|%CPU正規表現に変換するようです。pmd|%CPUgrep

したがって、これが期待どおりに機能しない場合は、バックスラッシュ以外の理由がある可能性があります。

次のようにバックスラッシュを完全に避けることでこれを確認できます。

ssh -v [email protected] 'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E '"'pmd|%CPU'"

'pidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'ここで最後のパラメータは、"'pmd|%CPU'"2つの文字列を連結したものです。ローカルシェルはそれを変換しpidstat -t -p `pidof ovs-vswitchd` 1 1 | grep -E 'pmd|%CPU'てSSHに渡します。

おすすめ記事