Рейтинг:0

Ошибка рядом с неожиданным токеном `(', но затем в доступе отказано

флаг in

Я пытаюсь запустить этот плагин nagios:

sudo /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=$$(cat /proc/meminfo | egrep "Slab:" | awk '{print $$2;}'); MEMTOTAL =$$(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'); awk "НАЧАТЬ {print 100*$$SLAB/$$MEMTOTAL}"" -w '>50' - c '>80' -p "slab_mem"

Он показывает эту ошибку:

sh: -c: строка 0: синтаксическая ошибка рядом с неожиданным токеном `('
sh: -c: строка 0: `SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}'); MEMTOTAL=76876(cat /proc/meminfo | egrep "MemTotal:" | awk '{print;}'); awk НАЧАЛО 1>/var/tmp/check_generic/check_generic_stdout_77319.64001 2>/var/tmp/check_generic/check_generic_stderr_77319.23364'
slab_mem НЕИЗВЕСТНО - результат:RC1 вывод: match:RC!=OK |slab_mem=;50.000000;80.000000;;

Я обнаружил, что побег ( и ) может заставить его работать, но это не так, тогда выдает эту ошибку:

-bash-4.1$ /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=$$\(cat /proc/meminfo | egrep "Slab:" | awk '{print $$2; }'\); MEMTOTAL=$$\(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'\); awk "НАЧАЛО {print 100*$$SLAB/$$MEMTOTAL}" " -w '>50' -c '>80' -p "slab_mem"
sh: /proc/meminfo: Отказано в доступе
awk: {печать 749962;})
awk: ^ синтаксическая ошибка
sh: /proc/meminfo: Отказано в доступе
awk: {печать;})
awk: ^ синтаксическая ошибка

Единственная информация, которую я нашел при попытке прочитать /proc/meminfo, это то, что некоторые люди пытались выполнить его (вместо чтения с помощью кот) Но это не так.

РЕДАКТИРОВАТЬ: Пытаясь убежать $$: Команда:

-bash-4.1$ /usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "SLAB=\$\$\(cat /proc/meminfo | egrep "Slab:" | awk '(print $ $2'\) MEMTOTAL=\$\$\(cat /proc/meminfo | egrep "MemTotal:" | awk '{print $2;}'\); awk "BEGIN {print 100*\$\$SLAB/\$ \$MEMTOTAL}"" -w '>50' -c '>80' -p "slab_mem"

Результат:

sh: /proc/meminfo: Отказано в доступе
awk: {печать;})
awk: ^ синтаксическая ошибка
awk: (напечатать 499542)
awk: ^ синтаксическая ошибка
авк: команд. строка:1: (напечатать 499542)
авк: команд.строка: 1: ^ неожиданный перевод строки или конец строки
slab_mem UNKNOWN - результат: RC1 вывод: match: RC!=OK [awk: cmd. строка: 1: блоки BEGIN должны иметь часть действия]|slab_mem=;50.000000;80.000000;;
Bodo avatar
флаг pt
Предполагая, что вы хотите передать литерал `$` какой-либо другой оболочке и хотите предотвратить расширение локальной оболочкой, вам нужно `\$` вместо `$$`. `$$` — это PID текущего скрипта. См. https://unix.stackexchange.com/q/291570/330217.
флаг cn
`SLAB=76876(cat /proc/meminfo | ...` -- я не уверен, что вы пытаетесь там сделать. Можете ли вы объяснить этот конкретный фрагмент? У меня есть предположение, но я бы хотел, чтобы вы объясните, прежде чем я отвечу.
pLumo avatar
флаг in
Думаю, это должно быть `SLAB=76876$(cat...)`. Вам не хватает `$`.
aldegalan avatar
флаг in
@Bodo Но \$ не работает с удаленным агентом Nagios... должно быть $$
Bodo avatar
флаг pt
@aldegalan Тогда вам может понадобиться `\$\$`.
aldegalan avatar
флаг in
@Bodo в порядке, но все еще получает отказ в разрешении awk: `{print 499542;}) awk: ^ синтаксическая ошибка sh: /proc/meminfo: Отказано в доступе awk: {печать;}) awk: ^ синтаксическая ошибка`
Bodo avatar
флаг pt
@aldegalan Как вы можете видеть в `{print 499542;})`, у вас такая же проблема с цитированием в команде AWK. В `$$2` `$$` заменяется PID скрипта локальной оболочки, за которой следует литерал `2`.(Я не знаком с nagios или плагином check_generic, поэтому я не знаю, нужно ли для этого дополнительное цитирование или дублирование символов `$`.) Ошибка `Отказано в доступе` может быть результатом других способов неправильного цитирования. Пожалуйста, [отредактируйте] свой вопрос и добавьте все измененные версии вашего скрипта/команды с соответствующими сообщениями об ошибках. Используйте копирование и вставку вместо повторного ввода, чтобы избежать несвязанных ошибок.
aldegalan avatar
флаг in
@Bodo Готово, я отредактировал свой вопрос
Bodo avatar
флаг pt
@aldegalan Кажется, проблема с кавычками. Если я правильно понимаю, вы пытаетесь использовать двойные кавычки внутри двойных кавычек. Можете ли вы добавить ссылки на какую-нибудь документацию, объясняющую аргументы `-e` и необходимое цитирование? Я не нашел рабочих ссылок для плагина `check_generic`. Можете ли вы объяснить, что должен делать список команд `SLAB=...`, включающий все команды `awk`? Или откуда этот список команд? Пожалуйста, [отредактируйте] свой вопрос, чтобы предоставить эту информацию.
Bodo avatar
флаг pt
Было бы полезно показать список команд, так как вы запустите его непосредственно в оболочке без использования nagios и некоторых примеров ввода (= вывод `cat /proc/meminfo`) и соответствующий вывод. Правильно ли я понимаю, что вы хотите извлечь два числа из `/proc/meminfo` и вычислить Slab/MemTotal в %? Это может быть реализовано с помощью одной команды `awk`. Информация о том, чего вы хотите достичь, будет принадлежать вопросу. (Ваш вопрос, похоже, касается программирования оболочки и не имеет прямого отношения к Ubuntu, поэтому он может лучше подойти для stackoverflow.com.)
Рейтинг:0
флаг cn
SLAB=76876(cat /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')

оболочка разбирает это на эти слова

SLAB="76876(cat" /proc/meminfo | egrep "Slab:" | awk '{print 768762;}')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ..................... ...................^

Где символы «(cat» являются частью значения временной переменной среды SLAB.

Затем оболочка пытается вызвать /proc/meminfo как команда.

Это оставляет непарную закрывающую скобку, вызывающую синтаксическую ошибку awk.


мне непонятно с какой целью SLAB=$$ и (кот ...) является. Вы пытаетесь установить переменную SLAB для хранения значения, которое объединяет pid и результат кода в скобках?


Мое решение: я бы построил nagios команда по частям:

nagios_cmd=""
для var в Slab MemTotal; делать
    nagios_cmd+=$(printf '%s="${$}$(awk '\''/%s:/ {print $2}'\'' /proc/meminfo)"; ' $var $var)
сделано

nagios_cmd+='awk -v s="$Slab" -v m="$MemTotal" '\''BEGIN {print 100*s/m}'\'

объявить -p nagios_cmd

Это выводит

объявить -- nagios_cmd="Slab=\"\${\$}\$(awk '/Slab:/ {print \$2}' /proc/meminfo)\"; MemTotal=\"\${\$}\ $(awk '/MemTotal:/ {print \$2}' /proc/meminfo)\"; awk -v s=\"\$Slab\" -v m=\"\$MemTotal\" 'BEGIN {print 100*s /м}'"

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

Затем вы вызываете проверку nagios, например:

/usr/lib64/nagios/plugins/check_generic.pl -n "slab_mem" -e "$nagios_cmd" -w '>50' -c '>80' -p "slab_mem"
# ................................................................ ........^^^^^^^^^^^^^^

Это можно записать как одну команду awk без необходимости использования временных переменных оболочки:

nagios_cmd='awk -F":" -v pid="$$" '\''
    $1 == "Плита" {s = pid $2}
    $1 == "Общая память" {m = pid $2}
    КОНЕЦ {печать 100*с/м}
'\'' /proc/meminfo'

Или, чтобы помочь с цитированием, вот документ:

nagios_cmd=$(кот <<'END_CMD'
    awk -F":" -v pid="$$" '
        $1 == "Плита" {s = pid $2}
        $1 == "Общая память" {m = pid $2}
        КОНЕЦ {печать 100*с/м}
    ' /прок/меминфо
END_CMD
)
aldegalan avatar
флаг in
Так как я мог решить это? И да, я пытаюсь объединить pid и результат.

Ответить или комментировать

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