Ben*_*Ben 9 password hostname username
我正在为我的学生分发一个 VM,用于初学者编程课程。为了速度,我不是让他们从头开始安装 Ubuntu,而是计划给他们一个完整设置的映像,他们可以直接运行。
为了设置它,我给了它一个牺牲的主机名、用户名和密码。当学生开始并运行时,为他们改变这一点的最干净的方法是什么?
我已经掌握了这个gist,它在主机名上有一些不可靠的进展,但是用户名阻止我改变它。
我希望这个过程尽可能轻松,因为这应该发生在他们的第一个实验室。
完全有可能我应该采取一种完全不同的方法。我愿意接受所有建议。
#!/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
Run Code Online (Sandbox Code Playgroud)
为什么不为此使用 OEM 安装?它不那么漂亮,但它完成了工作。如果您想沿着这条路线走下去,请参阅 izx 对这个问题的出色回答:How do I pre-install Ubuntu for someone (OEM install)?
基本上,系统会(在第一次启动时)提示用户输入一堆信息来个性化他们的机器。这包括语言、位置、用户名、主机名、密码等。基本上,您的计算机通常会提示您进行安装的所有内容。
这正是OEM 映像的意义所在,并且它们做得很好。此外,您还可以让您的学生体验“安装 Ubuntu”的体验。不过,Ubuntu 的安装并不是很痛苦。您可能可以在一个班级中完成,并给您的学生一些家庭作业来个性化和探索他们的 VM。另外,分区是痛苦的乐趣!
回到手头的问题(以及对您实际问题的回答).....
让我们看一下man usermod来解释发生了什么:
警告 您必须确保指定的用户没有执行任何 如果用户的数字在执行此命令时进行处理 用户 ID、用户名或用户的主目录正在被 改变了。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
Run Code Online (Sandbox Code Playgroud)
基本上,通过这样做,您将“排队”事件以在系统下次启动时运行。这将在用户空间发生之前运行,因此系统将以 root 身份执行这些命令。因此,ben用户不会登录,系统也不会抱怨。
您可能仍然需要向这个东西添加额外的命令以允许更多的个性化(比如设置实际名称等)。但是,这是可选的,仅当您希望它在安装脚本期间发生时才需要完成。
不过,完全为学生创建一个新用户可能是个好主意,然后保留现有的牺牲帐户。这样,如果发生什么事,您可以在必要时进入并维修/管理他们的机器。当然,如果您授予学生管理员访问他们的 VM 的权限,这有点没有实际意义,因为他们很可能会删除“讲师”用户,因为他们是学生。