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