SSH โดยไม่ต้องจัดหา. bashrc
ฉันกำลังทดลองกับ.bashrcไฟล์ของฉันในขณะที่ล็อกอินเข้าสู่เซิร์ฟเวอร์จากระยะไกลผ่าน SSH ฉันทิ้งไว้exitในนั้นโดยไม่ได้ตั้งใจทำให้การเข้าสู่ระบบที่ตามมาทั้งหมดตัดการเชื่อมต่อทันที ฉันถูกล็อคอย่างมีประสิทธิภาพ ฉันสามารถกู้คืนการเข้าถึงด้วยการแทรกแซงจากบุคคลที่มีสิทธิ์ระดับรูท แต่จะเป็นไปได้หรือไม่หากไม่มีคนอื่นช่วย
ฉันพยายามทำสิ่งต่างๆเช่นการวิ่งssh <server> 'bash --norc --noprofile'และssh <server> 'mv .bashrc bashrc-backup'และแม้กระทั่งพยายามบังคับให้เขียนทับด้วยscp empty-file <server>:.bashrc. อย่างไรก็ตามตัวเลือกเหล่านี้ทั้งหมดดูเหมือนจะอาศัยการจัดหาครั้งแรกที่เสีย.bashrcก่อนที่จะรันคำสั่งดังนั้นจึงไม่มีตัวเลือกใดทำงานได้
อาจเป็นกรณีที่ไม่มีทางออกจากสถานการณ์แบบนี้ แต่นั่นคือการออกแบบหรือไม่? มีเหตุผลไหมว่าทำไมการล็อคตัวเองออกจากระบบอย่างง่ายดายเช่นเพียงแค่เรียกใช้ssh <server> 'echo exit > .bashrc'? มีวิธีบรรเทาความผิดพลาดประเภทนี้หรือไม่?
คำตอบ
ตามที่กล่าวไว้ในคำตอบอื่นเมื่อไคลเอนต์ SSH เชื่อมต่อกับเซิร์ฟเวอร์ OpenSSH โดยทั่วไปเซิร์ฟเวอร์ OpenSSH จะเริ่มเซสชันเชลล์ในนามของไคลเอ็นต์โดยใช้เชลล์ล็อกอินของผู้ใช้:
- หากไคลเอ็นต์ร้องขอเซสชันแบบโต้ตอบเซิร์ฟเวอร์จะเปิดเชลล์ล็อกอินของผู้ใช้
- หากไคลเอ็นต์ร้องขอให้รันคำสั่งเซิร์ฟเวอร์จะใช้เชลล์ล็อกอินของผู้ใช้เพื่อรันคำสั่งเป็นคำสั่งเชลล์
- ยูทิลิตี้ชอบ
scp,rsyncและgitที่ใช้ SSH สำหรับการขนส่งจะขอคำสั่งที่จะทำงานบนระบบระยะไกลเพื่อให้พวกเขาตกอยู่ภายใต้ # 2
หากคุณมีบางอย่างในไฟล์เริ่มต้นเชลล์ของผู้ใช้ระยะไกลซึ่งทำให้เชลล์ออกจากการทำงานคุณจะมีปัญหาในการเข้า
SFTP อย่างไรก็ตามเป็นกรณีพิเศษ เซิร์ฟเวอร์ OpenSSH อาจได้รับการกำหนดค่าให้รองรับ SFTP โดยไม่ต้องเรียกใช้คำสั่งภายนอก หากเป็นเช่นนั้นคุณจะสามารถใช้ sftp เพื่อเชื่อมต่อกับเซิร์ฟเวอร์และลบเปลี่ยนชื่อหรือแก้ไข.bashrcไฟล์ที่เป็นสาเหตุของปัญหา
ขึ้นอยู่กับวิธีกำหนดค่าเซิร์ฟเวอร์ให้รองรับ sftp สามารถให้บริการเซสชัน sftp โดยการเปิดโปรแกรมภายนอก (ชื่อsftp-server) ในกรณีนี้คุณจะมีปัญหาเดียวกันในการเข้าใช้งานโปรแกรมเช่นscp. หรือเซิร์ฟเวอร์สามารถให้บริการเซสชัน sftp โดยสิ่งที่อ้างถึง"internal-sftp"ซึ่งไม่จำเป็นต้องเรียกใช้เชลล์ ขึ้นอยู่กับวิธีกำหนดค่าเซิร์ฟเวอร์ SSH โดยเฉพาะ
สาเหตุที่เกิดขึ้นเนื่องจากsshdคอมโพเนนต์ฝั่งเซิร์ฟเวอร์เรียกใช้กระบวนการโดยใช้เชลล์ของคุณ ถ้ามันวางไข่เชลล์แบบโต้ตอบมันจะวางไข่เป็นเชลล์ล็อกอิน มิฉะนั้นจะใช้-cอาร์กิวเมนต์เพื่อวางไข่เชลล์ที่ไม่ใช่แบบโต้ตอบเพื่อรันคำสั่งที่คุณระบุ
การดำเนินการทั้งหมดที่คุณระบุ (คำสั่งที่ระบุและscp) เป็นการดำเนินการที่ไม่โต้ตอบดังนั้นโดยปกติ bash จะไม่โหลด.bashrcแต่ bash มีปลอกพิเศษสำหรับเมื่อถูกเรียกใช้sshdเพื่อที่จะเรียกใช้อย่างไรก็ตาม หากคุณใช้ zsh .zshenv(ซึ่งเรียกใช้สำหรับเชลล์ทั้งหมด) จะถูกโหลด แต่.zshrc(ซึ่งมีไว้สำหรับเชลล์แบบโต้ตอบเท่านั้น) จะไม่เป็นเช่นนั้นเว้นแต่คุณจะโหลดเซสชันเชลล์โดยเฉพาะ
ในกรณีนี้หากคุณใช้ทุบตีคุณก็โชคไม่ดี ไม่มีวิธีใดในการเรียกใช้คำสั่ง SSH บนฝั่งเซิร์ฟเวอร์โดยไม่ใช้เชลล์ นี่เป็นจริงแม้กระทั่งสำหรับ scp และ sftp โดยส่วนใหญ่คุณต้องการใช้เชลล์เนื่องจากตั้งค่าสิ่งต่างๆเช่นPATHสำหรับโปรแกรมต่างๆและช่วยให้สามารถเขียนสคริปต์คำสั่งที่ซับซ้อนได้ในจำนวนที่เหมาะสมดังนั้น OpenSSH จึงใช้มันเสมอ
นอกจากนี้ยังมีประโยชน์ด้านความปลอดภัยบางประการ: หากคุณพยายามเข้าสู่ระบบบัญชีที่มีรหัสผ่านที่ถูกต้อง แต่มีเปลือก/usr/sbin/nologinหรือ/bin/falseคุณไม่สามารถทำอะไรได้ซึ่งอาจเป็นสิ่งที่ผู้ดูแลระบบตั้งใจไว้
มีหลายวิธีในการบรรเทาปัญหานี้ หลายคนเก็บไฟล์ dotfiles ของ Git ไว้และพัฒนาในระบบเดียวจากนั้นนำไปใช้กับผู้อื่น ตัวอย่างเช่นฉันมักจะพัฒนาดอทไฟล์บนแล็ปท็อปของฉัน สันนิษฐานว่าคุณจะสังเกตเห็นปัญหานี้เร็วขึ้นเล็กน้อยหากเมื่อใดก็ตามที่คุณเปิดหน้าต่างเทอร์มินัลใหม่มันจะออกทันทีและคุณอาจมีสิทธิ์เข้าถึงรูทเพื่อแก้ไขด้วยตัวเอง
หากคุณต้องการทดสอบการกำหนดค่าที่อาจล็อกคุณเอาไว้เช่นการกำหนดค่าเชลล์หรือการsudoersเปลี่ยนแปลงคุณสามารถเปิดเชลล์หนึ่ง (ปกติหรือรูทตามลำดับ) แล้วทำการทดสอบบางอย่างดังนั้นหากคุณทำบางสิ่งบางอย่างพังคุณยังคงมี วิธีในการเลิกทำ