Почему rsyslog не отображается при запуске службы?

Вот частичное решение, я разочаровался, заставив вводить скрипт netcat.

  1. Как мне тогда искать конкретно шестнадцатеричную строку?

Вот один простой способ:

$ nc -d cs2107.spro.ink 9000> file

Welcome to the Proof of Work Challenge.
Rules: I will provide hex encoded byte strings to you.
Your task is to decode it and calculate the md5 hash.
Return the md5 hash in hex encoded format back to me.
You will need to do this 500 times.
Ready? Go!
eeb105fb2f5e24216bd2
MD5:

Здесь изначально был ] sed , которая выбрала конкретную строку №7, но после решения первой строки байтов в шестнадцатеричной кодировке немедленно выдается следующий вывод. Поэтому я просто заменил это регулярным выражением, которое соответствует шестнадцатеричным символам:

$ cat file.txt | grep '^ [a-f0-9]'

eeb105fb2f5e24216bd2
  1. Как мне декодировать шестнадцатеричную строку?

$ cat file.txt | grep '^ [a-f0-9]' | xxd -r -p | md5

92b34e4055a92b9ec32b15f89cc22389

Итак, я получил подтверждение, что это работает вручную:

Welcome to the Proof of Work Challenge.
Rules: I will provide hex encoded byte strings to you.
Your task is to decode it and calculate the md5 hash.
Return the md5 hash in hex encoded format back to me.
You will need to do this 500 times.
Ready? Go!
eeb105fb2f5e24216bd2
MD5: 92b34e4055a92b9ec32b15f89cc22389
Correct.
9ecbc2b8d14ae903dce5
  1. И, наконец, как мне вернуть результат обратно в терминал?

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

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

  1. цикл for, итерация 500 раз. РАБОТАЕТ.
  2. поддерживать соединение с: cs2107.spro.ink 9000. В ПРОЦЕССЕ.
  3. читать биты, отправленные сервером. РАБОТАЕТ.
  4. декодировать шестнадцатеричную строку. РАБОТАЕТ.
  5. вычислить хэш MD5. РАБОТАЕТ.
  6. отправить ввод для открытия соединения. В ХОДЕ ВЫПОЛНЕНИЯ.
  7. повторите шаги 3-6.
  8. конец.

Вот некоторые ресурсы, которые я пробовал

  1. Использование именованных каналов ввода / вывода для TCP-соединения
  2. https://serverfault.com/questions/188936/writing-to-stdin-of-background-process/297095 # 297095
  3. https://stackoverflow.com/questions/21130757/send-commands-to-socket-using-netcat
  4. https://superuser.com/questions/261900/how-can-i-pipe -commands-to-a-netcat-that-will-stay-alive
  5. -shell-function
  6. http://www.linuxquestions.org/questions/programming-9/dynamically-supply-input-to-netcat-in-a-script-793526/

Мне было бы любопытно узнать решение, если вы его узнаете. Может, попробую позже.

1
02.05.2017, 20:30
1 ответ

Не из командной строки, а, возможно, из другого сценария инициализации. В старые недобрые времена команда типа

 $ sudo bash -c "find / -xdev -type f -print0 -size -1M | xargs -0 grep rsyslog"

или, что более вероятно,

$ sudo bash
# find / -xdev -type f -print0 -size -1M | xargs -0 grep rsyslog

будет просматривать все файлы в системе в поисках простых файлов, содержащих нужную строку. Параметр -mount в find не позволяет ему находиться в /proc, и в наши дни grep достаточно умен, чтобы заметить, когда файл выглядит как двоичный файл, содержащий строку. -print0 и опция -0 для xargs работают вместе и гарантируют правильную обработку файлов с нечетными символами, например пробелами, которые в противном случае могли бы запутать парсер. И "-size -1M" гарантирует, что просматриваются только файлы размером один мегабайт или меньше - файлы большего размера вряд ли вас интересуют - rsyslog, скорее всего, будет запущен из сценария.

Есть еще одна возможность, конечно, и это то, что программа запускается удаленно. Я легко могу представить, как кто-то запускает rsyslog из сценария ssh, привязанного к определенному ключу, который делает только это, он может даже не позволить вам получить оболочку, суть в том, что вы запускаете syslogd, когда машина, которая должна получить системные журналы там, чтобы взять их.

Такая команда, как pstree, может показать вам, что является дочерним, и хотя легко можно выйти из-под своего родителя, чтобы вы были унаследованы init,

1
27.01.2020, 23:45

Теги

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