วิธีการใช้งานหน้าจอและ SSH อย่างมีประสิทธิภาพ


12

ฉันต้องการกำหนดค่า SSH และหน้าจอเพื่อให้การเข้าสู่ระบบจะกลับไปที่หน้าจอตลอดเวลา เป็นการดีที่เซสชันนั้นจะไม่เลิก แต่แยกออกเมื่อฉันกด Cd สิ่งนี้จะสำเร็จได้อย่างไร และการตั้งค่าที่มีประโยชน์อื่น ๆ อีกมากมายที่ทำให้ SSH-life ของฉันง่ายขึ้น?

คำตอบ:


9

ฉันเพิ่งทำสิ่งต่อไปนี้สำหรับเซิร์ฟเวอร์ทั้งหมดของฉันดังนั้นเมื่อฉันเชื่อมต่อผ่าน SSH ฉันจะเข้าสู่เซสชันของหน้าจอโดยอัตโนมัติ

เพิ่มรายการต่อไปนี้ใน ~ / .bashrc สำหรับบัญชีผู้ใช้ของคุณ:

# Auto-screen invocation. see: http://taint.org/wk/RemoteLoginAutoScreen
# if we're coming from a remote SSH connection, in an interactive session
# then automatically put us into a screen(1) session.   Only try once
# -- if $STARTED_SCREEN is set, don't try it again, to avoid looping
# if screen fails for some reason.
if [ "$PS1" != "" -a "${STARTED_SCREEN:-x}" = x -a "${SSH_TTY:-x}" != x ] 
then
  STARTED_SCREEN=1 ; export STARTED_SCREEN
  screen -RR -S main || echo "Screen failed! continuing with normal bash startup"
fi
# [end of auto-screen snippet]

นี่จะเป็นการเริ่มเซสชันหน้าจอชื่อ main ถ้าไม่มีอยู่หรือเชื่อมต่อใหม่หากมี สิ่งนี้ทำเพราะฉันมีเซสชันหน้าจออื่น ๆ ที่ทำงานแยกสำหรับบริการต่างๆและไม่ต้องการเชื่อมต่อกับพวกเขา


ฉันแค่อยากจะเพิ่มว่าการผสมผสานคีย์ CTRL-d เป็นมาตรฐานในหน้าจอเพื่อแยกออกจากเซสชั่นหน้าจอที่ทำงานอยู่
ภูตแห่งความโกลาหล

8

ฉันมีสิ่งต่อไปนี้ใน. bash_profile ของฉันบนเซิร์ฟเวอร์ระยะไกล:

if [ -z "${STY}" -a -t 0 -a X${USER} = Xarcege ]; then
    reattach() {
        if [ -n "${SSH_AUTH_SOCK}" ]; then
            ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/agent-script"
            SSH_AUTH_SOCK="${HOME}/.ssh/agent-script" export SSH_AUTH_SOCK
        fi
        exec screen -A -D -RR ${1:+"$@"}
    }
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

สิ่งนี้ทำสองสิ่ง: ก่อนอื่นให้ตั้งค่าฟังก์ชั่นเชลล์เพื่อแทนที่เชลล์และดำเนินการเชื่อมต่อ ssh-agent ต่อไปสองเรียกใช้ฟังก์ชันหลังจากหยุดชั่วคราวสองสามวินาที (ในกรณีที่คุณไม่ต้องการให้หน้าจอเริ่มต้น)

ifประโยคแรกจะเป็นจริงถ้ายังไม่ได้เรียกใช้หน้าจอ ( -z "${STY}") เชื่อมต่อกับเทอร์มินัล ( -t 0) และฉันไม่ได้ใช้งาน sudo (ซึ่งบางครั้งก็ไม่เปลี่ยน$USER)

reattachฟังก์ชั่นแรกจะตรวจสอบว่า SSH ถูกเรียกด้วยพอร์ตตัวแทน ssh ที่ใช้งาน ( -n "${SSH_AUTH_SOCK}") จากนั้นมันจะแทนที่สิ่งที่อยู่ที่~/.ssh/agent-scriptไฟล์ซ็อกเก็ตที่ใช้งานในปัจจุบันและแทนที่ตัวแปรสภาพแวดล้อม ( $SSH_AUTH_SOCK) ด้วยค่าใหม่ จากนั้นสคริปต์จะแทนที่เชลล์ปัจจุบันด้วยscreenเซสชันเดียว(ตรวจสอบให้แน่ใจว่าควรมีเพียงหนึ่งเชลล์เท่านั้น) อาร์กิวเมนต์ใด ๆ ของreattachฟังก์ชันถูกส่งผ่านไปยังคำสั่ง ( ${1:+"$@"})

ส่วนสุดท้ายเป็นครั้งแรกเอาประชุมตายใด ๆ ( screen -wipe) ช่วยให้ผู้ใช้ (ฉัน) รู้ว่าหน้าจอที่จะเริ่มต้นในไม่ช้าและแทนที่จะสามารถกลับไปยังเปลือกโดยการกด-Ctrl Cจากนั้นจะรอ 5 วินาทีและเรียกใช้reattachฟังก์ชัน


4

ก่อนอื่นถ้าคุณใช้ byobu คุณสามารถกำหนดค่า shell session ใหม่ให้เริ่มต้น byobu โดยอัตโนมัติ (ซึ่งเป็นการกำหนดค่าหน้าจอที่ดีแม้ว่ารุ่นที่ใหม่กว่าอาจใช้ tmux เป็น backend) หากคุณไม่ต้องการ byobu หน้าจอแล้วคุณอาจจะสามารถตั้งค่าการเชื่อมต่อด้วยตนเองโดยการแก้ไขของคุณ.profileเชลล์สคริปต์การกำหนดค่าอื่น ๆ หรือถ้าexec screenTERM != "screen"

หากคุณไม่ชอบคุณสามารถใช้authorized_keysไฟล์เพื่อเรียกใช้คำสั่งเฉพาะสำหรับการเชื่อมต่อด้วยคีย์เฉพาะ (และคุณสามารถมีคีย์ได้มากเท่าที่คุณต้องการ) ดูman sshdรายละเอียดที่ ฉันขอแนะนำให้คุณทำให้คำสั่งเรียกใช้สคริปต์ที่ตรวจสอบว่าหน้าจอกำลังทำงานและเชื่อมต่ออยู่หรือไม่หรือเริ่มเซสชันใหม่

สำหรับการตัดการเชื่อมต่อบน Ctrl-D, .screenrcหน้าจอช่วยให้คุณสามารถตั้งค่าการแมปที่สำคัญในของคุณ ดูman screenรายละเอียดที่ คุณกำลังมองหา "bindkey"


2

อาจไม่เกี่ยวข้องกับคำถามของคุณทั้งหมด แต่คุณเคยพิจารณาใช้ TMUX แทน มันมีฟังก์ชั่นมากมายที่คุณกำลังมองหาอยู่นอกกรอบ

เช่น. หากคุณตัดการเชื่อมต่อจากเซสชัน SSH เมื่อคุณอยู่ภายใต้ TMUX สิ่งที่คุณต้องทำคือการย้อนกลับและเรียกใช้ "tmux a" เพื่อแนบกับเซสชันของคุณ ตั้งแต่ฉันเริ่มใช้ TMUX ฉันลืมคำสั่ง nohup / disown คือ ... หากคุณต้องการเรียกใช้บางสิ่งและออกจากระบบ - รันใน tmux และ detach เอาต์พุตคำสั่งจะถูกบัฟเฟอร์ดังนั้นคุณสามารถตรวจสอบได้ในภายหลัง

เพื่อแนบโดยอัตโนมัติคุณสามารถเพิ่มสิ่งที่ต้องการด้านล่างเพื่อ. bashrc:

[ -z $TMUX ] && tmux list-sessions 2>/dev/null && tmux a

หรือง่ายยิ่งขึ้น

tmux a 2>/dev/null

มันมีหน่วยความจำที่ต่ำกว่าและตัวเลือก IMHO โดยรวมที่ดีกว่า / ใช้งานง่ายกว่ามาก

ช็อตคัต meta-d คือการแม็พดีฟอลต์เพื่อแยกออกใน TMUX


0

screen -dAr default || screen -AS defaultทำงานได้สำหรับฉัน ฉันจะเพิ่มที่ฉัน~ / .bashrc

อธิบายสวิตช์สั้น ๆ :

  • d - แยกหน้าจอหากยังเชื่อมต่ออยู่จากเซสชันอื่น
  • A - ปรับหน้าต่างในหน้าจอให้มีขนาดเทอร์มินัลใหม่
  • r default - แนบไปกับหน้าจอที่เรียกว่าเริ่มต้น

หากคำสั่งหน้าจอแรก (คำสั่งก่อนหน้า||นี้) ไม่สำเร็จคำสั่งที่สองจะถูกเรียกใช้:

  • A - ตามที่อธิบายไว้ข้างต้น ...
  • S default- สร้างเซสชั่นหน้าจอใหม่ที่มีชื่อเริ่มต้น

0

ผมขอแนะนำให้ใช้byobu เครื่องมือนี้ใช้ tmux และให้แถบเครื่องมือที่ดี & เครื่องมืออำนวยความสะดวกในการสลับหน้าต่างฮอตคีย์ ฯลฯ

echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc

ด้วยคำสั่งข้างต้นหลังจากที่ SSH ประสบความสำเร็จในการเข้าสู่ระบบด้วยความพยายามและแนบไปกับเซสชั่น byobu-tmux ที่มีอยู่ถ้าไม่มันจะสร้างเซสชั่นใหม่

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