Befehl über SSH-Verbindung ausführen

Befehl über SSH-Verbindung ausführen

Ich möchte folgenden Befehl über eine SSH-Verbindung ausführen:

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

Dieser Befehl funktioniert auf meiner Zielmaschine.

Jetzt möchte ich diesen Befehl von einem anderen Computer aus verwenden und ihn über SSH ausführen. Ich habe daher Folgendes getan:

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

Das Ergebnis ist

 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.

Was ist mit meinem Anruf los?

Antwort1

Möglicherweise ist es einfacher, den Befehl so zu vereinfachen, dass Sie weniger Sonderzeichen haben, an denen die Shell scheitern könnte:

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

Der nachfolgende Text 2>/dev/nullverwirft den Fehlertext für den Fall, dass die PID-Datei entweder nicht gefunden werden kann oder eine veraltete PID enthält.

Antwort2

Ich würde empfehlen, diese Befehle in ein Skript einzufügen, das Sie per Remote-Aufruf aufrufen ssh. Andernfalls müssten Sie den gesamten „Remote“-Teil der Befehlszeile in Anführungszeichen setzen und alles darin ordnungsgemäß maskieren. Dies kann mühsam und fehleranfällig sein. Aus diesem Grund wird das Skript per Remote-Aufruf aufgerufen.

Antwort3

Der zweite Befehl, so wie Sie ihn haben, führt den Codeteil ( $()) in der lokalen Subshell aus. Sie müssen ihn auf der anderen Seite ausführen, indem Sie Sonderzeichen maskieren (im Grunde $):

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

oder setzen Sie alles in die Apostrophe 'und lassen Sie die inneren weg:

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

Ich habe es nicht getestet, aber es ist die Grundidee, was getan werden sollte, um das Problem zu beheben.

Antwort4

Wenn Sie wirklich zögern, Skripte zu schreiben, finden Sie vielleicht Hier Dokumentpraktisch. Kurz gesagt, Sie fügen << SOMETEXMARKERam Ende der Zeile hinzu und geben so viele Befehle für den Remote-Host ein, wie Sie möchten. Dann geben Sie in der letzten Zeile (ganz am Anfang der Zeile) dasselbe ein SOMETEXTMARKERund die eingegebenen Befehle werden remote ausgeführt

Hier ist ein Beispiel

[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

verwandte Informationen