Я раздаю виртуальную машину своим студентам для курса программирования для начинающих. Для скорости, вместо того, чтобы заставить их устанавливать Ubuntu с нуля, я планирую дать им полностью настроенный образ, который они могут просто запустить.
Чтобы настроить его, я дал ему жертвенное имя хоста, имя пользователя и пароль. Какой самый чистый способ изменить это для студентов, когда они встают и бегут?
Я дошел до этой сути , которая имеет некоторый ненадежный прогресс с именем хоста, но имя пользователя не позволяет мне изменить его.
Я бы хотел, чтобы это был как можно более безболезненный процесс, как это должно было произойти в их первой лаборатории.
Вполне возможно, что я должен использовать совершенно другой подход. Я открыт для всех предложений.
#!/bin/bash
clear
toilet " CODE1161 " --metal --font future
echo ""
toilet "Let's get started!" --metal --font future
echo ""
echo "We need to make this computer be YOURS"
echo "We need a name for you and your computer, make it short or it'll take up a lot of space."
echo "My computer is called um and my name is ben, so I get ben@um:~$ as my command prompt."
echo ""
read -p "Enter a name for your computer:" compname
read -p "Enter your name: " username
echo ""
toilet "$username@$compname~$" --gay --font wideterm
echo ""
echo "What do you think? If you hate it, press ctrl+c and do this again"
read -p "otherwise, just press enter." sacrificial
# set the host name, in a million places, for some unknown reason.
echo "1"
sed -i "/127\.0\.1\.1\s*vc/ { c \
127.0.1.1 $compname
}" /etc/hosts
echo "2"
sudo hostname -b $compname
echo "3"
sudo hostnamectl set-hostname $compname
echo "4"
sudo groupadd $username
echo "5"
sudo usermod -d /home/$username -m -g $username -l $username ben
expect
- admin-magazine.com/Articles/Automating-with-Expect-Scriptsexpect
интерактивный процесс и делал его неинтерактивным. В основном, создание сценария сexpect
определенным выводом и ответ уже известен в сценарии. Бен хочет дождаться пользовательского ввода и выполнить команду на его основе. Конечно, я ошибаюсь хотя бы раз в день, так что это может быть так.exec bash
но это технически откроет вложенный терминал.sed
на что-то вроде этого.sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts
Это обновит строку 127.0.1.1 и просто добавит новый хост к тому, что там есть. Он оставит старый хост на месте, но он совместим с несколькими хостами, назначенными одному IP. Это предотвратит неразрешимую проблему с другойsudo
командой, меняющей имя хоста.Ответы:
Почему бы просто не использовать для этого установку OEM? Это не так красиво, но это делает работу. Если вы хотите пойти по этому пути, посмотрите отличный ответ izx на этот вопрос: Как мне предварительно установить Ubuntu для кого-то (установка OEM)?
По сути, система (при первой загрузке) запрашивает у пользователя кучу информации для персонализации своего компьютера. Это включает язык, местоположение, имя пользователя, имя хоста, пароль и так далее. В основном все, что ваш компьютер обычно запрашивает у вас для установки.
Это именно то , для чего предназначены OEM-образы, и они отлично справляются с этим. Кроме того, вы дадите своим студентам небольшой опыт «установки Ubuntu». Хотя установка Ubuntu не совсем болезненна. Вероятно, вы можете сделать это в одном классе и дать вашим ученикам домашнее задание, чтобы персонализировать и изучить их виртуальную машину. Кроме того, разделение - это
болезненноеудовольствие!Вернемся к проблеме (и ответу на ваш актуальный вопрос) .....
Давайте посмотрим,
man usermod
чтобы получить объяснение того, что происходит:По сути, это просто означает, что мы не можем изменить UID пользователя, его имя пользователя, домашний каталог или что-либо в этом роде, если пользователь вошел в систему.
Итак, мы можем сделать несколько забавных вещей, чтобы настроить это при следующей загрузке системы. Вместо того, чтобы ваш скрипт выполнял свою работу, мы заставляем ваш скрипт создавать другой скрипт, который будет выполнять всю тяжелую работу и манипуляции. Пример этого:
По сути, делая это, вы «ставите в очередь» события для запуска при следующей загрузке системы. Это будет выполнено до того, как произойдет пользовательская область, поэтому система выполнит эти команды от имени пользователя root. Следовательно,
ben
пользователь не будет авторизован, и система не будет жаловаться.Вам все еще может понадобиться добавить дополнительные команды к этой вещи, чтобы обеспечить большую персонализацию (например, установить фактическое имя и т. Д.). Тем не менее, это необязательно и должно быть сделано только в том случае, если вы хотите, чтобы это произошло во время сценария установки.
Тем не менее, может быть хорошей идеей будет просто создать нового пользователя для учеников целиком, а затем сохранить существующую жертвенную учетную запись. Таким образом, если что-то случится, вы можете зайти и отремонтировать / администрировать их машину, если это вообще необходимо. Конечно, если вы предоставляете своим студентам доступ администратора к своей виртуальной машине, это своего рода спорный вопрос, поскольку они вполне могут удалить пользователя «инструктора», потому что они студенты.
источник
На экране входа в систему, нажмите ctrlaltF2и войдите в систему как
ben
с терминала, который открывается и запускаетсяИ дайте им все тот же пароль для root, т.е. номер курса, так что если что-то сломается, вы можете пойти и исправить это. Затем попросите их выйти из системы, введя
exit
пароль, и войдите в систему как пользователь root с новым паролем root и запустите сценарий (возможно, вам придется изменить его, чтобы он изменилben
пользователя, а не пользователя root).Или попросите их войти в систему как ben с терминала, нажав ctrlaltF2(как прежде) на экране входа в систему, а затем запустите скрипт оттуда. Это может сработать, поскольку, как указывали в предыдущем ответе Муру и Каз Вулф , пользователь не может запускать какие-либо процессы, и вход в систему через терминал не должен запускать какие-либо процессы, такие как
X
илиUbuntu-Desktop
, или другие процессы пользовательской среды, которые мешают работеusermod
. (Я не знаю, работает ли это, я не пробовал, но стоит попробовать).источник