Другой подход - отключить мышь и клавиатуру (предполагая систему с USB-устройствами ввода):
00 23 * * * rmmod usbhid
00 7 * * * modprobe usbhid
Это не помешает вам выключить и снова включить систему, что снова включит клавиатуру и мышь... Если вы хотите предотвратить это, вы можете включить модуль в черный список, но вам, вероятно, придется каждый раз перестраивать initramfs (usbhid
должен быть загружен очень рано во время загрузки, поскольку вы хотите иметь рабочую клавиатуру, чтобы исправить ситуацию, когда система не может загрузиться).
Если usbhid
встроен в ядро вашей системы (например, Fedora), вы можете добиться того же эффекта, отвязав все HID-устройства; сложнее всего будет перепривязать их в 7 утра - вам нужно будет где-то хранить драйверы, от которых они были отвязаны (если нет способа их перечислить). Чтобы отвязать все устройства:
for device in /sys/bus/hid/devices/*; do
echo ${device##*/} > ${device}/driver/unbind
done
(с соответствующей проверкой ошибок, конечно). Для повторной привязки нужно вспомнить, на какой драйвер указывал ${device}/driver
, и echo
идентификатор устройства для bind
в каталоге драйвера.
И текущий рабочий каталог, и корень сбрасываются в корневую файловую систему введенного пространства имен монтирования.
Например, я проверил, что могу избежать chroot
, запустив nsenter -m --target $$
.
(Напоминание:chroot
легко скрыть, если вы все еще являетесь пользователем root. man chroot
документирует хорошо -известный способ сделать это ).
https://elixir.bootlin.com/linux/latest/source/fs/namespace.c?v=4.17#L3507
static int mntns_install(struct nsproxy *nsproxy, struct ns_common *ns)
{
struct fs_struct *fs = current->fs;
Примечание:current
означает текущую задачу -текущего потока/процесса.
->fs
будут данными файловой системы этой задачи. -они совместно используются задачами, являющимися потоками одного и того же процесса. Например. ниже вы увидите, что изменение рабочего каталога — это операция на ->fs
.
. изменение рабочего каталога влияет на все потоки одного и того же процесса. Подобные потоки, совместимые с POSIX -, реализуются с использованием флага CLONE _FS клона ().
struct mnt_namespace *mnt_ns = to_mnt_ns(ns), *old_mnt_ns;
struct path root;
int err;
...
/* Find the root */
err = vfs_path_lookup(mnt_ns->root->mnt.mnt_root, &mnt_ns->root->mnt,
"/", LOOKUP_DOWN, &root);
вот строка, о которой идет речь:
/* Update the pwd and root */
set_fs_pwd(fs, &root);
set_fs_root(fs, &root);
...
}
...
const struct proc_ns_operations mntns_operations = {
.name = "mnt",
.type = CLONE_NEWNS,
.get = mntns_get,
.put = mntns_put,
.install = mntns_install,
.owner = mntns_owner,
};