แชตยูนิกซ์แบบเรียบง่าย
(the-dam.org)sucคือ Simple Unix Chat ที่นำฟังก์ชันแกนหลักบางส่วนของแชตสไตล์ Slack·Mattermost มาสร้างด้วยการผสม องค์ประกอบพื้นฐานของ UNIX กับ Bash โดยลูปหลักมีเพียง 5 บรรทัด แต่สคริปต์จริงยาวกว่านั้น- ข้อความจะถูกอ่านทีละบรรทัดจาก standard input จากนั้นเติมวันที่และชื่อผู้ใช้ แล้วเพิ่มต่อท้ายลงในไฟล์ช่องทางของ
/var/lib/suc/ส่วน การยืนยันตัวตนและการควบคุมสิทธิ์ ปล่อยให้ SSH และโมเดลสิทธิ์ของ UNIX จัดการ - ต่างจากเซิร์ฟเวอร์ Mattermost ที่มีโค้ด Go เพียงอย่างเดียวราว 500,000 บรรทัด
sucเน้นว่าโค้ดที่เล็กกว่ามากก็สามารถสร้างพฤติกรรมแกนหลักที่คล้ายกันได้ usucใช้การผสานtail -f,rlwrap,pygmentizeและคำนำหน้าคำสั่ง:เพื่อจัดการ การอ่านช่องทาง, การแสดงผลสไตล์ Markdown และการแชร์ผลลัพธ์ของคำสั่ง- เพราะช่องทางเป็นเพียงไฟล์ข้อความธรรมดา จึงเชื่อมต่อกับเครื่องมือ UNIX อย่าง
grep,tail,bat,lnav, Git hook และสคริปต์บอตได้ง่าย
ความซับซ้อนที่ suc พยายามลดลง
sucย่อมาจาก Simple Unix Chat มีฟังก์ชันน้อยกว่า Slack, Mattermost และ IRC และแม้จำนวนบรรทัดทั้งหมดจะเกิน 5 บรรทัด แต่ ลูปแกนหลัก สำหรับเขียนข้อความประกอบด้วย Bash 5 บรรทัด- ฟีเจอร์เป้าหมายคือแชต rich text แบบเรียลไทม์, การแชร์ไฟล์, การควบคุมการเข้าถึงแบบละเอียด, ระบบอัตโนมัติและการเชื่อมกับเครื่องมือภายนอก, การเข้ารหัสระหว่างส่ง, การเข้ารหัสตอนเก็บข้อมูลแบบเลือกได้ และการยืนยันตัวตนผู้ใช้
- การทำให้มีขนาดเล็กเป็นไปได้เพราะอาศัย องค์ประกอบพื้นฐานที่สอดคล้องและนำมาประกอบกันได้ ซึ่งมีอยู่แล้วในระบบ UNIX สมัยใหม่
- เมื่อเทียบกับเซิร์ฟเวอร์ Mattermost ที่มีโค้ด Go ราว 500,000 บรรทัด ผู้เขียนมองว่า
sucสามารถทำฟังก์ชันแกนหลักของ Mattermost ได้ด้วยโค้ดเพียง 0.005% ของจำนวนนั้น
ลูปเขียนข้อความ 5 บรรทัด
- ลูป Bash หลักของ
sucจะอ่านทีละบรรทัดจาก standard input เติมวันที่และชื่อผู้ใช้จริง แล้วเพิ่มต่อท้ายลงในไฟล์/var/lib/suc/"$1" - สคริปต์จริงยาวกว่านี้เพราะมีการ preprocess เพื่อความปลอดภัยและการคำนวณสีของชื่อผู้ใช้ แต่การทำงานหลักในการเขียนบันทึกแชตสรุปได้ 3 ข้อ
- อ่านทีละบรรทัดจาก standard input
- เติมวันที่และชื่อผู้ใช้จริง
- เพิ่มต่อท้ายลงในไฟล์ช่องทางใต้
/var/lib/suc/
- การยืนยันตัวตน, การควบคุมการเข้าถึง, การเข้ารหัส และ rich text ไม่ได้ทำโดยโค้ดภายใน
sucแต่เป็นหน้าที่ของ SSH, API ควบคุมการเข้าถึงของ UNIX และความเป็นโมดูลแบบข้อความ
SSH รับหน้าที่การยืนยันตัวตน
- โปรเซส
sucทำงานโดยผู้ใช้ที่ผ่านการยืนยันตัวตนแล้ว ดังนั้นsucเองจึง ไม่มีโค้ดสำหรับยืนยันตัวตน - การยืนยันตัวตนระยะไกลจัดการโดย
sshเช่นเดียวกับเซิร์ฟเวอร์ UNIX ทั่วไป- shared secret อย่างรหัสผ่าน
- cryptographic challenge
- อุปกรณ์สร้างรหัสผ่านใช้ครั้งเดียว (OTP)
- MFA ที่ผสมหลายวิธีเข้าด้วยกัน
sshยังยืนยันตัวตนของเซิร์ฟเวอร์ให้ไคลเอนต์ด้วยเพื่อป้องกันการโจมตีแบบ man-in-the-middle และเข้ารหัสข้อมูลทั้งหมดระหว่างไคลเอนต์กับเซิร์ฟเวอร์- การติดตั้ง
sucขึ้นอยู่กับโฮสต์ UNIX และการตั้งค่าเซิร์ฟเวอร์ssh- ผู้ใช้ต้องมีอยู่ในระบบ
- เซิร์ฟเวอร์
sshต้องอนุญาตให้ผู้ใช้นั้นล็อกอินจากระยะไกลได้
- ใน GNU Guix สามารถเพิ่มผู้ใช้และ SSH key ได้ในบรรทัดเดียวด้วยการตั้งค่าแบบ declarative และถ้าบรรทัดตั้งค่านั้นหายไป ผู้ใช้ก็จะถูกลบออกระหว่างขั้นตอน reconfigure
โมเดลสิทธิ์ของ UNIX รับหน้าที่ควบคุมการเข้าถึง
sucไม่เพียงไม่มีโค้ดยืนยันตัวตน แต่ยังไม่มีโค้ดควบคุมการเข้าถึงด้วย และเรียกแนวทางนี้ว่า security agnosticism- เคอร์เนล UNIX รู้จักผู้ใช้, กลุ่ม, โปรเซส และไฟล์ และจะตัดสินสิทธิ์อ่าน-เขียนไฟล์จาก effective owner ของโปรเซส
- ไฟล์ช่องทางใน
/var/lib/sucเป็นของผู้ใช้sucและตั้งค่าให้ผู้ใช้สามารถอ่านบางช่องทางได้ผ่านสิทธิ์อ่านระดับกลุ่ม - ผู้ใช้ทั่วไปจะไม่เขียนไฟล์โดยตรง แต่เรียกใช้
sucแทน ส่วนการจับคู่สิทธิ์และการปฏิเสธการเข้าถึงเป็นหน้าที่ของเคอร์เนล - ในชุมชนที่ต้องการข้อจำกัดมากขึ้น สามารถมีไบนารี
setuidแยกตามกลุ่มได้- ตัวอย่างเช่น
suc_blueเป็นของผู้ใช้blueและให้รันได้เฉพาะกลุ่มblue - ผู้ใช้ในกลุ่ม
blueสามารถเขียนลงช่องทางblueผ่านsuc_blueได้ - ผู้ใช้กลุ่ม
redจะอ่านหรือเขียนช่องทางblueไม่ได้
- ตัวอย่างเช่น
- สคริปต์ช่วยสร้างช่องทาง
suc_channel.shยาวประมาณ 80 บรรทัด และผู้ใช้ GNU Guix สามารถสร้างไบนารี setuid, ผู้ใช้, กลุ่ม และไฟล์ช่องทางที่จำเป็นได้ด้วยบรรทัดเดียว(suc-private-channel "red" "red") - transactional update ของ GNU Guix รับประกันว่าการเปลี่ยนแปลงค่าตั้งจะถูกนำไปใช้ครบทั้งหมดหรือไม่ถูกใช้เลย และสามารถ rollback กลับไปยังสถานะการทำงานก่อนหน้าได้
Rich text และ usuc
- แอปแชตจำนวนมากเรนเดอร์ข้อความด้วยเอนจิน HTML และไคลเอนต์เดสก์ท็อปของ Mattermost ใช้ Electron
sucใช้ไฟล์ข้อความหนึ่งไฟล์ต่อหนึ่งช่องทาง และผู้ใช้สามารถดูได้ด้วยเครื่องมือบรรทัดคำสั่งอย่างtailหรือcat- หากใช้ ANSI escape code ของเทอร์มินัลร่วมกับการรองรับ UTF-8 ก็สามารถสร้างประสบการณ์คล้าย rich text ทั้งสี, อีโมจิ และรูปแบบพื้นฐานได้
sucทำหน้าที่เพียงเขียนลงไฟล์ช่องทาง ส่วนการอ่านเป็นหน้าที่ของusucsucเป็นไบนารีที่มีสิทธิ์พิเศษ จึงควรลด logic และ dependency ภายนอกให้น้อยที่สุดusucทำงานด้วยสิทธิ์ของผู้ใช้ที่เรียก จึงเพิ่มความสามารถต่าง ๆ ได้อย่างอิสระกว่า
usucทำหน้าที่เป็นไคลเอนต์แชตโดยร้อยเรียงเครื่องมือเล็ก ๆ หลายตัวเข้าด้วยกัน- ใช้
rlwrapเพื่อให้มี history และการแก้ไขบรรทัด - เลือกไบนารี
sucแบบ setuid ที่เหมาะสมตาม owner ของไฟล์ช่องทาง - ใช้
tail -f -n 20เพื่อแสดง 20 บรรทัดล่าสุดและบรรทัดที่เพิ่มเข้ามาหลังจากนั้น - ตรวจสอบว่าบรรทัดอินพุตขึ้นต้นด้วย
:หรือไม่ - ส่งข้อความที่ผู้ใช้ป้อนผ่าน
pygmentize
- ใช้
pygmentizeจะมอง standard input เป็น Markdown และแสดงผลเป็นข้อความสี ANSI ดังนั้นมาร์กอัปอย่าง**bold**จึงรองรับได้ด้วยโค้ดเพียงบรรทัดเดียว
คำสั่งแชตและการผสานกับเชลล์
usucจะไม่ส่งข้อความเป็นข้อความธรรมดาหากขึ้นต้นด้วย:แต่จะรันคำสั่งนั้นแล้วส่ง ผลลัพธ์ที่แสดงออกมา ไปยังsuc- ตัวอย่างเช่น หากรัน
gum style --border=rounded --bold --foreground=#F00 "Hello World !"ข้อความพร้อมเส้นขอบและสไตล์จะปรากฏในช่องทาง - คำสั่งจะทำงานใน namespace ของผู้ใช้ที่เรียก
usucดังนั้นผู้ใช้แต่ละคนจึงมีมาโครแชตของตัวเองได้โดยไม่กระทบคนอื่น - ที่ the dam มีการใช้สิ่งนี้ระหว่างเล่น tabletop RPG เพื่อทอยลูกเต๋าด้วยคำสั่งอย่าง
roll 2d6
text pipe และการเชื่อมกับเครื่องมือภายนอก
- ผู้ใช้สามารถไม่ใช้ฟังก์ชันรันคำสั่งของ
usucแล้ว pipe เอาผลลัพธ์ของคำสั่งจากเชลล์เข้าsucโดยตรงได้ - หากส่งผลลัพธ์แบบมีสีของ
batเข้าsucก็สามารถแชร์โค้ด snippet พร้อม syntax highlighting ลงในช่องทางได้ make test > testlog || (suc devops < testlog ; exit 1)เป็นตัวอย่าง one-liner ของ Bash สำหรับส่ง log ไปยังช่องทางdevopsเมื่อการทดสอบล้มเหลว- one-liner นี้สามารถใส่ไว้ใน hook
updateของ Git repository เพื่อรันทดสอบตอน push และหากล้มเหลวก็ปฏิเสธการอัปเดตพร้อมแจ้งทีม DevOps ได้ - งานที่เทียบได้กับฟังก์ชัน integration ของ Slack หรือ Mattermost สามารถประกอบขึ้นได้ด้วย text pipe และสคริปต์ของ UNIX
การอ่านช่องทาง, การแจ้งเตือน, บอต
- ช่องทางของ
sucเป็นไฟล์ข้อความที่อัปเดตต่อเนื่อง จึงสามารถอ่านบรรทัดใหม่ด้วยtail -fแล้วนำไปประมวลผลต่อได้ - เมื่อมีข้อความใหม่เข้ามา สามารถสร้าง pipeline ที่เรียก
notify-sendเพื่อแจ้งเตือนได้ และใช้grepกรองเฉพาะชื่อหรือคีย์เวิร์ดอย่าง “build failure” ได้ - หากต้องการรวมหลายช่องทางไว้ในฟีดเดียว สามารถใช้
tail -f /var/lib/suc/* - เมื่อใช้ lnav จะได้ความสามารถอย่างการจำตำแหน่งที่อ่าน, bookmark, สีแยกตามช่องทาง, การ parse วันที่·ชื่อผู้ใช้·ฟิลด์กำหนดเอง, การกรอง และการ query ด้วย SQL
- บอตสามารถทำได้หากอ่านและเขียนช่องทางได้พร้อมกัน
- ตัวอย่างคือค้นหารูปแบบความยาวอย่าง
33000 ftในช่องทาง - แปลงเป็นหน่วยเมตรด้วยคำสั่ง
units - แล้วเขียนคำตอบกลับลงช่องทางเดียวกัน เช่น
[metric_bot] 33000 ft is 10058.4 meters.
- ตัวอย่างคือค้นหารูปแบบความยาวอย่าง
ตัวเปรียบเทียบและข้อสรุป
- แม้จะยก Slack, Mattermost และ Discord มาเป็นตัวเปรียบเทียบ แต่ผู้เขียนมองว่าคู่เปรียบเทียบที่ยุติธรรมกว่าควรรวม IRC,
talk,writeด้วย - IRC ถูกประเมินว่ามีความสามารถน้อยกว่า
sucเพราะหากต้องการอ่านประวัติแชตเก่าจะต้องมี bouncer - ส่วน
talk,ytalk,wallผู้เขียนบอกว่ายังทำให้ใช้งานได้บน Linux distribution สมัยใหม่ไม่สำเร็จ sucมอบหมายการยืนยันตัวตนให้ SSH, การควบคุมการเข้าถึงและความสามารถในการประกอบต่อให้ UNIX และเก็บช่องทางไว้ในรูปไฟล์ข้อความ- ตราบใดที่เครื่องมือสามารถอ่านและเขียนข้อความได้ ก็สามารถเขียนมันขึ้นมาได้ด้วยภาษาใดก็ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
นึกถึง “Master Foo and the Ten Thousand Lines” ทันที: http://catb.org/~esr/writings/unix-koans/ten-thousand.html
เป็นเรื่องที่ Master Foo พูดกับโปรแกรมเมอร์ที่มาเยือนว่า “สคริปต์เชลล์หนึ่งบรรทัดมี แก่นแท้ของ Unix มากกว่าโค้ด C หนึ่งหมื่นบรรทัด”
ถ้า ฟังก์ชันหลัก ที่ถูกกำหนดไว้ของบางอย่างสามารถทำซ้ำได้ง่ายและเล็กน้อยเกินไป ฟังก์ชันนั้นก็อาจไม่ใช่แก่นหรือแหล่งที่มาของคุณค่าที่แท้จริง
ชวนให้สงสัยว่าตั้งแต่ทศวรรษ 1980 เป็นต้นมา วิศวกรรมซอฟต์แวร์ได้ดูดซับและทำให้การพัฒนา UI เป็นอัตโนมัติไปมากแค่ไหน หรือมันยังคงเป็นพื้นที่ของศิลปะมนุษย์ล้วน ๆ อยู่
ก่อนที่ Slack จะออกมาแล้วเบียดสิ่งอื่น ๆ ออกไป ก็มีแอปทั้งเชิงพาณิชย์และโอเพนซอร์สหลายสิบตัวที่ทำสิ่งนั้นอยู่แล้ว
คุณค่าหลักของ Slack อยู่ในขั้นถัดไป คือให้ UI/UX ที่ดูดีและเข้าใจง่ายมาก จนแทบทุกคนสามารถนั่งลงแล้วใช้ได้ทันทีโดยไม่ต้องศึกษา ตั้งค่า อ่านคู่มือ หรืออบรม ไม่ต้องมีความรู้ด้านเทคนิค และแม้จะไม่เข้าใจอะไรเกินกว่า “กรอกชื่อผู้ใช้และรหัสผ่าน” ส่วนที่เหลือก็ดูชัดเจนในตัวเอง
แต่ก็เกิดคำถามที่ยากกว่า: เมื่อเทียบกับทางเลือกอย่างการฝึกผู้ใช้ให้เรียกคำสั่งพื้นฐานบน command line ได้ ราคา Slack คุ้มค่าขนาดนั้นหรือไม่? แล้วถ้าพิจารณาด้วยว่า Slack จับข้อมูลไว้และไม่คืนกลับมาให้ล่ะ? ค่าใช้จ่ายในการย้ายออกจาก Slack แพงแค่ไหน?
suc ใช้งานไม่สะดวกก็จริง แต่ดูเหมือนว่าอาจพัฒนาไปสู่บางอย่างที่เทอะทะน้อยกว่าและผูกขาดน้อยกว่า Slack ได้
ชอบผลลัพธ์โดยตัวมันเอง การได้เห็นว่า ความสามารถในการประกอบกัน สามารถสร้างอะไรได้บ้างนั้นเจ๋งดี
แต่การเอาไปเทียบกับ Slack อะไรทำนองนั้นไม่ค่อยโดนใจนัก คงไม่มีวิศวกรคนไหนอยากรับผิดชอบของที่ปะติดปะต่อแบบนี้ใน production แล้วจะจ้างคนอย่างไร ทดสอบและดีบักอย่างไร ทำล็อกและ analytics อย่างไร?
บทความนี้ลอกเลียนบางส่วนของฟีเจอร์แชตในแอปประเภท Slack แต่ฟีเจอร์แชตไม่ใช่ 100% ของแอปเหล่านี้ มันถูกสร้างขึ้นในบริบทที่ต่างกันโดยสิ้นเชิง ดังนั้นการโจมตีสภาพเดิมว่าเทอะทะจึงดูเหมือนการตีความแบบบิดเบี้ยวสไตล์ Stockton Rush ซอฟต์แวร์มีความเทอะทะอยู่จริง แต่ “แม่ดูสิ ผมทำเรือดำน้ำจากเศษของจิปาถะได้ เพราะงั้นเรือดำน้ำแพง ๆ ก็โง่น่ะสิ” ไม่น่าจะเป็นข้อโต้แย้งที่ผู้เขียนตั้งใจสื่อ
ยูทิลิตีแต่ละตัวมักทำความเข้าใจ ทดสอบ และดีบักแยกเป็นหน่วย ๆ ได้ง่าย และ logging ก็มีอยู่ในระบบแล้ว ไม่ใช่ว่ามี syslog อยู่หรือ? แล้ว analytics จำเป็นไปทำไม?
ถึงอย่างนั้นก็อยากรู้จริง ๆ ว่าเครื่องมืออย่าง Slack จะหน้าตาเป็นอย่างไร หากให้ความสำคัญกับความเรียบง่ายอย่างจริงจังเหนือฟีเจอร์ใหม่ ๆ ดูเหมือนว่าทุนนิยมโดยรวมไม่ได้ส่งเสริมการพัฒนาแบบนี้ จึงไม่ค่อยมีตัวอย่างซอฟต์แวร์องค์กรที่เรียบง่ายเท่าที่เป็นไปได้อย่างสมเหตุสมผลอยู่มากนัก แต่ก็เป็นการทดลองทางความคิดที่น่าสนใจ
มี ii ที่ทำงานโดยตรงบน IRC คล้าย ๆ กันด้วย: https://tools.suckless.org/ii/
ใช้ไฟล์มาตรฐานไฟล์เดียวสำหรับทุกบทสนทนา การยืนยันตัวตนและการควบคุมการเข้าถึงให้เครือข่าย IRC จัดการเอง และมี UI อยู่แล้วมากมาย เช่นเดียวกับบทความนี้ ปลั๊กอินจะเป็นอะไรก็ได้ที่อ่านไฟล์หนึ่งแล้วเขียนไปยังอีกไฟล์หนึ่ง
เหมือนกับไดอะแกรม craigslist ถ้าทำไดอะแกรม spawn of unix ที่รวบรวมสตาร์ทอัพซึ่งตัดเอาช่องว่างของฟังก์ชัน Unix ไปใช้ น่าจะสนุกดี
https://thegongshow.tumblr.com/post/345941486/the-spawn-of-craigslist-like-most-vcs-that-focus
ftp/rsync => Dropbox
suc => Slack
...
หากกำลังจะเลื่อนผ่านเพราะชื่อเรื่องดูเหมือนพาดหัวดักคลิก ก็ยอมรับว่ามีกลิ่นอายแบบนั้นอยู่บ้าง แต่จริง ๆ แล้วเป็นบทความที่ค่อนข้างดี
พูดถึงยูทิลิตีชื่อ “suc”(Simple Unix Chat) ซึ่งใช้โค้ดเบสขนาดเล็กมากเพื่อทำฟังก์ชันฝั่งเซิร์ฟเวอร์แบบ Slack หรือ Discord
จุดใหม่คือมันไม่ได้ประดิษฐ์เครื่องมือและวิธีคิดแบบ Unix ขึ้นมาใหม่ แต่ใช้ของเดิมให้เป็นประโยชน์ การยืนยันตัวตนให้ SSH จัดการ ช่องก็เป็นแค่ไฟล์ ส่วนการควบคุมแอดมิน/ม็อดเดอเรเตอร์ก็จัดการด้วยกลุ่มผู้ใช้และสิทธิ์ไฟล์ ส่วนพวก rich text หรือการอัปโหลดไฟล์ ก็แค่เขียนข้อมูลที่ต้องการลงในช่อง แล้วปล่อยให้ไคลเอนต์ตีความ บอทก็ง่ายมาก แค่ต่อ pipe เข้ากับไฟล์ช่อง
แค่ 5 บรรทัดในบทความที่ใช้เขียนข้อความลงในช่อง คงทำ Slack clone ที่สมบูรณ์แบบไม่ได้ แต่ก็น่าประทับใจมากว่าเครื่องมือ Unix ที่เรียบง่ายจริง ๆ พาไปได้ไกลแค่ไหน
มีเหตุผลที่แทบไม่มีระบบโปรดักชันขนาดใหญ่ที่เขียนด้วยเชลล์สคริปต์และยึดพาราไดม์ “ทุกอย่างคือไฟล์” อยู่เลย ในโลกจริง มันเป็นแนวทางที่ยอมรับไม่ได้สำหรับระบบที่ไม่ใช่ของเล่นและต้องใช้งานได้จริง
ในนั้นมี UI สำหรับแอดมิน, UI จัดการผู้ใช้, ความสามารถในการขยายระบบ, webhook และอื่น ๆ การบอกว่า “ถ้าทุกคนล็อกอินเข้าเครื่องนั้น ก็แชตกับผู้ใช้คนอื่นบน Linux ได้” ไม่ได้จัดการอะไรในรายการเหล่านี้เลย ฟีเจอร์แบบนั้นมีอยู่ใน *nix ทุกตัวมาตั้งแต่ก่อนผู้อ่านส่วนใหญ่ที่นี่เกิดเสียอีก
น่าเสียดายที่ฟีเจอร์ของ Plan 9 นี้ยังไม่ได้ถูกพอร์ตมายัง Linux มันเป็นบิตสิทธิ์ที่คล้ายกับ “อ่าน” หรือ “เขียน” แต่เจาะจงกว่ามาก
ไม่ได้โทษผู้เขียนนะ และในบทความเองก็พูดเรื่องนี้ไว้อย่างตรงไปตรงมามาก
Slack กับ Discord มี การแชร์หน้าจอ และ แชตเสียง สิ่งนี้ไม่ใช่ฟีเจอร์เสริม แต่เป็นฟีเจอร์ที่ค่อนข้างชี้ขาดต่ออำนาจครองตลาด
ต้องยอมรับตั้งแต่แรกอย่างตรงไปตรงมาด้วยว่าบล็อกโพสต์นี้เกี่ยวกับ suc และชื่อเรื่องอาจทำให้เข้าใจผิดได้นิดหน่อย แต่สุดท้ายแล้วก็มีสารสำคัญที่ไม่ได้เกี่ยวข้องโดยตรงกับ suc
ซอฟต์แวร์สมัยใหม่แทบทั้งหมดบวมอย่างรุนแรง ความคิดที่ว่าเซิร์ฟเวอร์แชตที่มีฟีเจอร์ครบต้องใช้โค้ด 1.7 ล้านบรรทัด นั้นไร้สาระมาก ถ้าพูดแบบ Bill Gates ผมคง “ใช้” โค้ดจำนวนเท่านั้นกับเซิร์ฟเวอร์แชตไม่ได้ ต่อให้พยายามแล้วก็ตาม
ขอปรบมือให้ ไม่ใช่แค่เพราะช่วยชี้ปัญหาหรือเสนอทางเลือก แต่เพราะเตือนว่าเราไม่จำเป็นต้องประดิษฐ์ล้อขึ้นมาใหม่ การนำคุณสมบัติของระบบและซับซิสเต็มที่มีอยู่ เช่น ใช้ SSH สำหรับการยืนยันตัวตนและการเข้ารหัส ไปใช้อย่างชาญฉลาด แม้จะต่างจากวัตถุประสงค์ที่จินตนาการไว้เดิม แต่ยังสอดคล้องกับเจตนาของคุณสมบัตินั้น เป็นตัวอย่างที่ดีของ จิตวิญญาณแฮกเกอร์
หวังว่าโลกซอฟต์แวร์จะเรียนรู้จากแนวคิดนี้ได้มาก ต้นทุนที่ต่ำลง ระยะเวลาพัฒนาที่สั้นลง และเวลาวิศวกรรมที่สูญเปล่าน้อยลงกับการเขียนโค้ดที่ทำหน้าที่เหมือนกันซ้ำ ๆ ล้วนดีต่อทั้งนักพัฒนา บริษัท ผู้ใช้ปลายทาง และท้ายที่สุดก็ดีต่อมนุษยชาติ ผมอยากเห็นการทำลายล้างเชิงสร้างสรรค์แบบนี้มากขึ้นในอนาคต และอยากลองนำเทคนิคฉลาด ๆ แบบนี้ไปใช้ในโปรเจกต์ของตัวเองด้วย
ดังนั้นจริง ๆ แล้วควรนับเฉพาะบรรทัดโค้ด Go จึงจะถูกต้องกว่า
[0] https://github.com/mattermost/mattermost/tree/master/e2e-tests
[1] https://github.com/mattermost/mattermost/tree/master/webapp
โดยทั่วไปนี่เป็นไอเดียที่ดี เพราะช่วยเร่งความเร็วในการออกผลิตภัณฑ์และลดขนาดองค์กรได้ แต่ก็มี trade-off ใหญ่ด้านความซับซ้อนและ abstraction ยิ่งระดับ abstraction สูงขึ้นก็อาจยิ่งแย่ลง ดังนั้นมันไม่ได้ไม่มีเหตุผลเลย
ปัจจุบันดิสโทรส่วนใหญ่ป้องกันไม่ให้สร้าง setuid bash script ด้วยเหตุผลด้านความปลอดภัย
แต่สามารถได้ผลแทบเหมือนกันด้วยรายการ sudoers เฉพาะบางรายการ
https://perldoc.perl.org/perlsec#Taint-mode
ในบางระบบอาจมี race condition ในระดับพื้นฐานอยู่:
https://perldoc.perl.org/perlsec#Shebang-Race-Condition
การใช้
sudo -Tก็น่าดูไว้เช่นกัน:https://perldoc.perl.org/perlsec#Using-Sudo
น่าเสียดายที่ Ruby เพิ่งเอาโหมด taint ออกไป การติดตาม taint เป็นกลไกทรงพลังที่ไปได้ไกลกว่าสคริปต์มาก ตัวอย่างเช่น ถ้า
#html_safeของ Rack/Rails ถูกจัดการด้วยการติดตาม taint มันก็จะทำงานได้รัดกุมกว่าเดิม และอาจป้องกัน SQL injection บางประเภทได้ตั้งแต่ระดับการออกแบบ โดยให้ระเบิดทันทีที่มีการนำสตริงผู้ใช้ที่ติด taint ไปต่อ/แทรก/ฟอร์แมตกับชิ้นส่วน SQLสมัยก่อนก็มีคนที่ใช้การติดตาม taint ใน CGI/mod_perl ได้อย่างมีประสิทธิภาพมาก มันไม่ใช่ยาครอบจักรวาลแน่นอน แต่ก็ยังเป็นเครื่องมือที่ค่อนข้างได้ผล
https://gitlab.com/edouardklein/suc/-/blob/master/suc_wrapper.c
ระหว่างอ่าน ผมก็หวังว่าจะมีวิธีสักอย่าง จนกระทั่งได้เห็นไฟล์ wrapper ใน GitLab repository
นี่เป็นอีกเรื่องหนึ่ง แต่แปลกใจที่ไม่ได้พูดถึง talk(1): https://man.netbsd.org/talk.1
ข้อดีคือสามารถกำหนดให้รับเฉพาะในเครื่อง local ได้ และถ้าเป็นอย่างนั้นก็ต้องมีบัญชีผู้ใช้บนเครื่องนั้น จึงเหมาะกับที่อย่าง SDF หรือคลัสเตอร์ขนาดใหญ่กว่า ส่วนการยืนยันตัวตนก็ไม่ต้องทำเอง ให้ PAM หรือ BSD_Auth จัดการไป ซ็อกเก็ตหรือการเข้ารหัสก็ไม่ต้องทำเอง ให้ TLS จัดการไป จะใช้วิธี SSH เข้า secure shell แล้วใช้ tmux กับ (n)talk ก็ได้
แน่นอนว่า (n)talk เขียนด้วย C ดังนั้นจึงไม่ใช่ bash 5 บรรทัด
[1] https://man7.org/linux/man-pages/man2/write.2.html