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/null
PID ファイルが見つからないか、古い 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