bash: Есть ли способ программно вызывать команды связывания (например, перерисовать текущую строку)?

Согласно Snort Manual v2.9.11 , написанному подThe Snort Project

Чтобы читать пакеты и записывать их на диск, нам нужно указать каталог протоколирования, который, если не указан, по умолчанию создается с именем logв текущем каталоге. Если каталог журнала не настроен в snort, он завершается с сообщением об ошибке.

Итак, вам нужно указать каталог логирования в скрипте initпри запуске самого snort, набрав:

./snort -q -dev -l /path/to/log/file

Теперь сохраните сценарий и перезапустите службу.

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

2
16.03.2020, 23:07
1 ответ

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

${PS1@P}

В более новых версиях bash вы можете просто напечатать приглашение самостоятельно с помощью echo "${PS1@P}". Форма раскрытия переменных ${var@P}означает раскрытие escape-символов подсказки внутри переменной.

kill -WINCH "$$"

Еще один трюк, который вы можете попробовать, это убить вашу оболочку с помощью SIGWINCH. Это заставит readline перерисовать подсказку. Пример:

$ (sleep 2; echo foo; sleep 2; kill -WINCH "$$") &
[1] 2295
<immediately press l and s; the "foo" text will mess up the current line>
$ lsfoo
<after 1s the prompt is redrawn again without the parasitic text>
$ ls

ioctl(TIOCSTI)

Еще один трюк заключается в том, чтобы привязать некоторый неиспользуемый ключ к redraw-current-line, как обычно, а затем имитировать этот ключ с помощью TIOCSTIioctl (он по-прежнему работает без дополнительных привилегий на текущем tty в Linux. ). Но для этого вам понадобится C, perl, python и т. д.:

$ bind '"\xff": redraw-current-line'
$ redraw_current_line(){ perl -e 'ioctl STDIN, 0x5412, $x = "\xff"' </dev/tty; }
$ (sleep 2; echo foo; sleep 2; redraw_current_line) &
.... same as in SIGWINCH example...

Этот последний трюк доступен только для Linux -; номер ioctl для TIOCSTIв другой системе, которая может его поддерживать, отличается.


Обратите внимание,:если кто-то считает, что я должен require "sys/ioctl.h"вместо того, чтобы запрограммировать номер ioctl:Нет, не должен . Даже если это случайно сработает в этом случае, perl h2phне работает, и файлы .phне должны не использоваться:

$ perl -e 'require "sys/ioctl.ph"; printf "%x\n", TIOCGPTN()'
80005430
$ cc -include stdio.h -include sys/ioctl.h -xc - \
   <<<'int main(){printf("%lx\n",TIOCGPTN);}' -o /tmp/foo && /tmp/foo
80045430

Обратите внимание на дополнительный бит в реальной вещи:80045430!=80005430

6
28.04.2021, 23:20

Теги

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