Перенаправить вывод ssh на конец строки изменения файла

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

Одним из вариантов является использованиеsysdig:открытого -приложения для мониторинга системы. Используя его, вы можете отслеживать активность файла по имени. Предположим, вы хотите увидеть, какой процесс создает файл с именем/tmp/example.txt:

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

Из этого вывода видно, что процесс с именем touchи pid 5470 открыл файл.

Если вам нужна дополнительная информация, вы можете запустить «режим захвата», в котором собирается трассировка системных вызовов:

# sysdig -w /tmp/dumpfile.scap

Затем дождитесь создания файла, затем остановите sysdigи запустите:

# csysdig -r /tmp/dumpfile.scap

Это позволит вам изучить все, что произошло. Вы можете нажать <F2>и выбрать Files, нажать <F4>, чтобы найти имя файла, затем нажать <F6>, чтобы «копать» (, что покажет вам вывод, аналогичный приведенной выше команде ). При этом вы можете использовать тот же подход для поиска информации о процессе, который фактически создал файл.

Существует версия csysdigс графическим интерфейсом под названием sysdig-inspect, если она вам больше нравится.

4
14.04.2021, 14:06
1 ответ

Что может произойти :, когда sshвызывается без аргумента команды (и без указания параметра RemoteCommand), псевдо-терминал -выделяется по умолчанию в удаленной системе для сеанса. Это происходит независимо от команды, на выполнение которой настроена удаленная система. Псевдо-терминал -обычно настраивается для перевода символов перевода строки в последовательности возврата каретки + перевода строки(LFCRLF, см. этот ответ для подробного объяснения ). Следовательно, вывод вашего скрипта записывается на терминальное устройство псевдо -, которое изменяет его, а затем отправляется на сторону клиента.

Выделение псевдотерминала -можно предотвратить несколькими способами, включая:

  • вызов sshс опцией -Tна стороне клиента (или использование RequestTTY noв конфигурационном файле ssh(вероятно~/.ssh/config));

  • в началеno-pty (обратите внимание на пробел )перед ключом пользователя в authorized_keysв удаленной системе;

  • использование PermitTTY noв конфигурации SSH-сервера в удаленной системе (возможно /etc/ssh/sshd_config), вероятно использование Matchусловного блока, чтобы он влиял только на конкретного пользователя ); например:

    Match User="username"
      ForceCommand /path/to/your/script
      DisableForwarding yes
      PermitTTY no
    

    (, который предполагает, что рабочий интерпретатор команд установлен для пользователя в /etc/passwd; затем вы можете заблокировать пароль пользователя и убедиться, что у него нет других способов входа в систему );

  • (в вашем случае вызов sshс аргументом команды тоже должен работать (, например.ssh user@host :); хотя я бы посчитал это не более чем обходным путем ).

Конечно, наиболее подходящий вариант зависит от вашего варианта использования и, в частности, от того, должен ли пользователь иметь право выбора.

См. также:

5
28.04.2021, 22:52

Теги

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