2016-04-30 9 views
3

der folgende Befehl aus:zitiert und eine ssh Befehlszeile

$ echo -e ssh -q rmthost 'bash -c "ps -ef|grep '\'''\\\<'defunct'\\\>''\''|grep -v grep|awk '\'''{print \$1}''\'' "' 
ssh -q sbpsvrwm757 bash -c "ps -ef|grep '\<defunct\>'|grep -v grep|awk '{print $1}' " 

aber wenn sie ausgeführt werden, was das Ergebnis ist nicht zu erwarten:

$ ssh -q rmthost 'bash -c "ps -ef|grep '\'''\\\<'defunct'\\\>''\''|grep -v grep|awk '\'''{print \$1}''\'' "' 
    root16986 16982 0  - ?   0:01 <defunct> 

die awk didn Ich schein nicht die richtige Spalte zu finden.

Nun folgte ich den Link von Siguza zur Verfügung gestellt und kam mit:

$ echo ssh -q rmthost "'"bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"'"'" 
ssh -q rmthost 'bash -c "ps -ef|grep '\<defunct\>'|grep -v grep|awk '{print $1}'"' 

, die zu vollkommen entgangen aussieht, aber immer noch nicht funktioniert:

$ ssh -q rmthost "'"bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"'"'" 
Missing } 

oder

$ echo ssh -q rmthost bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"' 
ssh -q rmthost bash -c "ps -ef|grep '\<defunct\>'|grep -v grep|awk '{print $1}'" 
$ ssh -q rmthost bash -c '"ps -ef|grep '"'\<defunct\>'|grep -v grep|awk '{print \$1}'"'"' 
    root 16986 16982 0  - ?   0:01 <defunct> 

oder

$ echo ssh -q rmthost "bash -c \"ps -ef |grep '\<defunct\>'|grep -v grep| awk '{print \$1}'\"" 
ssh -q rmthost bash -c "ps -ef |grep '\<defunct\>'|grep -v grep| awk '{print $1}'" 
$ ssh -q rmthost "bash -c \"ps -ef |grep '\<defunct\>'|grep -v grep| awk '{print \$1}'\"" 
    root 16986 16982 0  - ?   0:01 <defunct> 

irgendeine idee warum?

Bitte beachten Sie, dass ich bash -c benötige, um die bash-ähnliche Ausgabeumleitung wie> /var/tmp/1.ouy 2> & 1 für den Befehl zu aktivieren.

Ihre Hilfe wird geschätzt.

+0

Danke. Ich folge dieser Regel, kann aber immer noch nicht funktionieren. Siehe das obige Update – AlexL

+0

Was ist falsch mit 'ssh rmthost" ps -ef | grep \ "\ \" | grep -v grep | awk '{print \ $ 1}' "'- oder fehle ich hier etwas? Indem Sie das Argument in doppelte Anführungszeichen setzen, vermeiden Sie alle Unannehmlichkeiten. –

+0

Auch 'bash -c' ist hier überflüssig. ssh wird die Befehlszeichenfolge an eine Shell selbst senden, wodurch Sie eine ganze Ebene der Entweichen sparen. –

Antwort

0

Ich werde ehrlich sein Ich kann den Code nicht lesen, den Sie geschrieben haben. Es ist zu verschleiert und ich habe keine halbe Stunde Zeit, es herauszufinden. Zu diesem Zweck ist es höchstwahrscheinlich kein guter Code.

Zitate wie diese werden wirklich sehr verwirrend, wenn Sie versuchen, die mehreren Ebenen der Decodierung zu verstehen. Anstatt zu versuchen, Ihre Zitate zu korrigieren, werde ich versuchen, saubereren Code mit dem gleichen Ergebnis zu liefern.

ssh rmthost "bash -c \"ps -ef | grep '<defunct>' | grep -v grep | awk '{print \\\$2}'\"" 

# The remote system will execute this: 
bash -c "ps -ef | grep '<defunct>' | grep -v grep | awk '{print \$2}'" 

# Which in tells bash to execute this: 

ps -ef | grep '<defunct>' | grep -v grep | awk '{print $2}' 

aber warum nicht versuchen, einige exessive grep Rohre zu entfernen. awk kann die Filterung für Sie tun. Ich gehe davon aus, dass <defunct> am Ende der Zeile erscheint. Wenn ja, dann können Sie nur verwenden:

ssh rmthost "bash -c \"ps -ef | awk '/<defunct>\\\$/ {print \\\$2}'\"" 

# the remote system executes this: 
bash -c "ps -ef | awk '/<defunct>\$/ {print \$2}'" 

# bash executes this: 
ps -ef | awk '/<defunct>$/ {print $2}' 

Oder noch besser, die zweite Spalte in einem ps -el verwenden, die Z für Zombie-Prozesse sein:

ssh rmthost "bash -c \"ps -el | awk '/^. Z/{print \\\$4}'\"" 

# the remote system executes this 
bash -c "ps -el | awk '/^. Z/{print \$4}'" 

# bash executes this: 
ps -el | awk '/^. Z/{print $4}' 
+0

Ich habe "Variablen-Syntax" Fehler für den ersten Befehl und "awk: Syntaxfehler nahe Zeile 1 awk: illegale Anweisung in der Nähe der Linie 1 "für den zweiten Befehl. – AlexL

+0

Das ist sehr seltsam, es funktioniert gut auf meinem System. Ich habe in den abgeflachten Beispielen editiert. Ich würde vorschlagen, in das entfernte System einzuloggen und zu überprüfen, dass sie zuerst arbeiten. Dies ist eine sehr einfache "awk" -Syntax, daher glaube ich nicht, dass irgendetwas mit awk schief geht, aber es hört sich an, als würde etwas verschraubt passieren, indem die Anführungszeichen abgeflacht werden. –

0

Hier ist eine Arbeitslösung mit dem durch das Spiel Zitate:

ssh -q rmthost "bash -c 'ps -ef|grep ''''\<'defunct'\>''''|grep -v grep|awk "'"{print \$2}"'" '" 

aber ich selbst verstehe nicht ganz den Mechanismus :-). und es funktioniert nicht, wenn Sie einfache und doppelte Anführungszeichen austauschen.

+0

nicht in der Lage, Ihren 'nicht übereinstimmenden' Fehler zu reproduzieren und da Sie eine funktionierende Lösung zu haben scheinen, gebe ich jetzt auf. –