我正在为我的学生分发一台虚拟机,用于初学者编程课程。为了加快速度,我计划给他们一个完全安装好的映像,让他们可以直接运行,而不是让他们从头开始安装 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
为什么不直接使用 OEM 安装呢?虽然不太美观,但可以完成工作。如果您想走这条路,请参阅 izx 对此问题的出色回答:如何为某人预安装 Ubuntu(OEM 安装)?
基本上,系统会(在首次启动时)提示用户输入一些信息来个性化他们的机器。这包括语言、位置、用户名、主机名、密码等等。基本上,您的计算机通常会提示您输入安装所需的所有内容。
这是确切地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
基本上,通过这样做,您将“排队”事件以在系统下次启动时运行。这将在用户空间发生之前运行,因此系统将以 root 身份执行这些命令。因此,用户ben
将不会登录,系统也不会抱怨。
您可能仍需要向此内容添加其他命令以允许更多个性化设置(例如设置实际名称等)。但是,这是可选的,只有当您希望它在安装脚本期间进行时才需要执行。
不过,为学生创建一个新用户,然后保留现有的牺牲帐户可能是一个好主意。这样,如果发生什么事情,你可以进入并修复/管理他们的机器(如果有必要)。当然,如果你让你的学生拥有对他们的虚拟机的管理员访问权限,那么这是一个没有实际意义的问题,因为他们很可能会删除“讲师”用户,因为他们是学生。
答案2
在登录屏幕上,让他们按下ctrlaltF2并ben
从打开的终端登录并运行
sudo passwd
并给他们相同的 root 密码,即课程编号,这样如果出现问题,您可以进入并修复它。然后让他们通过键入 注销exit
,并使用他们的新 root 密码以 root 身份登录并运行脚本(您可能需要对其进行修改,以便更改用户ben
而不是 root)。
或者,让他们从终端以 ben 身份登录,方法是ctrlaltF2在登录屏幕上按下(像以前一样),然后让他们从那里运行脚本。这可以奏效,因为穆鲁和卡兹·沃尔夫在前面的答案中指出,用户不能运行任何进程,并且通过终端登录不应该启动任何进程,例如X
或Ubuntu-Desktop
,或其他干扰 的用户空间进程usermod
。(我不知道这是否有效,我还没有尝试过,但值得一试)。