2016-11-22 1 views
0

Lorsque vous essayez d'exécuter la commande suivante sur ssh:Erreur lors de l'exécution commande bash sur ssh

ssh hostname 'for pid in $(ps -ef | grep "some process" | awk '{print $2}'); do kill -9 $pid; done'

Je reçois l'erreur suivante:

awk: cmd. line:1: {print 
awk: cmd. line:1:  ^unexpected newline or end of string 

J'ai essayé échapper de différentes façons mais n'ont pas trouvé la bonne façon - ou peut-être que c'est quelque chose d'autre?

Merci d'avance!

+1

vous pouvez utiliser 'pkill -f" certains processus "' dans ce cas. – ymonad

+0

Cela ne va pas tuer tous les processus avec un certain nom, n'est-ce pas? –

Répondre

3

Vous ne pouvez pas inclure de guillemets simples dans une chaîne entre guillemets, puisque rien n'est interprété à l'intérieur, à l'exception du guillemet simple qui ferme la chaîne. Vous pouvez concaténer les chaînes entre guillemets simples avec "'":

ssh host 'for pid in $(ps -ef | grep "some process" | awk '"'"'{print $2}'"'"'); do kill -9 $pid; done' 

Alternativement, concaténer des guillemets simples échappées (\'):

ssh host 'for pid in $(ps -ef | grep "some process" | awk '\''{print $2}'\''); do kill -9 $pid; done' 

Voir Strong Quoting.

La cause de l'erreur

Votre commande est interprétée comme deux $IFS arguments -Séparé:

  • for pid in $(ps -ef | grep "some process" | awk {print
  • }); do kill -9 $pid; done

Il n'y a pas $2 dans les cordes, depuis $2 est interprété comme une variable shell et la valeur de cette variable dans le contexte shell normal est vide.

Ainsi, vous avez envoyé la commande suivante au serveur:

for pid in $(ps -ef | grep "some process" | awk {print }); do kill -9 $pid; done 

Si vous exécutez cette commande dans un terminal, vous obtiendrez la même erreur de AWK.

+0

Comme @ymonad pointé dans un commentaire précédent ci-dessus, la commande ** pkill ** réduirait le problème de citation: 'ssh host 'pkill -KILL -f" un certain processus "' ... tant que le texte **' certains processus ** n'incluent pas de devis, bien sûr. – Jdamian