^ синтаксическая ошибка в awk при вызове через ssh

исправлено добавлением этого в системный журнал -ng.service :После=network.target

https://bugzilla.redhat.com/show_bug.cgi?id=1309345

# cat /usr/lib/systemd/system/syslog-ng.service
[Unit]
Description=System Logger Daemon
Documentation=man:syslog-ng(8)
After=network.target

[Service]
Type=notify
Sockets=syslog.socket
ExecStart=/usr/sbin/syslog-ng -F -p /var/run/syslogd.pid
ExecReload=/bin/kill -HUP $MAINPID
StandardOutput=null
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=syslog.service

0
23.03.2020, 10:39
1 ответ

Проблема в том, что $4в программе awkявляется частью строки в двойных кавычках. Поскольку он заключен в двойные кавычки, оболочка (local )раскроет его перед вызовом ssh.

В оболочке $4— 4-й позиционный параметр, который, скорее всего, пуст. Это означает, что $4в коде awkбудет заменено пустой строкой, что приведет к созданию недопустимой программы awk.

В этом случае нет необходимости запускать команду awkна удаленном хосте. Вместо этого просто выполните

while IFS= read -r remote; do
    ssh -n -o BatchMode=yes "$remote" 'df /var' | awk 'FNR == 2 && $5 > 80'
done </etc/gridhosts

Обратите внимание, что я изменил код awk, чтобы он смотрел на $5в строке 2, а не на $4в каждой строке, так как именно здесь обычно находится процент. Кроме того, я удалил параметр -hдля df, так как он не нужен, и я заставил цикл читать входной файл построчно, а не раскрывать полное содержимое файла в заголовке цикла for. (что неэстетично и может в общем случае потреблять много памяти без необходимости ).

Вам также может быть интересно попробовать Ansible или аналогичное программное обеспечение, так как это значительно упростит выполнение -операций в масштабе кластера.

3
28.04.2021, 23:19

Теги

Похожие вопросы