วิธีการตรวจสอบเมื่อเชลล์เป็นเจ้าของโดยเซสชั่น SSH ระยะไกล?


9

คำถามของฉันคล้ายกับคำถามนี้แต่ฉันกำลังมองหาบางอย่างที่แตกต่างออกไปเล็กน้อย ฉันมีโน้ตบุ๊คพีซีที่ฉันใช้เพื่อเข้าถึงเครื่อง Linux บนเครือข่ายในสองสถานการณ์ที่แตกต่างกัน:

  • ฉันมีการเชื่อมต่อแบบใช้สายโดยตรงกับเครือข่าย

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

.bashrcไดเรกทอรีบ้านของฉันคือเครือข่ายที่สามารถเข้าถึงได้จากทุกเครื่องเพื่อให้พวกเขาแบ่งปันสำเนาของฉัน ฉันต้องการเพิ่มฟังก์ชันการทำงานเพื่อ.bashrcตรวจสอบว่าฉันอยู่ในสถานการณ์ใดในสองสถานการณ์ (โดยทางเทคนิคจะมีสามสถานการณ์โดยที่สามคือที่ฉันเข้าสู่เครื่องท้องถิ่นของฉัน แต่ควรจัดการได้อย่างง่ายดาย ) ฉันต้องการทำสิ่งต่าง ๆ เช่น:

  • alias ssh ssh -X เมื่อฉันอยู่ในเครือข่ายท้องถิ่น แต่ฉันไม่ต้องการใช้การส่งต่อ X ผ่านอินเทอร์เน็ต

  • export EDITOR=gvimเมื่อฉันอยู่ในเครือข่ายท้องถิ่น แต่export EDITOR=vimเมื่อฉันระยะไกล

และอื่น ๆ จากคำตอบก่อนหน้าดูเหมือนว่าฉันควรจะสามารถทำสิ่งนี้ได้โดยการตรวจสอบเนื้อหาของSSH_CLIENT(ถ้ามี) และดูว่าที่อยู่ IP ของไคลเอ็นต์ตรงกับหนึ่งในอะแดปเตอร์เครือข่ายในเครื่องท้องถิ่นของฉัน ฉันคิดว่าฉันจะดูว่ามีวิธีที่ไม่มั่นคงหรือมีประสิทธิภาพมากกว่านี้หรือไม่

คำตอบ:


10

ในการตรวจสอบเซสชั่น SSH $SSH_CLIENTใช้

เพื่อแยกความแตกต่างระหว่างเซสชันโลคัลและรีโมตมีสองวิธีที่เป็นไปได้: ฝั่งไคลเอ็นต์หรือฝั่งเซิร์ฟเวอร์ ที่ฝั่งเซิร์ฟเวอร์ให้เปรียบเทียบ$SSH_CLIENTกับที่อยู่ IP ในเครื่องหรือตารางเส้นทาง สิ่งนี้มักจะบอกคุณว่าการเชื่อมต่อมาจาก LAN ในฝั่งไคลเอ็นต์คุณอาจต้องการForwardX11ตั้งค่าใน~/.ssh/config: ตั้งค่าเป็นyesสำหรับโฮสต์ LAN และnoสำหรับโฮสต์ WAN สิ่งนี้บ่งบอกว่ามีความแตกต่าง~/.ssh/configในเว็บไซต์ที่ต่างกัน นั่นคือสิ่งที่ฉันทำและฉันสร้างของฉันด้วยเชลล์สคริปต์

หากการส่งต่อ X11 เปิดอยู่สำหรับการเชื่อมต่อ LAN และปิดสำหรับการเชื่อมต่อ WAN คุณสามารถตั้งค่าตัวแก้ไขที่คุณชื่นชอบให้คำนึง$DISPLAYถึงได้

ตามปกติการตั้งค่าฝั่งเซิร์ฟเวอร์จะเข้าสู่การใช้งานของคุณ.profile(หรือ.bash_profileถ้าเชลล์ล็อกอินของคุณเป็นทุบตีและคุณใช้.bash_profileหรือ.zprofileหากล็อกอินเชลล์คือ zsh)

case ${SSH_CLIENT%% *}//$(/sbin/ifconfig |
                          sed -n 's/^.* addr:\([0-9][0-9.]*\) .*/\1/p' |
                          tr '\n' /)/ in
  "") :;;# local session
  10.42.*/10.42.*) :;; # LAN session
  1.2.3.*/1.2.3.*) :;; # LAN session
  *) unset DISPLAY;; # WAN session
esac
export EDITOR=vim
if [ -n "$DISPLAY" ] && type gvim >/dev/null 2>/dev/null; then
  EDITOR=gvim
fi
export VISUAL="$EDITOR"

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