Bagaimana mencegah “Write Failed: broken pipe” pada koneksi SSH?

283

Apa yang dapat saya lakukan untuk mengonfigurasi SSH pada klien dan server untuk mencegah Write Failed: broken pipekesalahan? Ini sering terjadi jika Anda tidur komputer klien Anda dan melanjutkan nanti.

Sorin
sumber
8
Tidak ada yang benar-benar. Sesi terputus, dan keamanan sesi terganggu. Jika Anda tidak membuat komputer tidur, Anda dapat mengatur waktu tetap hidup bagi klien untuk menembak jantung tetap hidup ke server, tetapi jika sistem akan tidur maka tidak ada yang bisa dilakukan.
darkdragn
3
Dalam hal ini saya sedang mencari sesuatu yang akan memungkinkan saya untuk memulai kembali koneksi ssh yang rusak (mungkin didasarkan pada kode keluar) dan mengembalikan menggunakan screen?
sorin
4
Kalian salah: Saya memiliki dua mesin klien desktop yang terhubung ke server SAMA. Salah satunya adalah ubuntu 12.10, Quantal, yang klien SSH-nya berfungsi dengan baik, dan menjaga koneksi selama berjam-jam. Yang lainnya adalah Ubuntu 14.10, Utopic, di samping yang lain dan dalam instalasi baru; setelah beberapa menit, ia memblokir dirinya dengan pesan ini. Sisa fungsi jaringan di mesin tidak terganggu. Jadi tidak, ini bukan masalah jaringan, atau masalah server, tetapi masalah perangkat lunak SSH CLIENT spesifik, yang DAPAT dipecahkan, berlawanan dengan apa yang "darkdragan" berani katakan, bahwa "tidak ada yang bisa dilakukan".
David L
2
Dan memang, seperti yang saya katakan: orang berbicara terlalu banyak ketika mereka mengatakan "tidak ada yang bisa dilakukan", seperti @darkdragn berani. Saya membaca jawaban Aram Kocharyan, dan saya menerapkannya: 20 menit yang lalu ... Saya menyadari bahwa dalam Quantal Ubuntu 12.10 saya yang lama, saya telah menerapkan instruksi itu dalam file itu [saya baru memeriksa], dua tahun lalu, dan itu adalah alasan stabilitas di sana. Saya melakukannya di sini, dan dalam 20 menit terakhir ini, koneksi telah stabil sejak saat itu. Jadi tolong, orang-orang: hentikan dirimu ketika berani berpikir bahwa "tidak ada yang bisa dilakukan", dan lebih banyak menahan diri ketika mencoba menyerahkan pesan itu kepada orang lain.
David L
11
@ DavidL Anda harus membaca pertanyaan dengan lebih baik sebelum mengomel. Masalah Anda tidak sama dengan masalah OP, yang jelas-jelas menyebutkan untuk mematikan komputer. Yang omong-omong hanya satu dari jawaban alamat ("mosh"), dan itu diposting 2 tahun setelah pertanyaan. Namun jawaban lain melakukan hal terbaik berikutnya, yaitu mengusulkan solusi untuk kasus-kasus yang dapat diselesaikan dengan lebih mudah, seperti milik Anda. Tenang, jangan terlalu stres, mengoceh tidak ada gunanya di sini ...
msb

Jawaban:

266

Saya sudah mencoba ini /etc/ssh/ssh_configuntuk Linux dan Mac:

Host *
ServerAliveInterval 120

Ini adalah seberapa sering, dalam hitungan detik, ia harus mengirim pesan keepalive ke server. Jika itu tidak berhasil, latih monyet untuk menekan enter setiap dua menit saat Anda bekerja.

Anda bisa mengatur ServerAliveIntervaldi /etc/ssh/ssh_configmesin klien atau ClientAliveIntervaldi /etc/ssh/sshd_configmesin server. Coba kurangi intervalnya jika Anda masih mendapatkan kesalahan.

Konfigurasi untuk satu pengguna dapat diatur dalam file ~/.ssh/configdi sisi server dan klien. Pastikan file tersebut memiliki izin yang benar chmod 644 ~/.ssh/config.

Aram Kocharyan
sumber
4
Saya tidak menggunakan Mac, tetapi Ubuntu 12.04 dan file untuk sistem operasi ini juga tampaknya ~ / .ssh / config.
H2ONaCl
5
OS X 10.8.4 memberikan kesalahanBad configuration option: ClientAliveInterval
ohho
3
Saya mendapatkan Bad configuration optionkesalahan yang sama di OSX 10.8.4.
Nick Heiner
10
Secara umum, Anda menempatkan kedua perintah ini ke berbagai bagian sistem. Hanya ServerAliveInterval di sisi klien OSX ... dan hanya ClientAliveInterval di file konfigurasi sshd ...
ftrotter
2
Monyet saya berkata kepada saya: "Mengapa Anda tidak mengetik sendiri 'top [ENTER]'
augusto
85

Sesi SSH dapat rusak karena berbagai alasan dan mungkin tidak dapat dihindari.

Utilitas yang bermanfaat yang dapat digunakan untuk mengurangi masalah yang disebabkan oleh hal ini disebut screen. Layar adalah utilitas kuat yang memungkinkan Anda untuk mengontrol beberapa terminal yang akan tetap hidup terlepas dari sesi ssh. Misalnya, jika Anda menjalankan screensesi ssh, Anda akan melihat terminal baru terbuka dan Anda dapat menggunakannya untuk menjalankan pekerjaan. Katakanlah sesi ssh Anda mati dalam proses. Menjalankan screen -dlalu screen -rakan membuka kembali sesi terakhir dan Anda akan dapat melanjutkan dari sana. Pastikan Anda membaca beberapa dokumentasi sebelum menggunakannya.

eltommo
sumber
5
Ini mungkin jawaban terbaik, saya tidak yakin mengapa itu tidak dipilih lebih tinggi. "Perbaikan" lainnya membantu dalam kasus khusus di mana Anda benar-benar peduli tentang mempertahankan koneksi SSH, tetapi dalam kebanyakan kasus penggunaan saya membayangkan kekhawatiran sebenarnya adalah bahwa proses yang dimaksudkan terus berjalan, terlepas dari masalah koneksi klien / server apa pun .
Paul McMurdie
16
Saya juga akan menambahkan Tmux sebagai alternatif untuk layar. Saya merasa lebih fleksibel dan stabil daripada layar.
fridaymeetssunday
2
hanya meninggalkan ini di sini untuk referensi di masa mendatang - Anda dapat dengan mudah menjalankan screen -d -runtuk memulihkan sesi terakhir Anda.
doplumi
2
Atau sederhananya screen -dr. Atau screen -xtergantung pada apa yang Anda rencanakan untuk dilakukan. Intinya adalah, orang harus tahu apa yang dilakukan semua switch itu, sehingga orang dapat menggunakan yang sesuai dan tidak hanya mengikuti saran orang internet secara membuta. Ada ringkasan ringkas yang bagus tersedia di sini: ss64.com/bash/screen.html
flith
Ini bukan jawaban untuk masalah
user3728501
46

Konfigurasi klien

Coba buat file:

~/.ssh/config

Tambahkan konten:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Sekarang ssh ke server Anda dan lihat apakah masalah Anda sudah diperbaiki. Opsi ClientAliveInterval hanya berguna ketika mengkonfigurasi server ssh (alias sshd), itu tidak mengubah apa pun di sisi klien ssh, jadi jangan menggunakannya dalam file konfigurasi di atas.

Ini akan mengirimkan sinyal hello-are-you-there ke server jika tidak ada paket yang diterima dalam 30 detik sebelumnya (seperti yang ditentukan di atas). Namun, jika jumlah sinyal hello-are-you-there berturut-turut mencapai ServerAliveCountMax maka ssh akan memutuskan sambungan dari server. Nilai ini default ke 3 (jadi 3 * 30 = 90 detik tanpa aktivitas server), tingkatkan jika sesuai dengan kebutuhan Anda. Ada banyak opsi konfigurasi lainnya untuk file .ssh / config dan Anda dapat membaca:

Menggunakan File Konfigurasi SSH

Untuk informasi lebih lanjut tentang opsi lain. Anda mungkin tidak ingin menerapkan ini ke setiap server yang Anda hubungkan dengan contoh ini. Atau tahan hanya ke server tertentu dengan mengganti baris Host *dengan Host <IP>(ganti dengan alamat IP, lihat halaman manual ssh_config).

Konfigurasi server

Demikian pula Anda dapat memberi tahu server untuk bersikap lembut dengan klien Anda. File konfigurasi adalah /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Anda dapat menonaktifkannya dengan mengatur ClientAliveIntervalke 0atau tweak ClientAliveIntervaldan ClientAliveCountMaxuntuk mengatur aktivitas klien ssh maksimum tanpa menanggapi probe. Salah satu keuntungan dari pengaturan ini melalui TCPKeepAlive adalah bahwa sinyal dikirim melalui saluran terenkripsi, sehingga lebih kecil kemungkinannya untuk dipalsukan.

Mat
sumber
Itu tidak bekerja. Saya menghadapi kesalahan yang sama lagi.
user997704
3
Cobalah langsung dari baris perintah dan turunkan: ssh -o ServerAliveInterval = 5 user @ host
Matt
Sudah mencobanya juga. Tidak berhasil. Saya benar-benar tidak tahu apa yang terjadi dengan sistem saya
user997704
2
Ini ClientAliveCountMax, BUKAN ClientAliveMaxCount
David G
@ DavidV Harap edit jawaban dengan koreksi Anda.
CivMeierFan
23

Saya memperbarui server Ubuntu dari jarak jauh ke jernih dan kehilangan koneksi ssh di tengah peningkatan dengan pesan "Write gagal. Brocken pipe". ClientAliveInterval dan ServerAliveInterval tidak melakukan apa pun. Solusinya adalah dengan mengaktifkan opsi TCPKeepAlive di klien ssh:

TCPKeepAlive yes

di

/etc/ssh/ssh_config
Alexey Sviridov
sumber
20

Untuk klien, edit file ~/.ssh/config(atau /etc/ssh/ssh_config) Anda sebagai berikut:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Menentukan apakah sistem harus mengirim pesan keepalive TCP ke sisi lain. Jika dikirim, kematian koneksi atau kerusakan salah satu mesin akan diperhatikan dengan benar. Namun, ini berarti koneksi akan mati jika rute turun sementara, dan beberapa orang menganggapnya menjengkelkan (Standarnya adalah 'ya').

ServerAliveInterval - Menetapkan interval waktu habis dalam hitungan detik yang setelahnya jika tidak ada data yang diterima dari server, ssh (1) akan mengirim pesan melalui saluran terenkripsi untuk meminta tanggapan dari server. Standarnya adalah 0, menunjukkan bahwa pesan-pesan ini tidak akan dikirim ke server.


Untuk server, edit Anda /etc/ssh/sshd_configsebagai:

ClientAliveInterval 600
ClientAliveCountMax 0

Jika Anda ingin ssh client keluar (batas waktu) secara otomatis setelah 10 menit (600 detik).

ClientAliveCountMax - Ini menunjukkan jumlah total pesan pemeriksaan yang dikirim oleh server ssh tanpa mendapat respons dari klien ssh. Defaultnya adalah 3.

ClientAliveInterval - Ini menunjukkan batas waktu dalam detik. Setelah x jumlah detik, server ssh akan mengirim pesan ke klien yang meminta tanggapan. Deafult adalah 0 (server tidak akan mengirim pesan ke klien untuk diperiksa.).


Lihat juga: Apa yang dilakukan opsi ServerAliveIntervaldan ClientAliveIntervaldi sshd_config, tepatnya?

kenorb
sumber
Mengatur ServerAliveCountMax lebih tinggi dari standar pada klien juga harus membantu menjaga koneksi tetap hidup untuk koneksi yang lambat.
jonnyjandles
17

Saya benar-benar mencintai Mosh. Saya sering ssh ke server, tutup laptop saya dan pergi ke kafe, buka dan lanjutkan seolah-olah tidak ada yang berubah.

Mosh (shell ponsel)

Aplikasi terminal jarak jauh yang memungkinkan roaming , mendukung konektivitas terputus-putus , dan menyediakan gema lokal yang cerdas dan pengeditan garis penekanan tombol pengguna.

Mosh adalah pengganti SSH. Ini lebih kuat dan responsif, terutama melalui Wi-Fi, seluler, dan sambungan jarak jauh.

Mosh adalah perangkat lunak gratis, tersedia untuk GNU / Linux, FreeBSD, Solaris, Mac OS X, dan Android.

Jake
sumber
6

Bagi saya, saya mendapatkan Write failed: Broken pipebahkan ketika saya sedang aktif mengetikkan vim atau pada prompt shell. Saya tidak bisa menjelajah internet secara lokal untuk sementara waktu. (Saya menghubungkan dari jarak jauh ke Ubuntu menggunakan Terminal.)

Orang lain di jaringan saya mengalirkan banyak video dari Netflix dan tempat lain. Saya tidak bisa membuktikannya, tapi saya curiga ini masalah ISP atau router. Sebagai contoh, Verizon dan Netflix saling menunjuk satu sama lain untuk masalah jaringan pelanggan mereka.

Jika Anda memiliki koneksi dial-up dan mengalirkan video atau musik dengan koneksi SSH atau telnet secara simultan, pada beberapa titik tidak terhindarkan Anda akan mendapatkan pesan pipa yang rusak. Memutakhirkan paket broadband ISP saya sepertinya membuat koneksi saya yang rusak semakin jarang.

Parag
sumber
3

Saya memiliki skrip di server jarak jauh yang sepertinya tidak pernah gagal, terlepas dari klien atau server konfigurasi SSH.

#!/bin/bash
while true; do date; sleep 10; done;

Simpan ke beberapa file dummy.sh dan jalankan dengan cepat sebelum Anda meminimalkan jendela atau menjauh darinya. Ini akan terus mencetak stempel waktu saat ini di server dan menjaga koneksi Anda tetap hidup selama koneksi tidak dibatalkan oleh alasan lain. Ketika Anda kembali ke terminal itu, cukup tekan CTRL + C dan terus bekerja.

JulioHM
sumber
9
atau cukup topberjalan
Eben Geer
1

Anda dapat menambahkan args ini setiap kali Anda menjalankan ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Anda tidak perlu mengedit file / etc / ssh / * jika Anda melakukan ini.

Anda dapat membuat alias bash atau fungsi atau skrip untuk mempermudah ini.

Misalnya fungsi bash ini, Anda dapat menambahkan ke .bashrc Anda, do_ssh digunakan secara manual untuk mengaktifkan keepalives. do_ssh_pty digunakan di dalam skrip untuk mengatur pty dan menghindari prompt.

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 $*
}

Sekarang do_ssh user@hostdapat digunakan atau do_ssh user@host <args> <command>dan keepalives akan aktif.

gaoithe
sumber