Я знаю, что это старый вопрос, но я предложу другой подход на тот случай, если кто-то сочтет его полезным. Первоначально я разместил это как ответ на вопрос, который был обманут на этот.
Одним из вариантов является использование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
, если она вам больше нравится.
Что может произойти :, когда ssh
вызывается без аргумента команды (и без указания параметра RemoteCommand
), псевдо-терминал -выделяется по умолчанию в удаленной системе для сеанса. Это происходит независимо от команды, на выполнение которой настроена удаленная система. Псевдо-терминал -обычно настраивается для перевода символов перевода строки в последовательности возврата каретки + перевода строки(LF
→ CRLF
, см. этот ответ для подробного объяснения ). Следовательно, вывод вашего скрипта записывается на терминальное устройство псевдо -, которое изменяет его, а затем отправляется на сторону клиента.
Выделение псевдотерминала -можно предотвратить несколькими способами, включая:
вызов 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 :
); хотя я бы посчитал это не более чем обходным путем ).
Конечно, наиболее подходящий вариант зависит от вашего варианта использования и, в частности, от того, должен ли пользователь иметь право выбора.
См. также: