Создайте .sh, который устанавливает новое имя пользователя, имя хоста и пароль


9

Я раздаю виртуальную машину своим студентам для курса программирования для начинающих. Для скорости, вместо того, чтобы заставить их устанавливать 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

снимок экрана с прогрессом вывода



1
Возможно, я ошибаюсь, но я когда-либо использовал expectинтерактивный процесс и делал его неинтерактивным. В основном, создание сценария с expectопределенным выводом и ответ уже известен в сценарии. Бен хочет дождаться пользовательского ввода и выполнить команду на его основе. Конечно, я ошибаюсь хотя бы раз в день, так что это может быть так.

На самом деле, я хорош для той части, которая принимает пользовательский ввод. Как только я собрал имя хоста и имя пользователя, они сохраняются как переменные. Немного неприятно после этого. Т.е. от комментария вниз.
Бен

1
В этом методе есть некоторые недостатки. Во-первых, вы не можете изменить текущий путь пользователя, это невозможно. Приглашение bash не обновляется при изменении имени хоста, оно читается только один раз при открытии терминала. Вы могли бы, exec bashно это технически откроет вложенный терминал.

Чтобы исправить вашу проблему с именем хоста, я бы заменил вашу sedна что-то вроде этого. sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts Это обновит строку 127.0.1.1 и просто добавит новый хост к тому, что там есть. Он оставит старый хост на месте, но он совместим с несколькими хостами, назначенными одному IP. Это предотвратит неразрешимую проблему с другой sudoкомандой, меняющей имя хоста.

Ответы:


8

Почему бы просто не использовать для этого установку OEM? Это не так красиво, но это делает работу. Если вы хотите пойти по этому пути, посмотрите отличный ответ izx на этот вопрос: Как мне предварительно установить Ubuntu для кого-то (установка OEM)?

По сути, система (при первой загрузке) запрашивает у пользователя кучу информации для персонализации своего компьютера. Это включает язык, местоположение, имя пользователя, имя хоста, пароль и так далее. В основном все, что ваш компьютер обычно запрашивает у вас для установки.

Это именно то , для чего предназначены OEM-образы, и они отлично справляются с этим. Кроме того, вы дадите своим студентам небольшой опыт «установки Ubuntu». Хотя установка Ubuntu не совсем болезненна. Вероятно, вы можете сделать это в одном классе и дать вашим ученикам домашнее задание, чтобы персонализировать и изучить их виртуальную машину. Кроме того, разделение - это болезненное удовольствие!


Вернемся к проблеме (и ответу на ваш актуальный вопрос) .....

Давайте посмотрим, man usermodчтобы получить объяснение того, что происходит:

ПРЕДОСТЕРЕЖЕНИЯ
   Вы должны убедиться, что указанный пользователь не выполняет никаких
   обрабатывается, когда эта команда выполняется, если числовой пользователь
   идентификатор пользователя, имя пользователя или домашний каталог пользователя
   изменилось. usermod проверяет это в Linux, но только проверяет, является ли пользователь
   залогинился в соответствии с utmp на других архитектурах.

По сути, это просто означает, что мы не можем изменить UID пользователя, его имя пользователя, домашний каталог или что-либо в этом роде, если пользователь вошел в систему.

Итак, мы можем сделать несколько забавных вещей, чтобы настроить это при следующей загрузке системы. Вместо того, чтобы ваш скрипт выполнял свою работу, мы заставляем ваш скрипт создавать другой скрипт, который будет выполнять всю тяжелую работу и манипуляции. Пример этого:

# Make the first-run script
touch /etc/init.d/firstrun-setup.sh

# Add in user modifier
echo "usermod -d /home/$username -m -g $username -l $username ben" >> /etc/init.d/firstrun-setup.sh

# Add in group rename
echo "groupmod -n $username ben" >> /etc/init.d/firstrun-setup.sh

# Add in password expiry
echo "passwd -e $username" >> /etc/init.d/firstrun-setup.sh

# Add in file self-destruct
echo "rm /etc/init.d/firstrun-setup.sh" >> /etc/init.d/firstrun-setup.sh

# Mark the file as executable
chmod a+x /etc/init.d/firstrun-setup.sh

# Reboot the computer
reboot

По сути, делая это, вы «ставите в очередь» события для запуска при следующей загрузке системы. Это будет выполнено до того, как произойдет пользовательская область, поэтому система выполнит эти команды от имени пользователя root. Следовательно, benпользователь не будет авторизован, и система не будет жаловаться.

Вам все еще может понадобиться добавить дополнительные команды к этой вещи, чтобы обеспечить большую персонализацию (например, установить фактическое имя и т. Д.). Тем не менее, это необязательно и должно быть сделано только в том случае, если вы хотите, чтобы это произошло во время сценария установки.

Тем не менее, может быть хорошей идеей будет просто создать нового пользователя для учеников целиком, а затем сохранить существующую жертвенную учетную запись. Таким образом, если что-то случится, вы можете зайти и отремонтировать / администрировать их машину, если это вообще необходимо. Конечно, если вы предоставляете своим студентам доступ администратора к своей виртуальной машине, это своего рода спорный вопрос, поскольку они вполне могут удалить пользователя «инструктора», потому что они студенты.


Я намеревался предложить «сделать OEM-установку», и тогда я нашел этот ответ :-)
sudodus

Спасибо за ответ на основной вопрос о том, как достичь своей цели, я собираюсь пойти с установкой OEM.
Бен

0

На экране входа в систему, нажмите ctrlaltF2и войдите в систему как benс терминала, который открывается и запускается

sudo passwd

И дайте им все тот же пароль для root, т.е. номер курса, так что если что-то сломается, вы можете пойти и исправить это. Затем попросите их выйти из системы, введя exitпароль, и войдите в систему как пользователь root с новым паролем root и запустите сценарий (возможно, вам придется изменить его, чтобы он изменил benпользователя, а не пользователя root).

Или попросите их войти в систему как ben с терминала, нажав ctrlaltF2(как прежде) на экране входа в систему, а затем запустите скрипт оттуда. Это может сработать, поскольку, как указывали в предыдущем ответе Муру и Каз Вулф , пользователь не может запускать какие-либо процессы, и вход в систему через терминал не должен запускать какие-либо процессы, такие как Xили Ubuntu-Desktop, или другие процессы пользовательской среды, которые мешают работе usermod. (Я не знаю, работает ли это, я не пробовал, но стоит попробовать).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.