Comments 6
Вот это красивше будет:
while read -r enable command ; do
case "$command" in
enable | logout | exit | echo ) ;;
* ) enable -n "$command" ;;
esac
done <<<"$( enable )"Но еще проще писать и читать в родных идиомах языка, например:
eval "$( enable | sed '/ \(enable\|logout\|exit\|echo\)$/! s/ / -n /' )"Интересно, как отработает следующая команда? И аналогичные ей.
command ls.old /Первый вариант очень неплохо выглядит, я потом его вставлю в текст. Второй упирается в знание читателя и автора в синтаксис sed редактора, это всё же (на мой взгляд) вещь специфическая, которую, даже имея вышеуказанное знание, читать приходится с определённым усилием. Но в любом случае спасибо, я хотя бы разберусь как вариант через sed работает. Команда command ls.old / в данном случае поведёт себя аналогично ls.old /, что в скрипте (в котором она успешно выполнится), что в оболочке (в которой она не сработает, так как и ls.old и command пользователю недоступны для прямого вызова)
а нельзя внутри самого контейнера отлавливать жрущий процесс и прибивать его? (это я про бомбы)
По идее это технически реализуемо, можно попробовать создать отдельный cgroup для процессов, которые вызывает пользователь, и в ней ограничить потребляемые ресурсы, а также приоритет процессов, добавить пользовательскую оболочку в эту cgroup, задать ей oom приоритет в -1000, а базовый для cgroup'ы приоритет в условные 500, чтобы первыми всегда убивались подпроцессы, а не оболочка. Но тут остаётся одна проблема - разделение сессий, так как пользователь один, то нужно как-то отделять каждую его сессию, чтобы oom-killer не угрохал чужое подключение, и создавать для каждой оболочки свою cgroup. Однако на мой взгляд, это избыточно сложно, когда можно просто переподнять контейнер.
Regex песочница