SSH接続経由でコマンドを実行する

SSH接続経由でコマンドを実行する

SSH 接続経由で次のコマンドを実行したい:

tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}' 

このコマンドはターゲットマシン上で動作しています。

ここで、別のマシンからこのコマンドを使用して、ssh 経由で実行したいので、次のようにしました。

ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}' 

結果は

 cat: /var/run/jboss-as/jboss-as-standalone8.pid: No such file or directory
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

私の電話はどうしたんですか?

答え1

シェルが詰まる可能性のある特殊文字が少なくなるように、コマンドを簡素化する方が簡単かもしれません。

ssh jboss@myTargetServer 'ps -p $(cat /var/run/jboss-as/jboss-as-standalone8.pid) -o %cpu= 2>/dev/null'

2>/dev/nullPID ファイルが見つからないか、古い PID が含まれている場合、末尾にエラー テキストが残ります。

答え2

これらのコマンドを、リモートで呼び出すスクリプトに入れることをお勧めしますssh。そうしないと、コマンド ラインの「リモート」部分全体を引用符で囲み、内部のすべてを適切にエスケープする必要があります。これは面倒で、エラーが発生しやすくなります。これが、リモート スクリプト呼び出しの理由です。

答え3

2 番目のコマンドは、ローカル サブシェルでコード部分 ( ) を実行します。特殊文字 (基本的には)$()をエスケープして、反対側で実行する必要があります。$

ssh jboss@myTargetServer tmpValue=\$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
 && top -b -U jboss -n 1 |grep \$tmpValue |awk '{print $9}'

または、すべてをアポストロフィで囲み'、内側のアポストロフィをエスケープします。

ssh jboss@myTargetServer 'tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
 && top -b -U jboss -n 1 |grep \$tmpValue |awk \'{print $9}\''

テストはしていませんが、これを修正するために何をすべきかが基本的な考え方です。

答え4

スクリプトを書くのが本当に嫌なら、 ここに文書便利です。ショート氏は、<< SOMETEXMARKER行末に追加して、リモートホストのコマンドを好きなだけ入力し続けると述べました。そして、最後の行(行の先頭)に同じものを入力するとSOMETEXTMARKER、入力したコマンドがリモートで実行されます。

サンプルはこちら

[bobby@bobby ~]$ ssh jimmy@jimmy << MRK '
> # single quote above makes all vars resolve on remote host
> echo remote user and host are : 
> echo $USER $(hostname)
> # entereing closing single quote
> '
> # finally entereing the marker
> MRK
remote user and host are :
jimmy jimmy

関連情報