Нет, это не возможно.
Причина состоит в том, что оболочка читает в блоках файла, поскольку это выполняет его, и блок мог бы содержать код оболочки, который Вы хотите выполнить в другой оболочке, но с тех пор ее уже считанный первой оболочкой, второй наклон оболочки считал его, если это должно было принять выполнение сценария. (Это могло работать, если бы оболочка имела способность к lseek()
файл, но языки оболочки просто не усовершенствованный),
Однако существует грязный способ сделать это; zsh.
zsh назвали команду emulate
который позволяет Вам переключить языки оболочки на лету. Но использование zsh только для эмуляции tcsh и удара просто грязно, не говоря уже о чрезмерно сложном.
.
Также я не сказал бы, что удар более современен. Это более широко распространено уверенный, но это принимает функции в очень медленном темпе. Bash более фокусируется на совместимости, чем что-нибудь.
Да, существует средство ядра: контрольная подсистема. auditd
демон делает вход и команду auditctl
устанавливает регистрирующиеся правила. Можно зарегистрировать все вызовы к определенной системе alls с некоторой фильтрацией. Если Вы хотите зарегистрировать все выполняемые команды и их аргументы, зарегистрироваться execve
системный вызов:
auditctl -a exit,always -S execve
Для специфической трассировки вызова определенной программы добавьте фильтр на исполняемом файле программы:
auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool
Журналы обнаруживаются в /var/log/audit.log
, или везде, где Ваше распределение помещает их. Необходимо быть корнем для управления контрольной подсистемой.
После того как Вы сделаны, занявшись расследованиями, используйте ту же командную строку с -d
вместо -a
удалить регистрирующееся правило или работать auditctl -D
удалить все контрольные правила.
Для отладки целей замена программы сценарием обертки дает Вам больше гибкости для входа вещей как среда, информация о родительском процессе, и т.д.
Вы можете использовать Snoopy .
Snoopy более легкий раствор, поскольку ему не нужно сотрудничество в ядре. Все, что нужно, это динамический погрузчик (DL), который предварительно загружает библиотеку Snoopy, путь к которому указан в /etc/ld.so.preload
.
Раскрытие: я текущий сопровождающий Snoopy.
Подсистема «аудита» ядра Linux может делать то, что вам нужно.
напр. если вы запустите эти команды:
auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve
Затем регистрируется каждое событие выполнения, и множество информации предоставляется вокруг этого
напр. это результат моего бегаtail /var/log/audit/audit.log
exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64): cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67
Можно увидеть некоторые интересные значения; например. «auid» равен 500, это мой идентификатор входа в систему, хотя «uid» равен нулю (, потому что я работаю подsu
). Таким образом, даже если пользователь сменил учетную запись с su
или sudo
, мы все равно можем отследить его «идентификатор аудита»
Теперь эти команды auditctl
будут потеряны при перезагрузке. Вы можете поместить их в файл конфигурации (, например, в каталог /etc/audit/rules.d/
в CentOS 7 ). Точное расположение зависит от версии вашей ОС. Здесь поможет страница руководства auditctl
.
Однако будьте осторожны... это приведет к созданию большого количества сообщений журнала. Убедитесь, что у вас достаточно места на диске!
При необходимости правила могут быть ограничены конкретным пользователем или конкретной командой.
А также остерегайтесь; если пользователь вводит пароль при выполнении команды (, например.mysql --user=username --password=passwd
)то это будет зарегистрировано.
-F path=/ust/bin/rrdtool
? Я не добираюсь какrrdtool
даже связанное программное обеспечение. – Graeme 27.02.2014, 14:28rrdtool
. Если Вы хотите зарегистрировать вызовы всех программ, отбросьте-F path=…
часть (Вы получите много журналов, конечно). – Gilles 'SO- stop being evil' 27.02.2014, 14:37