2016-11-22 11 views
0

При попытке выполнить следующую команду через SSH:Ошибка при выполнении команды Баш через SSH

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

Я получаю следующее сообщение об ошибке:

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

Я пытался избежать по-разному но не нашли правильного пути - или, может быть, это что-то еще?

Заранее благодарен!

+1

Вы можете использовать 'pkill -f 'некоторый процесс" в этом случае. – ymonad

+0

Это не будет убивать все процессы с определенным именем, не так ли? –

ответ

3

Вы не можете включать одинарные кавычки в строку с одним кавычком, поскольку внутри ничего не интерпретируется, кроме единственной цитаты, которая закрывает строку. Вы можете объединить отдельные кавычки строки с "'":

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

В качестве альтернативы, можно сцепить сбежавшие одиночные кавычки (\'):

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

См Strong Quoting.

Причины возникновения ошибки

Ваша команда интерпретируется как пара $IFS -разделенных аргументов:

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

Там нет $2 в строки, начиная с $2 интерпретируется как переменная оболочки, а значение этой переменной в обычном контексте оболочки пусто.

Таким образом, вы послали следующую команду на сервере:

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

Если вы запустите эту команду в терминале, вы получите ту же ошибку с AWK.

+0

Как @ymonad указал в предыдущем комментарии выше, команда ** pkill ** уменьшит проблему с котировками: 'ssh host 'pkill -KILL -f' некоторый процесс" ''... до тех пор, пока текст **' Конечно, какой-то процесс' ** не содержит никаких котировок. – Jdamian

 Смежные вопросы

  • Нет связанных вопросов^_^