Bagaimana mencegah "tulis gagal: pipa rusak" pada koneksi SSH?

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

Saya telah mencoba ini di /etc/ssh/ssh_config untuk Linux dan Mac:

Host *ServerAliveInterval 120

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

Anda bisa mengatur baik ServerAliveInterval di /etc/ssh/ssh_config dari mesin klien atau ClientAliveInterval di /etc/ssh/sshd_config dari mesin server. Coba kurangi interval jika Anda masih mendapatkan kesalahan.

Konfigurasi untuk satu pengguna dapat diatur dalam file ~/.ssh/config baik di sisi server maupun klien. Pastikan file memiliki izin yang benar chmod 644 ~/.ssh/config.

Sesi SSH dapat rusak karena banyak dan mungkin alasan yang tidak dapat dihindari.

Sebuah utilitas yang berguna yang dapat digunakan untuk mengurangi masalah yang disebabkan oleh ini disebut screen. Layar adalah utilitas yang kuat yang memungkinkan Anda untuk mengontrol beberapa terminal yang akan tetap hidup secara independen dari sesi ssh. Misalnya, jika Anda menjalankan screen dalam sesi ssh Anda akan melihat terminal baru terbuka dan Anda dapat menggunakannya untuk menjalankan pekerjaan. Katakanlah sesi ssh Anda mati dalam prosesnya. Berlari screen -d kemudian screen -r akan membuka kembali sesi terakhir dan Anda akan dapat melanjutkan dari sana. Pastikan Anda membaca beberapa dokumentasi sebelum menggunakannya.

Konfigurasi klien

Coba buat file:

~/.ssh/config

Tambahkan isi:

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 terputus dari server. Nilai ini default ke 3 (jadi 3 * 30 = 90 detik tanpa aktivitas server), tingkatkan jika sesuai dengan kebutuhan anda. Ada banyak pilihan konfigurasi lebih ke .ssh / config file dan Anda bisa membaca:

Menggunakan file konfigurasi SSH

Untuk informasi lebih lanjut tentang pilihan lain. Anda mungkin tidak ingin menerapkan ini ke setiap server yang Anda sambungkan ke mana contoh ini akan. Atau menahannya hanya ke server tertentu dengan mengganti saluran Host * dengan Host <IP> (ganti dengan alamat IP, lihat halaman manual ssh_config).

Konfigurasi Server

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

ClientAliveInterval 20ClientAliveCountMax 5

Anda dapat menonaktifkannya dengan mengatur ClientAliveInterval untuk 0 atau tweak ClientAliveInterval dan ClientAliveCountMax untuk mengatur klien ssh maksimum tidak aktif tanpa menanggapi probe. Salah satu keuntungan dari pengaturan ini dibandingkan TCPKeepAlive adalah bahwa sinyal dikirim melalui saluran terenkripsi, sehingga kecil kemungkinannya untuk menjadi spoofable.

Saya mengupgrade server Ubuntu dari jarak jauh dari lucid ke precise dan kehilangan koneksi ssh di tengah upgrade dengan pesan "Write failed. Pipa rusak". ClientAliveInterval dan ServerAliveInterval tidak melakukan apa pun. Solusinya adalah dengan mengaktifkan opsi TCPKeepAlive di klien ssh:

TCPKeepAlive yes

di

/etc/ssh/ssh_config

Semoga ini bisa membantu

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

Host *  TCPKeepAlive yes  ServerAliveInterval 120

TCPKeepAlive - Menentukan apakah sistem harus mengirim pesan TCP keepalive ke sisi lain. Jika mereka dikirim, kematian koneksi atau crash dari salah satu mesin akan diperhatikan dengan benar. Namun, ini berarti koneksi akan mati jika rute mati sementara, dan beberapa orang merasa mengganggu (defaultnya adalah 'ya').

ServerAliveInterval - Menetapkan interval waktu habis dalam hitungan detik setelah itu 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 /etc/ssh/sshd_config as:

ClientAliveInterval 600ClientAliveCountMax 0

Jika Anda ingin klien ssh keluar (timeout) secara otomatis setelah 10 menit (600 detik).

ClientAliveCountMax – Ini menunjukkan jumlah total pesan checkalive yang dikirim oleh server ssh tanpa mendapatkan respons apa pun dari klien ssh. Defaultnya adalah 3.

Klientaliveinterval – Ini menunjukkan batas waktu dalam hitungan detik. Setelah X jumlah detik, Server ssh akan mengirim pesan ke klien meminta respon. Deafult adalah 0 (server tidak akan mengirim pesan ke klien untuk memeriksa.).


Lihat juga: Apa pilihan ServerAliveInterval dan ClientAliveInterval dalam sshd_config lakukan, tepatnya?

Aku benar-benar mencintai Mosh. Saya sering ssh ke server, menutup laptop saya dan pergi ke kafe, membukanya dan melanjutkan seolah-olah tidak ada yang berubah.

Mosh (shell seluler)

Aplikasi terminal jarak jauh yang memungkinkan roaming, mendukung konektivitas intermiten, dan memberikan kecerdasan gema lokal dan pengeditan baris penekanan tombol pengguna.

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

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

Bagi saya, saya mendapatkan Write failed: Broken pipe bahkan ketika saya aktif mengetik di vim atau di prompt shell. Saya juga tidak dapat menjelajahi internet secara lokal untuk sementara waktu. (Saya menghubungkan jarak jauh ke Ubuntu menggunakan Terminal.)

Orang lain di jaringan saya mengalirkan banyak video dari Netflix dan tempat lain. Saya tidak dapat membuktikannya, tetapi saya menduga ini adalah masalah ISP atau router. Misalnya, Verizon dan Netflix saling menunjuk satu sama lain untuk masalah jaringan pelanggan mereka.

Jika Anda memiliki koneksi dial-up dan streaming video atau musik dengan koneksi SSH atau telnet simultan, tidak dapat dihindari pada titik tertentu anda akan mendapatkan pesan pipa yang rusak. Memutakhirkan paket broadband ISP saya sepertinya membuat koneksi saya terputus lebih jarang.

Saya memposting jawaban saya di sini, karena itu bukan VM Ubuntu.

https://unix.stackexchange.com/questions/259225/packet-write-wait-broken-pipe-even-leaving-top-running

ssh -o IPQoS=throughput user@host

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

#!/bin/bashwhile true; do date; sleep 10; done;

Simpan ke beberapa dummy.sh file dan cepat menjalankannya sebelum Anda meminimalkan jendela atau menjauh dari itu. Ini akan terus mencetak cap waktu saat ini di server dan menjaga koneksi Anda tetap hidup selama koneksi tidak terputus oleh alasan lain. Ketika Anda kembali ke terminal itu, tekan saja CTRL + C dan terus bekerja.

Anda dapat menambahkan argumen ini setiap kali Anda memanggil ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

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

Anda dapat membuat alias bash atau fungsi atau script untuk membuat ini mudah.

Misalnya fungsi bash ini, Anda dapat menambahkan ke anda .bashrc, do_ssh digunakan secara manual untuk mengaktifkan keepalives. do_ssh_pty digunakan 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@host dapat digunakan atau do_ssh user@host <args> <command> dan keepalives akan aktif.

@ DavidL Anda harus membaca pertanyaan lebih baik sebelum mengomel. Masalah Anda tidak sama dengan OP, yang dengan jelas menyebutkan menempatkan komputer untuk tidur. Yang dengan cara hanya salah satu alamat jawaban (“mosh”), dan itu diposting 2 tahun setelah pertanyaan. Namun jawaban lain melakukan hal terbaik berikutnya, yaitu mengusulkan solusi untuk kasus yang dapat diselesaikan dengan lebih mudah, seperti milik anda. Tenang, jangan terlalu stres, mengomel tidak ada gunanya di sini…

Tidak ada yang benar-benar. Sesi terganggu, dan keamanan sesi terganggu. Jika Anda tidak menempatkan comp tidur Anda dapat mengatur tetap hidup waktu untuk klien untuk menembak tetap hidup jantung berdetak ke server, tetapi jika sistem akan tidur maka tidak ada yang bisa dilakukan.

Anda salah: saya memiliki dua mesin klien desktop yang terhubung ke server yang 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, mengesampingkan yang lain dan dalam instalasi baru; setelah beberapa menit, ia memblokir dirinya sendiri dengan pesan ini. Fungsi jaringan lainnya di mesin tidak terganggu. Jadi tidak, Ini bukan masalah jaringan, atau masalah server, tetapi masalah perangkat lunak klien SSH tertentu, yang dapat diselesaikan, berlawanan dengan apa yang berani dikatakan “darkdragan”, bahwa “tidak ada yang bisa dilakukan”.

Dalam hal ini saya mencari sesuatu yang memungkinkan saya untuk memulai kembali koneksi ssh yang rusak (mungkin berdasarkan kode keluar) dan memulihkan menggunakan layar?

Dan memang, seperti yang saya katakan: orang-orang berbicara terlalu banyak ketika mereka mengatakan “tidak ada yang bisa dilakukan”, sama seperti @darkdragn berani. Saya membaca jawaban Aram Kocharyan, dan saya menerapkannya: 20 menit yang lalu… Saya menyadari bahwa di Quantal Ubuntu 12.10 lama saya, saya telah menerapkan instruksi itu dalam file itu [saya baru saja memeriksa], dua tahun lalu, dan itulah alasan stabilitas di sana. Saya melakukannya di sini, dan dalam 20 menit terakhir ini, koneksi telah stabil sejak saat itu. Jadi tolong, orang-orang: menahan diri ketika berani berpikir bahwa “tidak ada yang bisa dilakukan”, dan menahan diri bahkan lebih ketika mencoba untuk meninggalkan pesan itu kepada orang lain.

@ DavidL setuju bahwa naysaying dapat mengganggu, esp dari posisi ketidaktahuan.

Namun, sepertinya Anda juga menganggapnya sedikit pribadi (alias anak laki-laki ranty). darkdragn prob berarti Baik

Sesi SHH memutar kunci enkripsi dari waktu ke waktu, untuk mencegah serangan brute force skala waktu yang lama. Tidur / Lanjutkan akan merusak keamanan ini dan koneksi.

Tidak ada yang menyenangkan seperti situasi berikut. Seseorang yang mengatakan:" itu tidak bisa dilakukan / tidak ada yang bisa dilakukan", dijawab atau diinterupsi oleh seseorang yang mengatakan: "Lihat… Sudah selesai, dan itu mudah " @ darkdragn

Masalah yang sama dalam jaringan ketika dua perangkat dengan alamat yang sama.
Matikan salah satunya dan masalahnya terpecahkan.