Не знаю, как насчёт линуха, но во фре в chsh никакого списка нет. Можете указать в качестве оболочки что угодно.
Также есть команда usermod, которой тоже можно в качестве оболочки прописать что угодно. Хотя б даже и шельный скрипт. У меня сделан тупой терминал, чисто для подключения по SSH и проброса портов внутрь локалки. В качестве шелла для подключающегося пользователя указан скрипт следующего содержания:
#!/bin/sh
main() {
echo
echo
echo
echo
echo
echo
echo
echo
echo "Dumb terminal enabled"
while true; do
sleep 5
done
}
# Assign noop for Ctrl+C and run main
trap true INT
main $@
Соответственно, этот скрипт просто крутится со sleep 5 и не даёт выйти по Ctrl-C. Но точно также в цикл ожидания можно повесить ожидание какого-либо ввода от пользователя, с последующей обработкой этого ввода по case на предмет -- нужные это команды или нет. Если ненужные, то слать, если нужные -- выполнять с необходимыми параметрами.