Сценарий Bash не записывается

Помимо входа в систему, нет надежного способа отслеживать / регистрировать действия пользователей после входа в систему, предполагая, что у них есть базовые знания Linux, они смогут отключить ведение журнала оболочки или просто запустить команды из других оболочек (например, python).

Вместо этого вы должны быть консервативны относительно предоставления доступа ssh, действительно ли они действительно нужны? Не очень часто предоставляется доступ к SSH, если вы не находитесь в оболочке, предоставляющей бизнес.

1
задан 14 February 2016 в 23:35

2 ответа

В общем случае для регистрации вывода всего скрипта перенаправляет вывод всего скрипта:

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)
4
ответ дан 23 May 2018 в 13:32

Нет необходимости в скрипте, просто сделайте это в одной строке, используя перенаправления 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, вы можете добавить его в файл.
3
ответ дан 23 May 2018 в 13:32
  • 1
    О скрипте я обычно делаю это на терминале. Я использую сценарий просто для немного удовольствия и для изучения некоторых вещей. Но спасибо за примечание о переадресации STERR и STDOUT в тот же файл, не знаю, я мог бы это сделать. – macacomen98 15 February 2016 в 00:01
  • 2
    Поскольку вы там, вы также можете удалить tee: (sudo apt-get update && sudo apt-get upgrade) >output.txt 2>&1. И если вы хотите пойти еще дальше, вы также можете избежать появления подоболочки: { sudo apt-get update && sudo apt-get upgrade; } >output.txt 2>&1;) – kos 15 February 2016 в 03:08
  • 3
    У Bash есть |& для 2>&1 |. – muru 15 February 2016 в 03:21
  • 4
    @kos Я сохраняю tee, потому что обычно люди все еще хотят видеть, что делает команда. Но фигурные скобки кажутся улучшением. – Byte Commander 15 February 2016 в 11:22
  • 5
    @ macacomen98 ./file.txt или bash file.txt – muru 15 February 2016 в 22:14

Другие вопросы по тегам:

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