Находясь в контейнере, у вас может не быть полной поддержки функций базовой операционной системы; такое поведение является преднамеренным, поскольку вы хотите иметь более безопасную и ограниченную среду для определенной цели.
Таким образом, для журналов MySQL вам может потребоваться войти в базу данных / таблицы MYSQL.
Для версии 5.x и новее (5.1, 5.2, не могу запомнить) SQL поддерживает ведение журнала в базу данных / таблицы MySQL, а не в файлы, и по умолчанию поставляется с двумя уже созданными таблицами, mysql.general_log
и mysql.slow_log
.
Чтобы настроить их использование, выполните:
Добавление в /etc/mysql/my.cnf
:
[mysqld]
slow-query-log
general_log=1
log-output=TABLE
А затем перезапустите mysql.
Чтобы создавать резервные копии каждый день, вы можете запустить систему с доступом для запроса базы данных:
mysqldump mysql general_log --lock-tables=0 > general_log_errors.db
mysqldump mysql slow_log --lock-tables=0 > slow_log_errors.db
(Вам нужно использовать lock-tables = 0, иначе вы получите сообщение об ошибке:
mysqldump: Got error: 1556: You can't use locks with log tables. when doing LOCK TABLES
)
А затем выполните следующие запросы, чтобы очистить таблицы.
TRUNCATE TABLE mysql.general_log;
TRUNCATE TABLE mysql.slow_log;
Это общая идея. Возможно, вы захотите вести журналы за последние несколько дней, и поэтому запросы MySQL TRUNCATE / DELETE будут более сложными.
Таблицы должны быть там по умолчанию, возможно, они были очищены в том образе докера.
Таким образом, для v5.7 вы можете создать их с помощью:
CREATE TABLE IF NOT EXISTS `general_log` (
`event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`command_type` varchar(64) NOT NULL,
`argument` mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log';
CREATE TABLE IF NOT EXISTS `slow_log` (
`start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`user_host` mediumtext NOT NULL,
`query_time` time(6) NOT NULL,
`lock_time` time(6) NOT NULL,
`rows_sent` int(11) NOT NULL,
`rows_examined` int(11) NOT NULL,
`db` varchar(512) NOT NULL,
`last_insert_id` int(11) NOT NULL,
`insert_id` int(11) NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`sql_text` mediumblob NOT NULL,
`thread_id` bigint(21) unsigned NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log';
Дополнительная литература: Запись журналов в таблицы
Что касается создания файла error_file: / var / log может даже не существовать в вашем докере файл. Если этих двух описанных выше параметров ведения журнала недостаточно, вы можете создать файл для тестирования в каталоге, принадлежащем пользователю MySQL; один из таких каталогов, где находится MySQL, обычно / var / lib / mysql.
Короткий ответ - нет, сервер примет любой действительный логин с точки зрения сервера.
Однако есть несколько возможных обходных возможностей для достижения того, что вы хотите. Проверьте и посмотрите, соответствует ли следующее вашим потребностям.
Обратите внимание, что этого может быть достаточно для «средних» пользователей и требует, чтобы вы также контролировали клиентов. Опытные пользователи найдут способ подделать переменную CLIENTUSER
, используемую ниже.
Используя директиву AcceptEnv
в /etc/ssh/sshd_config
, вы можете принять, например, переменную с именем CLIENTUSER:
AcceptEnv CLIENTUSER
Следующим шагом является принудительное использование команды входа пользователей в оболочку входа, например:
ForceCommand /bin/bash -l
Перезапустите службу sshd и добавьте следующее в /etc/profile
if [ -z "$CLIENTUSER" ] || [ "$CLIENTUSER" != "user3" ] && [ ! -z "$SSH_CLIENT" ]
then
echo 'Client logon not allowed'
logout
fi
Вышеуказанное выгоните из системы каждого клиента, который не отправит переменную CLIENTUSER
или не отправит переменную CLIENTUSER
с другим значением, чем user3
.
Вы можете проверить это с помощью следующей клиентской командной строки:
$ ssh user2@host
Client logon not allowed
$ CLIENTUSER=user3 ssh -o "SendEnv CLIENTUSER" user2@host
user2@host $
Как видите, CLIENTUSER
можно легко подделать из командной строки. Чтобы предотвратить это, вы можете добавить следующее в client '/etc/profile:
declare -r CLIENTUSER="$USER"
Когда пользователь попытается изменить значение переменной CLIENTUSER
, он получит следующую ошибку:
bash: CLIENTUSER: readonly variable