Помимо входа в систему, нет надежного способа отслеживать / регистрировать действия пользователей после входа в систему, предполагая, что у них есть базовые знания Linux, они смогут отключить ведение журнала оболочки или просто запустить команды из других оболочек (например, python).
Вместо этого вы должны быть консервативны относительно предоставления доступа ssh, действительно ли они действительно нужны? Не очень часто предоставляется доступ к SSH, если вы не находитесь в оболочке, предоставляющей бизнес.
В общем случае для регистрации вывода всего скрипта перенаправляет вывод всего скрипта:
exec &> some.log
# Or, when using `/bin/sh`:
# exec >some.log 2>&1
Встроенная функция exec часто используется для изменения дескрипторов открытых файлов или добавления новых файловые дескрипторы (источники и адресаты ввода и вывода) для оболочки.
Например, данный example.sh:
#! /bin/bash
exec &> some.log
ls foo
echo foo
При запуске:
$ ./example.sh
$ cat some.log
ls: foo: No such file or directory
foo
Если вы хотите, чтобы оба вывода отображались на экране и в файл, используйте tee с заменой процесса:
exec &> >(tee some.log)
Нет необходимости в скрипте, просто сделайте это в одной строке, используя перенаправления Bash и tee:
{ sudo apt-get update && sudo apt-get upgrade ; } |& tee output.txt
Если вы хотите добавить вывод в существующий файл журнала, добавьте -a после tee.
Чтобы объяснить, что он делает:
{ ... ; } группирует команды ... внутри, так что выходные перенаправления мы будем выполнять действия применимы ко всем командам, а не только к последней. Пожалуйста, обратите внимание на пространство после { и до }, а также на точку с запятой ; после всех команд! (спасибо @kos за то, что я сказал, чтобы я не разгадал подоболочку) sudo apt-get update && sudo apt-get upgrade - это примеры команд, которые мы хотим запустить и записать здесь. Вы можете обменять эту часть на все, что захотите. |& («труба») перенаправляет оба выходных потока (STDERR / стандартная ошибка и STDOUT / стандартный вывод) команды слева от него на STDIN (стандартный ввод) команды справа. (спасибо @muru за то, что он научил меня & перенаправлять как STDOUT, так и STDERR) tee output.txt копирует все, что он читает, от STDIN до STDOUT, а также сохраняет его на output.txt. Если целевой файл уже существует, он будет перезаписываться молча. Если вы используете tee -a output.txt, вы можете добавить его в файл.