ฉันจะทำอย่างไรเพื่อกำหนดค่า SSH บนทั้งไคลเอนต์และเซิร์ฟเวอร์เพื่อป้องกันWrite Failed: broken pipe
ข้อผิดพลาด? มันมักจะเกิดขึ้นหากคุณนอนหลับคอมพิวเตอร์ไคลเอนต์ของคุณและดำเนินการในภายหลัง
screen
ไม่ได้อีกครั้ง (ตามรหัสออก) และเรียกคืนโดยใช้
ฉันจะทำอย่างไรเพื่อกำหนดค่า SSH บนทั้งไคลเอนต์และเซิร์ฟเวอร์เพื่อป้องกันWrite Failed: broken pipe
ข้อผิดพลาด? มันมักจะเกิดขึ้นหากคุณนอนหลับคอมพิวเตอร์ไคลเอนต์ของคุณและดำเนินการในภายหลัง
screen
ไม่ได้อีกครั้ง (ตามรหัสออก) และเรียกคืนโดยใช้
คำตอบ:
ฉันได้ลองใน/etc/ssh/ssh_config
Linux และ Mac แล้ว:
Host *
ServerAliveInterval 120
นี่คือความถี่ที่ควรจะส่งข้อความ keepalive ไปยังเซิร์ฟเวอร์ในไม่กี่วินาที หากไม่ได้ผลจงฝึกลิงให้กดทุกสองนาทีในขณะที่คุณทำงาน
คุณสามารถตั้งค่าได้ทั้งServerAliveInterval
ใน/etc/ssh/ssh_config
เครื่องไคลเอนต์หรือClientAliveInterval
ใน/etc/ssh/sshd_config
เครื่องเซิร์ฟเวอร์ ลองลดช่วงเวลาถ้าคุณยังพบข้อผิดพลาดอยู่
การกำหนดค่าสำหรับผู้ใช้คนเดียวสามารถตั้งค่าในไฟล์ได้~/.ssh/config
ทั้งบนเซิร์ฟเวอร์และฝั่งไคลเอ็นต์ chmod 644 ~/.ssh/config
ตรวจสอบให้แน่ใจไฟล์มีสิทธิ์ที่ถูกต้อง
Bad configuration option: ClientAliveInterval
Bad configuration option
ข้อผิดพลาดเดียวกันนี้ใน OSX 10.8.4
เซสชัน SSH อาจแตกเนื่องจากเหตุผลมากมายและอาจหลีกเลี่ยงไม่ได้
screen
ยูทิลิตี้ที่มีประโยชน์ที่สามารถนำมาใช้เพื่อลดปัญหาที่เกิดจากนี้จะเรียกว่า หน้าจอเป็นเครื่องมือที่ทรงพลังที่ช่วยให้คุณควบคุมเทอร์มินัลหลายตัวซึ่งจะมีชีวิตอยู่อย่างอิสระจากเซสชัน ssh ตัวอย่างเช่นหากคุณทำงานscreen
ในเซสชัน ssh คุณจะเห็นเทอร์มินัลใหม่เปิดอยู่และคุณสามารถใช้งานนั้นเพื่อรันงาน ให้บอกว่าเซสชั่น ssh ของคุณตายในกระบวนการ การทำงานscreen -d
จากนั้นscreen -r
จะเปิดเซสชันล่าสุดอีกครั้งและคุณจะสามารถดำเนินการต่อจากที่นั่นได้ ตรวจสอบให้แน่ใจว่าคุณอ่านเอกสารบางอย่างก่อนที่จะใช้
screen -d -r
เพื่อกู้คืนเซสชันล่าสุดของคุณได้อย่างสะดวก
screen -dr
หรือเพียงแค่ หรือscreen -x
ขึ้นอยู่กับสิ่งที่คุณวางแผนจะทำ ประเด็นคือเราควรรู้ว่าสวิตช์ทั้งหมดทำอะไรเพื่อให้สามารถใช้สวิตช์ที่เหมาะสมและไม่เพียงทำตามคำแนะนำของผู้ใช้อินเทอร์เน็ต มีบทสรุปขนาดกะทัดรัดที่ดีอยู่ที่นี่: ss64.com/bash/screen.html
การกำหนดค่าไคลเอนต์
ลองสร้างไฟล์:
~/.ssh/config
เพิ่มเนื้อหา:
Host *
ServerAliveInterval 30
ServerAliveCountMax 5
ตอนนี้ไปที่เซิร์ฟเวอร์ของคุณและดูว่าปัญหาของคุณได้รับการแก้ไขแล้วหรือไม่ ตัวเลือก ClientAliveInterval มีประโยชน์เฉพาะเมื่อกำหนดค่าเซิร์ฟเวอร์ ssh (aka sshd) แต่จะไม่เปลี่ยนแปลงสิ่งใด ๆ ในฝั่งไคลเอ็นต์ ssh ดังนั้นอย่าใช้ในไฟล์การกำหนดค่าด้านบน
นี่จะส่งสัญญาณสวัสดีคุณอยู่ที่นั่นไปยังเซิร์ฟเวอร์หากไม่ได้รับแพ็กเก็ตใน 30 วินาทีก่อนหน้า (ตามที่ระบุข้างต้น) อย่างไรก็ตามหากจำนวนของสัญญาณสวัสดี - คุณอยู่ที่นั่นติดต่อกันถึง ServerAliveCountMax ดังนั้น ssh จะตัดการเชื่อมต่อจากเซิร์ฟเวอร์ ค่านี้เป็นค่าเริ่มต้นที่ 3 (ดังนั้น 3 * 30 = 90 วินาทีโดยไม่มีกิจกรรมของเซิร์ฟเวอร์) เพิ่มขึ้นถ้ามันเหมาะสมกับความต้องการของคุณ มีตัวเลือกปรับแต่งมากมายให้กับไฟล์. ssh / config และคุณสามารถอ่านได้:
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกอื่น ๆ คุณอาจไม่ต้องการใช้สิ่งนี้กับเซิร์ฟเวอร์ทุกเครื่องที่คุณเชื่อมต่อกับตัวอย่างนี้ หรือ จำกัด ให้เฉพาะเซิร์ฟเวอร์โดยการแทนที่บรรทัดHost *
ด้วยHost <IP>
(แทนที่ด้วยที่อยู่ IP ดูที่ ssh_config man page)
การกำหนดค่าเซิร์ฟเวอร์
ในทำนองเดียวกันคุณสามารถบอกเซิร์ฟเวอร์ให้สุภาพกับลูกค้าของคุณ /etc/ssh/sshd_config
แฟ้มการกำหนดค่าที่ได้คือ
ClientAliveInterval 20
ClientAliveCountMax 5
คุณสามารถปิดใช้งานโดยการตั้งค่าClientAliveInterval
ไป0
หรือปรับแต่งClientAliveInterval
และClientAliveCountMax
การตั้งค่าการใช้งานของลูกค้า SSH สูงสุดโดยไม่ตอบสนองต่อฟิวส์ ข้อดีอย่างหนึ่งของการตั้งค่านี้ผ่าน TCPKeepAlive ก็คือสัญญาณจะถูกส่งผ่านแชนเนลที่เข้ารหัสดังนั้นจึงมีโอกาสน้อยที่จะถูกปลอมแปลงได้
ฉันอัปเกรดเซิร์ฟเวอร์ Ubuntu จากระยะไกลเป็นชัดเจนและสูญเสียการเชื่อมต่อ ssh ในระหว่างการอัปเกรดด้วยข้อความ "เขียนล้มเหลว Brocken pipe" ClientAliveInterval และ ServerAliveInterval ไม่ได้ทำอะไรเลย การแก้ปัญหาคือการเปิดตัวเลือก TCPKeepAlive ในไคลเอนต์ ssh:
TCPKeepAlive yes
ใน
/etc/ssh/ssh_config
สำหรับลูกค้าให้แก้ไขไฟล์~/.ssh/config
(หรือ/etc/ssh/ssh_config
) ของคุณดังนี้:
Host *
TCPKeepAlive yes
ServerAliveInterval 120
TCPKeepAlive - ระบุว่าระบบควรส่งข้อความ TCP keepalive ไปอีกด้านหนึ่งหรือไม่ หากพวกเขาถูกส่งความตายของการเชื่อมต่อหรือความผิดพลาดของหนึ่งในเครื่องจะสังเกตเห็นได้อย่างถูกต้อง อย่างไรก็ตามนี่หมายความว่าการเชื่อมต่อจะตายหากเส้นทางหยุดชั่วคราวและบางคนพบว่ามันน่ารำคาญ (ค่าเริ่มต้นคือ 'ใช่')
ServerAliveInterval - ตั้งค่าช่วงเวลาหมดเวลาเป็นวินาทีหลังจากนั้นหากไม่ได้รับข้อมูลจากเซิร์ฟเวอร์ ssh (1) จะส่งข้อความผ่านแชนเนลที่เข้ารหัสเพื่อร้องขอการตอบสนองจากเซิร์ฟเวอร์ ค่าเริ่มต้นคือ 0 ระบุว่าข้อความเหล่านี้จะไม่ถูกส่งไปยังเซิร์ฟเวอร์
สำหรับเซิร์ฟเวอร์ให้แก้ไข/etc/ssh/sshd_config
เป็น:
ClientAliveInterval 600
ClientAliveCountMax 0
หากคุณต้องการให้ไคลเอ็นต์ ssh ออก (หมดเวลา) โดยอัตโนมัติหลังจาก 10 นาที (600 วินาที)
ClientAliveCountMax - นี่เป็นการระบุจำนวนทั้งหมดของข้อความการตรวจสอบที่ส่งโดยเซิร์ฟเวอร์ ssh โดยไม่ได้รับการตอบสนองใด ๆ จากไคลเอ็นต์ ssh ค่าเริ่มต้นคือ 3
ClientAliveInterval - นี่เป็นการระบุการหมดเวลาเป็นวินาที หลังจาก x จำนวนวินาทีเซิร์ฟเวอร์ ssh จะส่งข้อความไปยังลูกค้าเพื่อขอการตอบสนอง Deafult เป็น 0 (เซิร์ฟเวอร์จะไม่ส่งข้อความถึงลูกค้าเพื่อตรวจสอบ)
ดูเพิ่มเติมที่: ตัวเลือกอะไรServerAliveInterval
และClientAliveInterval
ใน sshd_config ทำอย่างแม่นยำ?
ฉันรัก Mosh ฉันมักจะ ssh ลงในเซิร์ฟเวอร์ปิดแล็ปท็อปของฉันและไปที่ร้านกาแฟเปิดขึ้นและดำเนินการต่อราวกับว่าไม่มีอะไรเปลี่ยนแปลง
Mosh (เปลือกมือถือ)
แอปพลิเคชั่นเทอร์มินัลระยะไกลที่อนุญาตให้โรมมิ่งรองรับการเชื่อมต่อเป็นระยะและให้เสียงสะท้อนในตัวเครื่องและการแก้ไขการกดแป้นของผู้ใช้
Mosh แทน SSH มันแข็งแกร่งและตอบสนองได้ดียิ่งขึ้นโดยเฉพาะผ่าน Wi-Fi, เซลลูล่าร์และลิงค์ทางไกล
Mosh เป็นซอฟต์แวร์ฟรีสำหรับ GNU / Linux, FreeBSD, Solaris, Mac OS X และ Android
สำหรับฉันฉันได้รับWrite failed: Broken pipe
แม้ในขณะที่ฉันกำลังพิมพ์เป็นกลุ่มหรือที่พรอมต์เชลล์ ฉันไม่สามารถท่องอินเทอร์เน็ตในพื้นที่ได้ทั้งสักครู่ (ฉันกำลังเชื่อมต่อระยะไกลกับ Ubuntu โดยใช้ Terminal)
คนอื่น ๆ ในเครือข่ายของฉันสตรีมวิดีโอจำนวนมากจาก Netflix และที่อื่น ๆ ฉันไม่สามารถพิสูจน์ได้ แต่ฉันสงสัยว่าเป็นปัญหาของ ISP หรือเราเตอร์ ตัวอย่างเช่น Verizon และ Netflix กำลังชี้นิ้วมือกันเพื่อปัญหาเครือข่ายของลูกค้า
หากคุณมีการเชื่อมต่อผ่านสายโทรศัพท์และกำลังสตรีมมิ่งวิดีโอหรือเพลงด้วยการเชื่อมต่อ SSH หรือ telnet พร้อมกันในบางจุดคุณจะได้รับข้อความแสดงข้อผิดพลาด การอัพเกรดแพ็คเกจ ISP ของฉันดูเหมือนจะทำให้การเชื่อมต่อที่ใช้งานไม่บ่อย
ฉันโพสต์คำตอบของฉันที่นี่เนื่องจากไม่ใช่ Ubuntu VM
ssh -o IPQoS=throughput user@host
ฉันมีสคริปต์บนเซิร์ฟเวอร์ระยะไกลที่ไม่เคยดูเหมือนจะล้มเหลวโดยไม่คำนึงถึงไคลเอ็นต์หรือเซิร์ฟเวอร์การกำหนดค่า SSH
#!/bin/bash
while true; do date; sleep 10; done;
บันทึกลงในไฟล์ dummy.sh และเรียกใช้อย่างรวดเร็วก่อนที่จะย่อขนาดหน้าต่างหรือย้ายออกจากไฟล์ มันจะทำการพิมพ์การประทับเวลาปัจจุบันบนเซิร์ฟเวอร์และทำให้การเชื่อมต่อของคุณยังคงอยู่ตราบใดที่การเชื่อมต่อไม่ได้ลดลงด้วยเหตุผลอื่นใด เมื่อคุณกลับไปที่เทอร์มินัลเพียงกด CTRL + C และทำงานต่อไป
top
วิ่ง
คุณสามารถเพิ่ม args เหล่านี้ทุกครั้งที่คุณเรียกใช้ ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3
คุณไม่จำเป็นต้องแก้ไขไฟล์ / etc / ssh / * config หากคุณทำเช่นนี้
คุณสามารถสร้างนามแฝงทุบตีหรือฟังก์ชั่นหรือสคริปต์เพื่อให้ง่าย
เช่นฟังก์ชันทุบตีเหล่านี้คุณสามารถเพิ่มลงใน. bashrc ของคุณ do_ssh จะถูกใช้ด้วยตนเองเพื่อเปิด keepalives do_ssh_pty ถูกใช้ภายในสคริปต์เพื่อตั้งค่า pty และหลีกเลี่ยงพร้อมต์
do_ssh() {
ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}
do_ssh_pty() {
ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}
ตอนนี้do_ssh user@host
สามารถใช้งานได้do_ssh user@host <args> <command>
และจะมีการใช้งาน keepalives