หน้าจอเริ่มต้นโดยอัตโนมัติเมื่อเข้าสู่ระบบ ssh


19

ฉันอ่านเกี่ยวกับวิธีเริ่มหน้าจออัตโนมัติเมื่อฉันsshไปยังเซิร์ฟเวอร์ระยะไกล ฉันต้องการซับในแบบง่าย ๆ เพื่อเพิ่มใน.bash_profileการเริ่มต้นscreenเมื่อฉันsshเข้าและไม่ออกจากการเชื่อมต่อระยะไกลของฉันเมื่อฉันแยกหน้าจอ

ฉันได้รับการมองexec screenและสวยมากรวมกันของทุกคน-d, -r, -Dและ-Rและไม่สามารถคิดออกว่าธงที่ฉันต้องการ

เป็นการดีที่ฉันจะพิมพ์ssh whateverและเข้าสู่ระบบเซิร์ฟเวอร์ในใหม่screenหรือสามารถ reattach หน้าจอเก่าฉันต้องการทราบวิธีการทำทั้งสองเพื่อดูว่าฉันชอบที่ดีกว่า จากนั้นฉันสามารถพิมพ์Ctrl adหรือCtrl dให้พาฉันกลับไปที่การsshเข้าสู่ระบบปกติสำหรับเซิร์ฟเวอร์นั้น (ซึ่งคุณจะเห็น motd) จากตรงนั้นฉันสามารถscreen -rกลับไปที่หน้าจอใดก็ได้ที่ฉันต้องการหรือกดCtrl dอีกครั้งเพื่อออกจากระบบ

คำตอบ:


19

ง่าย ๆscreen -Rควรทำเคล็ดลับ

ในการตรวจสอบสิ่งนี้ฉันได้เพิ่ม. screen -Rbash_profile ของฉันบนเซิร์ฟเวอร์ระยะไกลเข้าสู่ระบบแยกออกจากหน้าจอและถูกส่งกลับไปที่พร้อมท์เชลล์ปกติบนเซิร์ฟเวอร์ระยะไกล ตรวจสอบกับ. bashrc เช่นกัน การเข้าสู่ระบบครั้งต่อมาให้ผลลัพธ์ที่คาดหวัง (แนบใหม่กับเซสชันหน้าจอ)


ขอบคุณ! ฉันกำลังอ่านหนังสืออยู่และฉันก็รู้สึกว่าฉันจะต้องใช้หน้าจอ exec -R ดีใจที่ใช้งานได้
Ronald Dregan

มันเป็นความคิดที่ดีที่จะวางlogoutหรือexitขวาหลังจากบรรทัดนั้นและเซสชัน ssh ถูกยกเลิกทันทีเมื่อหน้าจอถูกปิดโดย ctrl + D?
Griddo

สิ่งนี้ไม่ได้ผลสำหรับฉัน ฉันเริ่มหน้าจอไม่กี่โหลเนื่องจากมีการดำเนินการบรรทัดทุกครั้งที่เริ่มเซสชัน คุณทำอย่างไรเพื่อไม่ให้สิ่งนี้เกิดขึ้น?
โทมัส

11

ฉันมีปัญหากับการสร้างหน้าจอเรียงซ้อน 40 ครั้งด้วยวิธีแก้ปัญหาบางอย่างเมื่อเริ่มต้นหน้าต่างหรือเซสชันใหม่ ฉันสามารถกำจัดหน้าจอเรียงซ้อนและสร้างเซสชันใหม่หากไม่มีอยู่ในสิ่งนี้:

if [ -z "$STY" ]; then screen -R; fi

มันทดสอบว่าคุณอยู่ในเซสชั่นหน้าจอและทำงานscreen -Rหากคุณไม่ได้ หากไม่มีการทดสอบคุณจะได้รับ "การแนบจากภายในของหน้าจอ" คำเตือนจากหน้าจอทุกครั้งที่คุณสร้างหน้าต่างหน้าจอใหม่


+1 - เช่นนี้ดีกว่าการscreen -lsทดสอบที่ Tony พูดถึง
cwd

10

screen -RR จะกลับไปที่เซสชันที่พร้อมใช้งานครั้งแรกหรือสร้างใหม่หากจำเป็น


มันมีประโยชน์จริง ๆ เมื่อใช้หน้าจอ -R ทำให้ฉันมีปัญหากับการใช้งานหลายครั้ง
David V.

มันยอดเยี่ยมมากขอบคุณ! มันเชื่อมต่อกับเซสชัน "Detached" แรกที่พบ (หากมี) และละเว้นเซสชันที่แนบ ดังนั้นจึงอนุญาตให้คุณลงชื่อเข้าใช้และเปิดหลายหน้าต่างได้ แต่ยังคงตรวจสอบให้แน่ใจว่าแต่ละเซสชันมีการป้องกันการทำงานในหน้าจอ คน OPS ของเราขอบคุณ!
Ian McGowan

8

ถ้าฉันเข้าใจความต้องการของคุณคุณควรลอง:

if $(screen -ls | grep -q pts); then screen -x; else screen -R; fi

มันจะสร้างเซสชั่นหน้าจอเพียงครั้งเดียวมิฉะนั้นมันจะเชื่อมต่อกับเซสชั่นที่มีอยู่ในแบบหลายหน้าต่าง


ฉันชอบแนวคิดนี้สำหรับการรับรู้ว่าเรามีลูกค้า SSH หลายหน้าต่าง (หรือบางครั้งไปและเข้าสู่ระบบโดยตรงบนเครื่อง) มันค่อนข้างยืดหยุ่นหากคุณใช้บางอย่างเช่น Bitvise และเปิดหน้าต่างเทอร์มินัลหลายบาน - คุณสามารถเปลี่ยนหน้าต่างหน้าจอแยกเป็นหน้าต่างฟิสิคัลแยกกันได้
Piku

1
ทั้งหมดนี้สามารถถูกแทนที่ด้วยscreen -xRซึ่งดูเหมือนว่าจะถูกแยกวิเคราะห์เป็น "แนบถ้ามีบางสิ่งที่จะแนบไปทำให้หน้าจอใหม่"
Piskvor ออกจากอาคาร

0

นี่เป็นการขยายเล็กน้อย

สคริปต์สำหรับ bashrc ตรวจสอบว่ามีเซสชันหน้าจอที่แยกออกมากกว่าหนึ่งเซสชัน หากมีมากกว่านั้นคุณจะต้องเลือกเซสชั่นด้วยตนเอง เมื่อมีเซสชันที่แยกออกมาคุณจะกลับมาที่เซสชันนี้ หากคุณออกจากเซสชันเซสชัน ssh ก็จะปิดเช่นกัน

 #Start Screen
 if [ -z "$STY" ]; then

 value=$( screen -ls |grep '\<pts.*Detached\>' |wc -l )

 if [ $value -gt 1 ]; then

  screen -ls

 else

  screen -R

  echo 5 Sek. bis die SSH Session beendet wird.

  echo Strg + C - um ohne screen weiter zu arbeiten.

  sleep 6

  exit

 fi

fi

0

หากคุณต้องการเชื่อมต่อกับเซสชันหน้าจอโดยอัตโนมัติเมื่อคุณเชื่อมต่อผ่าน SSH ให้เพิ่มรหัสด้านล่างลงในเครื่องของคุณ.bash_profileหรือ.bashrcจากระยะไกลมันจะ:

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

นี่คือสคริปต์:

#!/bin/bash
#
#  Attaches to the first Detached Screen. Otherwise starts a new Screen.

# Only run if we are not already inside a running screen and only if in an SSH session.
if [[ -z "${STY}" && ! -z "${SSH_CLIENT}" ]]; then
  detached_screens=($(screen -ls | grep pts | grep -v Attached))

  for screen in "${detached_screens[@]}"; do
    if [[ "${screen}" == *".pts"* ]]; then
      IFS='.pts' read -ra split <<< "${screen}"
      for id in "${split[@]}"; do
        first_id="${id}"
        break
      done 
      break
    fi
  done

  screen -R $first_id
fi

PS: หากคุณต้องการเปิดใช้งานสิ่งนี้สำหรับสถานีท้องถิ่นให้ลบ&& ! -z "${SSH_CLIENT}บรรทัดแรก

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