ฉันต้องการกำหนดค่า SSH และหน้าจอเพื่อให้การเข้าสู่ระบบจะกลับไปที่หน้าจอตลอดเวลา เป็นการดีที่เซสชันนั้นจะไม่เลิก แต่แยกออกเมื่อฉันกด Cd สิ่งนี้จะสำเร็จได้อย่างไร และการตั้งค่าที่มีประโยชน์อื่น ๆ อีกมากมายที่ทำให้ SSH-life ของฉันง่ายขึ้น?
ฉันต้องการกำหนดค่า SSH และหน้าจอเพื่อให้การเข้าสู่ระบบจะกลับไปที่หน้าจอตลอดเวลา เป็นการดีที่เซสชันนั้นจะไม่เลิก แต่แยกออกเมื่อฉันกด Cd สิ่งนี้จะสำเร็จได้อย่างไร และการตั้งค่าที่มีประโยชน์อื่น ๆ อีกมากมายที่ทำให้ SSH-life ของฉันง่ายขึ้น?
คำตอบ:
ฉันเพิ่งทำสิ่งต่อไปนี้สำหรับเซิร์ฟเวอร์ทั้งหมดของฉันดังนั้นเมื่อฉันเชื่อมต่อผ่าน 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 ถ้าไม่มีอยู่หรือเชื่อมต่อใหม่หากมี สิ่งนี้ทำเพราะฉันมีเซสชันหน้าจออื่น ๆ ที่ทำงานแยกสำหรับบริการต่างๆและไม่ต้องการเชื่อมต่อกับพวกเขา
ฉันมีสิ่งต่อไปนี้ใน. 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
ฟังก์ชัน
ก่อนอื่นถ้าคุณใช้ byobu คุณสามารถกำหนดค่า shell session ใหม่ให้เริ่มต้น byobu โดยอัตโนมัติ (ซึ่งเป็นการกำหนดค่าหน้าจอที่ดีแม้ว่ารุ่นที่ใหม่กว่าอาจใช้ tmux เป็น backend) หากคุณไม่ต้องการ byobu หน้าจอแล้วคุณอาจจะสามารถตั้งค่าการเชื่อมต่อด้วยตนเองโดยการแก้ไขของคุณ.profile
เชลล์สคริปต์การกำหนดค่าอื่น ๆ หรือถ้าexec screen
TERM != "screen"
หากคุณไม่ชอบคุณสามารถใช้authorized_keys
ไฟล์เพื่อเรียกใช้คำสั่งเฉพาะสำหรับการเชื่อมต่อด้วยคีย์เฉพาะ (และคุณสามารถมีคีย์ได้มากเท่าที่คุณต้องการ) ดูman sshd
รายละเอียดที่ ฉันขอแนะนำให้คุณทำให้คำสั่งเรียกใช้สคริปต์ที่ตรวจสอบว่าหน้าจอกำลังทำงานและเชื่อมต่ออยู่หรือไม่หรือเริ่มเซสชันใหม่
สำหรับการตัดการเชื่อมต่อบน Ctrl-D, .screenrc
หน้าจอช่วยให้คุณสามารถตั้งค่าการแมปที่สำคัญในของคุณ ดูman screen
รายละเอียดที่ คุณกำลังมองหา "bindkey"
อาจไม่เกี่ยวข้องกับคำถามของคุณทั้งหมด แต่คุณเคยพิจารณาใช้ 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
screen -dAr default || screen -AS default
ทำงานได้สำหรับฉัน ฉันจะเพิ่มที่ฉัน~ / .bashrc
อธิบายสวิตช์สั้น ๆ :
d
- แยกหน้าจอหากยังเชื่อมต่ออยู่จากเซสชันอื่นA
- ปรับหน้าต่างในหน้าจอให้มีขนาดเทอร์มินัลใหม่r default
- แนบไปกับหน้าจอที่เรียกว่าเริ่มต้นหากคำสั่งหน้าจอแรก (คำสั่งก่อนหน้า||
นี้) ไม่สำเร็จคำสั่งที่สองจะถูกเรียกใช้:
A
- ตามที่อธิบายไว้ข้างต้น ...S default
- สร้างเซสชั่นหน้าจอใหม่ที่มีชื่อเริ่มต้นผมขอแนะนำให้ใช้byobu เครื่องมือนี้ใช้ tmux และให้แถบเครื่องมือที่ดี & เครื่องมืออำนวยความสะดวกในการสลับหน้าต่างฮอตคีย์ ฯลฯ
echo "new-session" >> ~/.byobu/.tmux.conf
echo "if [ -n '\$TMUX' ]; then :; else byobu attach; fi" >> ~/.bashrc
ด้วยคำสั่งข้างต้นหลังจากที่ SSH ประสบความสำเร็จในการเข้าสู่ระบบด้วยความพยายามและแนบไปกับเซสชั่น byobu-tmux ที่มีอยู่ถ้าไม่มันจะสร้างเซสชั่นใหม่