制作一个.sh来设置新的用户名,主机名和密码


9

我正在为我的学生分发VM,以进行初学者编程课程。为了提高速度,我没有让他们从头开始安装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具有一定的输出并在脚本中已经知道响应。Ben想要等待用户输入并基于它执行命令。当然,我每天至少错一次,所以可能是这种情况。

实际上,我非常适合需要用户输入的部分。收集主机名和用户名后,它们将存储为变量。麻烦的是在那之后。即从评论下来。

1
这种方法有一些缺陷。第一,您无法更改当前用户的路径,这是不可能的。当主机名更改时,bash提示不会更新,仅在打开终端时才读取一次。您可以,exec bash但是从技术上讲,它将打开嵌套终端。

要解决您的主机名问题,我将用以下内容替换您的主机sedsudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts 这将更新127.0.1.1行,并将新主机附加到那里。它将旧主机保留在原处,但符合将多个主机分配给一个IP的要求。这样可以防止其他sudo命令更改主机名导致无法解决的问题。

Answers:


8

为什么不为此使用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用户将无法登录,系统也不会抱怨。

您可能仍需要向此事物添加其他命令以允许更多的个性化设置(例如设置实际名称等)。但是,这是可选的,仅当您希望在安装脚本期间进行时才需要这样做。

但是,最好为学生完全创建一个新用户,然后保留现有的牺牲帐户,这是一个好主意。这样,如果发生任何事情,您可以在必要时进入并维修/管理他们的机器。当然,如果您要授予学生对他们的VM的管理员访问权限,那么这是一个有争议的问题,因为他们很可能会删除“教师”用户,因为他们是学生。


我打算建议“进行OEM安装”,然后我找到了这个答案:-)
sudodus

感谢您回答了如何达到目标的根本问题,我将进行OEM安装。

0

在登录屏幕上,让他们在打开并运行的终端上按ctrlaltF2并登录ben

sudo passwd

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

或者,通过ctrlaltF2在登录屏幕上按(像以前一样)从终端以Ben 身份登录,然后从那里运行脚本。之所以可行,是因为正如MuruKaz Wolfe在上一个答案中指出的那样,用户不能运行任何进程,并且通过终端登录不应启动任何进程,例如XUbuntu-Desktop或其他干扰用户的进程usermod。(我不知道这是否可行,我还没有尝试过,但是值得一试)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.