สร้าง. sh ที่ตั้งชื่อผู้ใช้ชื่อโฮสต์และรหัสผ่านใหม่


9

ฉันแจกจ่าย VM ให้กับนักเรียนของฉันสำหรับหลักสูตรการเขียนโปรแกรมเริ่มต้น สำหรับความเร็วแทนที่จะทำให้พวกเขาติดตั้ง Ubuntu ตั้งแต่ต้นฉันวางแผนที่จะให้ภาพที่พวกเขาสามารถใช้งานได้

เพื่อให้ได้ตั้งค่าฉันได้ให้ชื่อโฮสต์ชื่อผู้ใช้และรหัสผ่านที่เสียสละ อะไรคือวิธีที่สะอาดที่สุดในการเปลี่ยนแปลงสิ่งนี้สำหรับนักเรียนเมื่อพวกเขาลุกขึ้นวิ่ง

ฉันมีเท่าที่นี้สรุปสาระสำคัญซึ่งมีความคืบหน้าไม่น่าเชื่อถือบางคนที่มีชื่อโฮสต์ แต่ชื่อผู้ใช้นี้ resisting ฉันเปลี่ยนมัน

ฉันอยากให้กระบวนการนี้เป็นไปอย่างเจ็บปวดที่สุดเท่าที่จะเป็นไปได้ในห้องทดลองแรกของพวกเขา

เป็นไปได้โดยสิ้นเชิงว่ามีวิธีการที่แตกต่างอย่างสิ้นเชิงที่ฉันควรทำ ฉันเปิดให้คำแนะนำทั้งหมด

#!/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
มีข้อบกพร่องบางอย่างในวิธีนี้ หนึ่งคุณไม่สามารถเปลี่ยนเส้นทางผู้ใช้ปัจจุบันมันเป็นไปไม่ได้ พรอมต์ bash ไม่ได้รับการอัปเดตเมื่อเปลี่ยนชื่อโฮสต์จะอ่านเพียงครั้งเดียวเมื่อเปิดเทอร์มินัล คุณทำได้exec bashแต่มันจะเปิดเทอร์มินัลแบบซ้อนทางเทคนิค

เพื่อแก้ไขปัญหาชื่อโฮสต์ของคุณฉันจะแทนที่ของคุณsedด้วยสิ่งนี้ .. sudo sed -i "s/127.0.1.1/& $compname/" /etc/hosts ซึ่งจะอัปเดตบรรทัด 127.0.1.1 และต่อท้ายโฮสต์ใหม่กับสิ่งที่มีอยู่ มันจะออกจากโฮสต์เก่าในสถานที่ แต่มันเป็นไปตามที่จะมีหลายโฮสต์ที่ได้รับมอบหมายให้หนึ่ง IP ที่จะป้องกันปัญหา unresolvable กับsudoคำสั่งอื่นของคุณเปลี่ยนชื่อโฮสต์

คำตอบ:


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

โดยพื้นฐานแล้วการทำเช่นนี้คุณกำลัง "เข้าคิว" กิจกรรมเพื่อให้ทำงานในการบูตครั้งถัดไปของระบบ สิ่งนี้จะทำงานก่อนที่ผู้ใช้จะเกิดขึ้นดังนั้นระบบจะดำเนินการคำสั่งเหล่านี้เป็นรูท ดังนั้นbenผู้ใช้จะไม่เข้าสู่ระบบและระบบจะไม่บ่น

คุณอาจยังจำเป็นต้องเพิ่มคำสั่งเพิ่มเติมเพื่อสิ่งนี้เพื่อให้มีการปรับให้เป็นแบบส่วนตัวมากขึ้น (เช่นการตั้งค่าชื่อจริง ฯลฯ ) อย่างไรก็ตามนี่เป็นทางเลือกและจะต้องทำก็ต่อเมื่อคุณต้องการให้มันเกิดขึ้นระหว่างสคริปต์การตั้งค่า

แม้ว่ามันอาจเป็นความคิดที่ดีที่จะสร้างผู้ใช้ใหม่สำหรับนักเรียนโดยสิ้นเชิง ด้วยวิธีนี้หากมีสิ่งใดเกิดขึ้นคุณสามารถเข้าไปและซ่อมแซม / ดูแลเครื่องของพวกเขาหากจำเป็น แน่นอนถ้าคุณให้สิทธิ์ผู้ดูแลระบบแก่นักเรียนของคุณนี่เป็นจุดที่สงสัยเนื่องจากพวกเขาอาจลบผู้ใช้ "ผู้สอน" ได้ดีเพราะพวกเขาเป็นนักเรียน


ฉันตั้งใจจะแนะนำ 'ทำการติดตั้งแบบ OEM' จากนั้นฉันพบคำตอบนี้ :-)
sudodus

ขอบคุณที่ตอบคำถามรูตว่าจะทำอย่างไรให้ถึงจุดจบของฉันฉันจะไปกับการติดตั้งแบบ OEM
เบ็น

0

ที่หน้าจอเข้าสู่ระบบให้กดctrlaltF2และเข้าสู่ระบบbenจากเทอร์มินัลที่เปิดและทำงาน

sudo passwd

และให้รหัสผ่านเดียวกันกับพวกเขาทั้งหมดสำหรับรูทเช่นหมายเลขหลักสูตรดังนั้นหากมีบางสิ่งผิดพลาดคุณสามารถเข้าไปแก้ไขได้ จากนั้นก็มีพวกเขาออกจากระบบโดยการพิมพ์exitและเข้าสู่ระบบเป็นรากด้วยรหัสผ่านรากใหม่ของพวกเขาและเรียกใช้สคริปต์ (คุณอาจต้องปรับเปลี่ยนมันจึงจะเปลี่ยนแปลงbenผู้ใช้และไม่ root)

หรือให้พวกเขาเข้าสู่ระบบในฐานะ ben จากเครื่องเทอร์มินัลโดยกดctrlaltF2(เหมือนก่อน) ที่หน้าจอเข้าสู่ระบบและให้พวกเขาเรียกใช้สคริปต์จากที่นั่น นี้สามารถทำงานได้เพราะเป็นMuruและKaz วูล์ฟชี้ให้เห็นในคำตอบก่อนหน้านี้ผู้ใช้จะไม่สามารถใช้กระบวนการใด ๆ และเข้าสู่ระบบผ่านทางสถานีไม่ควรเริ่มต้นกระบวนการใด ๆ เช่นXหรือUbuntu-Desktopหรือกระบวนการ userland อื่น ๆ usermodที่ยุ่งเกี่ยวกับ (ฉันไม่รู้ว่าใช้งานได้หรือไม่ฉันไม่ได้ลอง แต่ก็คุ้มค่าที่จะลอง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.