编写一个 .sh 文件来设置新的用户名、主机名和密码

编写一个 .sh 文件来设置新的用户名、主机名和密码

我正在为我的学生分发一台虚拟机,用于初学者编程课程。为了加快速度,我计划给他们一个完全安装好的映像,让他们可以直接运行,而不是让他们从头开始安装 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

在登录屏幕上,让他们按下ctrlaltF2ben从打开的终端登录并运行

sudo passwd

并给他们相同的 root 密码,即课程编号,这样如果出现问题,您可以进入并修复它。然后让他们通过键入 注销exit,并使用他们的新 root 密码以 root 身份登录并运行脚本(您可能需要对其进行修改,以便更改用户ben而不是 root)。

或者,让他们从终端以 ben 身份登录,方法是ctrlaltF2在登录屏幕上按下(像以前一样),然后让他们从那里运行脚本。这可以奏效,因为穆鲁卡兹·沃尔夫在前面的答案中指出,用户不能运行任何进程,并且通过终端登录不应该启动任何进程,例如XUbuntu-Desktop,或其他干扰 的用户空间进程usermod。(我不知道这是否有效,我还没有尝试过,但值得一试)。

相关内容