新しいユーザー名、ホスト名、パスワードを設定する.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特定の出力を行うスクリプトを作成し、そのスクリプトで応答が既知であること。ベンは、ユーザー入力を待ち、それに基づいてコマンドを実行したいと考えています。確かに、私は少なくとも1日に1回は間違っているので、これは事実かもしれません。

実際、私はユーザー入力を受け取る部分に適しています。ホスト名とユーザー名を収集すると、変数として保存されます。面倒なのはその後です。つまりコメントダウンから。
ベン

1
この方法にはいくつかの欠点があります。1つは、現在のユーザーパスを変更することはできません。それは不可能です。ホスト名が変更されてもbashプロンプトは更新されません。ターミナルを開いたときに一度だけ読み込まれます。できますがexec bash、技術的にはネストされたターミナルを開きます。

ホスト名の問題を修正するにはsed、次のように置き換えます。sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts これにより、127.0.1.1行が更新され、そこに新しいホストが追加されます。古いホストはそのまま残りますが、1つのIPに複数のホストを割り当てることは準拠しています。これsudoにより、ホスト名を変更する他のコマンドで解決できない問題が回避されます。

回答:


8

これにOEMインストールを使用しないのはなぜですか?それほどきれいではありませんが、仕事は完了です。この方法を使いたい場合は、この質問に対するizxの優れた回答を参照してください。Ubuntu を誰かにプレインストールするには(OEMインストール)?

基本的に、システムは(最初の起動時に)マシンをパーソナライズするための一連の情報をユーザーに要求します。これには、言語、場所、ユーザー名、ホスト名、パスワードなどが含まれます。基本的に、コンピューターが通常、インストールを求めるすべてのメッセージを表示します。

これがまさに OEMイメージの目的であり、OEMイメージは非常に優れています。さらに、「Ubuntuのインストール」体験を学生に少し味わってもらいます。しかし、Ubuntuのインストールはそれほど苦痛ではありません。おそらく1つのクラスでそれを行うことができ、生徒に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

そして、それらすべてにルートの同じパスワード、つまりコース番号を与えるので、何かが壊れた場合は、それを修正することができます。次にexit、と入力してログアウトし、新しいrootパスワードを使用してrootとしてログインし、スクリプトを実行します(benrootではなく、ユーザーを変更するように変更する必要がある場合があります)。

または、ctrlaltF2ログイン画面で(前と同じように)を押して端末からbenとしてログインし、そこからスクリプトを実行するように依頼します。これは仕事ができるMuruカズウルフは前の回答で指摘し、ユーザーが任意のプロセスを実行することはできない、と端末経由でのロギングはどのようなプロセスを、開始してはならないXUbuntu-Desktop、またはを妨害する他のユーザーランドプロセスをusermod。(これが機能するかどうかはわかりませんが、試したことはありませんが、試してみる価値はあります)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.