我正在为初学者编程课程的学生分发一个虚拟机。为了提高速度,我计划给他们一个完全设置好的镜像,而不是让他们从头开始安装Ubuntu。
为了进行设置,我已经给它一个牺牲性的主机名、用户名和密码。当学生们开始运行时,最干净的方法是如何更改这些信息呢?
我已经做到了这一步gist,在主机名方面有一些不可靠的进展,但用户名却不愿意改变。
我希望这个过程尽可能地无痛苦,因为这应该是他们第一次实验。
完全有可能有一个完全不同的方法,我对所有建议都持开放态度。
为了进行设置,我已经给它一个牺牲性的主机名、用户名和密码。当学生们开始运行时,最干净的方法是如何更改这些信息呢?
我已经做到了这一步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
expect
- http://www.admin-magazine.com/Articles/Automating-with-Expect-Scripts - Pantherexpect
来将交互式进程变为非交互式。基本上,就是创建一个脚本,期望某些输出,并在脚本中已经知道如何响应。Ben想要等待用户输入并根据输入执行命令。当然,我每天至少会犯一次错误,所以这可能是个例外情况。 - user508889exec bash
,但实际上它会打开一个嵌套的终端。 - user508889sed
命令替换为以下内容:sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts
。这将更新 127.0.1.1 行,并在原有内容后追加新的主机名。它会保留旧的主机名,但是允许将多个主机名分配给一个 IP 是符合规范的。这样可以避免您使用其他sudo
命令更改主机名时出现无法解析的问题。 - user508889