ฉันจะป้องกันการออกจาก tmux ด้วย Ctrl-d ได้อย่างไร?


30

ฉันใช้ tmux บนเซิร์ฟเวอร์ของฉันและเมื่อเร็ว ๆ นี้ฉันพบว่าค่าใช้จ่ายของฉันที่ ctrl-d จะออกจาก tmux และสูญเสียข้อมูลเซสชันทั้งหมดความตั้งใจของฉันคือการสิ้นสุดเซสชัน ssh แต่ล้มเหลวที่จะสังเกตเห็นว่าฉันยังอยู่ใน tmux จนกระทั่งสายเกินไป

ฉันรู้ว่าฉันควรใช้ความระมัดระวังในอนาคตเมื่อใช้ ctrl-d แต่ฉันสงสัยว่ามีวิธีป้องกัน tmux สำหรับการออกเมื่อกดปุ่ม ctrl-d โดยบังเอิญหรือไม่? วิธีการแก้ปัญหาเช่นพรอมต์การยืนยันหรือการถอดจะดี

คำตอบ:


35

เพื่อความแม่นยำCtrldไม่ออกtmuxแต่เป็นเปลือก หากเชลล์นั้นกำลังทำงานในบานหน้าต่างเดียวของหน้าต่างสุดท้ายในtmuxเซสชันเซสชันจะสิ้นสุดและtmuxไคลเอ็นต์ออก

เพื่อป้องกันไม่ให้Ctrldออกจากเชลล์คุณสามารถตั้งค่าIGNOREEOFตัวแปรเชลล์หรือตั้งค่าignoreeofตัวเลือกเชลล์ ใส่หนึ่งในสิ่งต่อไปนี้ใน.bashrcไฟล์ของคุณ:

IGNOREEOF=10   # Shell only exists after the 10th consecutive Ctrl-d

set -o ignoreeof  # Same as setting IGNOREEOF=10

6
ขอบคุณมาก ฉันต้องการเพียง แต่สำหรับ tmux ดังนั้นผมจึงใช้set-environment -g 'IGNOREEOF' 2ใน.tmux.confและตอนนี้ฉันต้องกดปุ่ม Ctrl-D 3 ครั้งเพื่อออกและนอกจากนี้ผมยังเตือนทุกครั้งที่มีข้อความ: Use "logout" to leave the shell.
Cas

7
การตั้งค่าตัวแปรสภาพแวดล้อม IGNOREEOF ไม่มีผลใน zsh แต่ "set -o igneof" หรือ "setopt igneof" ทำ
sgtpep

11

IGNOREEOFไม่ทำงานสำหรับฉันดังนั้นฉันเพิ่งผูกCtrl+ Dเพื่อเป็นdetach. tmux.conf:

bind-key -n C-d detach

-nหมายความว่าไม่มีลำดับหนีก่อนที่จำเป็นเช่น tmux คำนำหน้า


หนึ่งปีครึ่งหลังจากนั้นIGNOREOFไม่ได้ทำงานให้ฉันมาก่อนตั้งแต่ฉันใช้ zsh setopt ignoreeofใน.zshrcงาน แต่ผมต้องฆ่าทุกการประชุม tmux สำหรับ tmux .zshrcแหล่งที่มา บางทีฉันอาจจะมีที่มา.zshrcจากภายใน tmux ...
โรห์เมอ

1
ฉันได้ใช้นี้ แต่ก็มีข้อ จำกัด ที่น่ารำคาญมันแยกใด ๆ Ctrl + D cat > some_new_file.txtไม่ว่าจะถูกส่งไปยังเปลือกหรือสิ่งที่ต้องการ
หมดเวลา Danila

นี้ แต่มีผลข้างเคียงใน tmux ^Dกับบานหน้าต่างเปิดกว้างมากขึ้นในขณะที่มันไม่ยอมให้คุณปิดบานหน้าต่างด้วย
นายเทาร

ปรับปรุงสำหรับผู้ที่ต้องการเพียงเพื่อให้หน้าต่าง / บานหน้าต่างสุดท้าย:bind -n C-d if-shell -b 'USHELL="$(basename "$(getent passwd $USER | cut -d: -f7)")"; [ $(tmux list-windows | wc -l) -eq 1 -a $(tmux list-panes | wc -l) -eq 1 -a $(pstree $PPID | egrep "\\b$USHELL\$" | grep -o $USHELL | wc -l) -eq 1 ]' detach 'send C-d'
เฟรดเดอริกจาง

1
@Rohmer, prezto สอนให้ฉันใช้exec zshรีสตาร์ท zsh ภายใน tmux เมื่อฉันเล่นกับ. zshrc
krry

6

นอกจากchepner ของคำตอบที่คุณสามารถหยุดขั้วจากการส่ง EOF ทั้งหมดโดยการตั้งค่าeofไปundefด้วยstty:

stty eof undef

รีเซ็ตด้วย:

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