2016-04-30 1 views
3

следующая команда выглядит цитироваться и спасся:цитирование и избежать из командной SSH линии

$ 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}' " 

, но при выполнении, то результат не то, что ожидается:

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

AWK команда Didn Кажется, чтобы извлечь правую колонку.

Теперь я последовал за ссылку, предоставленную Siguza и придумал:

$ 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}'"'"'"'" 
Missing } 

или,

$ 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> 

или,

$ 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> 

любая идея почему?

Обратите внимание, что мне нужно bash -c, чтобы включить перенаправление вывода в стиле bash как> /var/tmp/1.ouy 2> & 1 для команды.

Ваша помощь приветствуется.

+0

Спасибо. Я следую этому правилу, но все равно не могу заставить его работать. см. обновление выше – AlexL

+0

Что не так с 'ssh rmthost" ps -ef | grep \ "\ \" | grep -v grep | awk '{print \ $ 1}' "' - или я что-то упустил? т. е. путем переноса аргумента в ssh в двойных кавычках, вы избегаете всей неловкости. –

+0

Также 'bash -c' избыточен здесь. ssh отправит командную строку в оболочку, которая сохранит вам весь уровень экранирования. –

ответ

0

Буду честным, я не могу прочитать код, который вы написали. Это слишком запутано, и у меня нет полчаса, чтобы понять это. Для этого это скорее всего не хороший код.

Цитаты, подобные этому, очень запутывают, когда вы пытаетесь понять несколько уровней декодирования. Поэтому вместо того, чтобы пытаться исправить ваши цитаты, я попытаюсь найти более чистый код с тем же результатом.

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}' 

Однако почему бы не попробовать удалить некоторые exessive Grep трубы. awk может сделать фильтрацию для вас. Я предполагаю, что <defunct> появляется в конце строки. Если да, то вы можете просто использовать:

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}' 

Или еще лучше, использовать второй столбец в ps -el который будет Z для зомби процессов:

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

Я получил ошибку «переменный синтаксис» для первой команды и «awk: синтаксическая ошибка около строки 1 awk: незаконный оператор рядом с строкой 1 "для второй команды. – AlexL

+0

Это очень странно, он отлично работает на моей системе. Я редактировал в сжатых примерах. Я предлагаю loggin в удаленной системе и проверять, что они работают в первую очередь. Это очень упрощенный синтаксис 'awk', поэтому я не верю, что с awk что-то не так, но похоже, что что-то случилось, что происходит с выравниванием котировок. –

0

Вот рабочий раствор, играя с котировки:

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

Однако я сам не совсем понимаю механизм :-). и он не работает, если вы меняете одиночные и двойные кавычки.

+0

не может воспроизвести вашу «непревзойденную» ошибку. И поскольку у вас, похоже, есть рабочее решение, я сейчас сдаюсь. –

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

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