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/null
verwirft 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 << SOMETEXMARKER
am 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 SOMETEXTMARKER
und 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