Подтвердить что ты не робот

Как использовать bash $(awk) в одиночной ssh-команде?

Я пытаюсь выполнить одну команду над ssh, которая содержит "подкод" или $(субокод) (я использую его все время, но я не знаю официального имени для этого) сначала выполняется, а на целевом сервере.

Для аргумента, скажем, это команда, которую я хочу использовать. Конечно, это можно сделать с помощью hostname, но это просто упрощенный пример, содержащий все матчи форматирования, которые я хочу использовать.

echo `uname -a | awk '{print $2}'`

Нет проблем. Но как вам избежать этого, чтобы отправить его по ssh в одну команду? Неправильно следующее: он позволяет серверу ответить на ваше локальное имя хоста. Подкод выполняется локально:

ssh myServer echo `uname -a | awk '{print $2}'`

Но любая эсперантность, которая приходит на ум, не работает:

$ ssh myServer echo \`uname -a | awk '{print $2}'\`
awk: cmd. line:1: {print $2}`
awk: cmd. line:1:           ^ invalid char '`' in expression
$ ssh myServer echo \$(uname -a | awk '{print $2}')
bash: syntax error near unexpected token `('
$ ssh myServer echo \$\(uname -a | awk '{print $2}')
bash: syntax error near unexpected token `)'
$ ssh myServer echo \$\(uname -a | awk '{print $2}'\)
awk: cmd. line:1: {print $2})
awk: cmd. line:1:           ^ syntax error
bash: -c: line 0: unexpected EOF while looking for matching `)'
bash: -c: line 1: syntax error: unexpected end of file

Я бы хотел, чтобы ответ, который включал в себя использование escaped с эскизом ` or $() because I'd like to know if it possible., мог быть чем-то более сложным.

4b9b3361

Ответ 1

Попробуйте это

ssh myServer "uname -a | awk '{print \$2}' "

Используйте двойные кавычки ", чтобы группировать команды, которые вы выполняете удаленно.

Вам также нужно избежать $ в аргументе $2, чтобы он не был рассчитан локально, но удаленно удален на awk.

Edit:

Если вы хотите включить $( ), вам снова придется вывести символ $, например:

ssh myServer "echo \$(uname -a | awk '{print \$2}') "

Вы также можете избежать обратного хода `, например:

ssh myServer "echo \`uname -a | awk '{print \$2}'\` "

Ответ 2

Как подключить вывод команды и запустить awk локально?

ssh yourhost uname -a | awk '{ print $2 } '

Ответ 3

Обходной путь заключается в создании файла sh с помощью команды, а затем передать его команде ssh:

test.sh

echo `uname -a | awk '{print $2}'`

и команда:

ssh myServer 'bash -s' < test.sh

ОБНОВЛЕНИЕ:

Команда без кавычек также отлично работает:

ssh myServer uname -a | awk '{print $2}'

Ответ 4

Лучше использовать heredoc с ssh, чтобы избежать экранирования кавычек повсюду в более сложной команде:

ssh -T myServer <<-'EOF'
uname -a | awk '{print $2}'
exit
EOF

Ответ 5

Если вы пытаетесь получить имя хоста, используйте:

ssh myServer "uname -n"

Ответ 6

Просто дополнительная заметка:

В моем случае выход из $ не помогает:

ts1350:> ssh [email protected] "grep feature features.txt| awk '{print $6}' "
Password: 
A  feature   -name  ue_trace_mme    | off
ts1350:> ssh [email protected] "grep feature features.txt| awk '{print \$6}' "
Password: 
awk: cmd. line:1: {print \}
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: {print \}
awk: cmd. line:1:        ^ syntax error
ts1350:> ssh [email protected] "grep feature features.txt| awk '{print \\$6}' "
Password: 
awk: cmd. line:1: {print \\}
awk: cmd. line:1:        ^ backslash not last character on line
awk: cmd. line:1: {print \\}
awk: cmd. line:1:        ^ syntax error

Хотя добавьте space между $ и число сработает:

Fri Oct  4 14:49:28 CEST 2019
ts1350:> ssh [email protected] "grep feature features.txt| awk '{print $ 6}' "
Password: 
off

Надеюсь, что этот второстепенный способ поможет кому-то вроде меня.

Благодаря @dave в его ответе: Как напечатать определенный столбец с помощью awk в удаленном сеансе ssh?