Как использовать 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.
, мог быть чем-то более сложным.
Ответы
Ответ 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?