Pertanyaan Bagaimana cara mencegah "Tulis Gagal: pipa rusak" pada koneksi SSH?


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


232
2018-04-28 23:36


asal


Tidak ada yang benar-benar. Sesi terganggu, dan keamanan sesi dikompromikan. Jika Anda tidak meletakkan comp untuk tidur Anda dapat mengatur waktu hidup untuk klien untuk tetap menjaga detak jantung yang hidup ke server, tetapi jika sistem akan tidur maka tidak ada yang bisa dilakukan. - darkdragn
Dalam hal ini saya mencari sesuatu yang memungkinkan saya untuk memulai kembali koneksi ssh rusak (mungkin berdasarkan pada kode keluar) dan mengembalikan menggunakan screen? - sorin
Anda orang yang salah: Saya memiliki dua mesin klien desktop yang terhubung ke server SAMA. Salah satunya adalah ubuntu 12.10, Quantal, yang klien SSH-nya bekerja dengan baik, dan menjaga koneksi selama berjam-jam. Yang lainnya adalah Ubuntu 14.10, Utopic, disamping yang lain dan dalam instalasi baru; setelah beberapa menit, itu menghalangi dirinya dengan pesan ini. Sisa fungsi jaringan dalam mesin tidak terganggu. Jadi tidak, itu bukan masalah jaringan, atau masalah server, tetapi masalah perangkat lunak SSH CLIENT tertentu, yang BISA dipecahkan, berlawanan dengan apa yang "darkdragan" berani katakan, bahwa "tidak ada yang bisa dilakukan". - David L
Dan memang, seperti yang saya katakan: orang berbicara terlalu banyak ketika mereka mengatakan "tidak ada yang bisa dilakukan", sama seperti @darkdragn yang berani. Saya membaca jawaban Aram Kocharyan, dan saya menerapkannya: 20 menit yang lalu ... Saya menyadari bahwa di Quantal Ubuntu saya yang lama 12.10, saya telah menerapkan instruksi dalam file itu [saya baru saja memeriksanya], dua tahun yang 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: tahan diri ketika berani berpikir bahwa "tidak ada yang bisa dilakukan", dan menahan diri lebih banyak ketika mencoba untuk meninggalkan pesan itu kepada orang lain. - David L
@DavidL Anda harus membaca pertanyaan lebih baik sebelum mengoceh. 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 itu. Namun jawaban lain melakukan hal terbaik berikutnya, yang mengusulkan solusi untuk kasus-kasus yang dapat diselesaikan dengan lebih mudah, seperti milik Anda. Bersantailah, jangan terlalu stres, mengomel tidak ada gunanya di sini ... - msb


Jawaban:


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

Host *
ServerAliveInterval 120

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

Anda juga bisa mengaturnya 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 dan klien. Pastikan file memiliki izin yang benar chmod 644 ~/.ssh/config.


211
2018-05-26 11:49



Ya, saya memang mirip dan bekerja dengan baik untuk banyak hal. - Oli♦
Saya tidak menggunakan Mac, tetapi Ubuntu 12.04 dan file untuk sistem operasi ini juga tampaknya ~ / .ssh / config. - H2ONaCl
OS X 10.8.4 memberi kesalahan Bad configuration option: ClientAliveInterval - ohho
Saya mendapatkan hal yang sama Bad configuration option kesalahan pada OSX 10.8.4. - Nick Heiner
Secara umum, Anda menempatkan dua perintah ini ke dalam berbagai bagian sistem. Hanya ServerAliveInterval pada sisi klien OSX ... dan hanya ClientAliveInterval pada file konfigurasi sshd ... - ftrotter


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

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. Lari screen -d kemudian screen -r akan membuka kembali sesi terakhir dan Anda akan dapat melanjutkan dari sana. Pastikan Anda membaca beberapa dokumentasi sebelum menggunakannya.


70
2017-10-04 16:28



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


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. Pilihan ClientAliveInterval hanya berguna ketika mengkonfigurasi server ssh (alias sshd), itu tidak mengubah apa pun di sisi client ssh, jadi jangan gunakan dalam file konfigurasi di atas.

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

Menggunakan File Konfigurasi SSH

Untuk informasi lebih lanjut tentang opsi lain. Anda mungkin tidak ingin menerapkan ini ke setiap server yang Anda hubungkan ke mana contoh ini akan. Atau menahannya 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 memberitahu server untuk bersikap lembut dengan klien Anda. File konfigurasi adalah /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

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


40
2017-10-06 02:54



Itu tidak berhasil. Saya menghadapi kesalahan yang sama lagi. - user997704
Cobalah langsung dari baris perintah dan turunkan: ssh -o ServerAliveInterval = 5 pengguna @ host - Matt
Mencoba itu juga. Tidak berfungsi. Saya benar-benar tidak tahu apa yang terjadi dengan sistem saya - user997704
Ini ClientAliveCountMax, BUKAN ClientAliveMaxCount - David G
@DavidG Harap edit jawabannya dengan koreksi Anda. - CivMeierFan


Saya memperbaharui server Ubuntu dari jarak jauh hingga tepat dan kehilangan koneksi ssh di tengah upgrade dengan pesan "Tulis gagal. Pipa Brocken". ClientAliveInterval dan ServerAliveInterval tidak melakukan apa pun. Solusinya adalah dengan mengaktifkan opsi TCPKeepAlive di klien ssh:

TCPKeepAlive yes

di

/etc/ssh/ssh_config

22
2017-10-07 18:40





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

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

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

ServerAliveInterval - Mengatur interval waktu dalam beberapa detik setelahnya   jika tidak ada data yang diterima dari server, ssh (1) akan mengirim a   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 sebagai:

ClientAliveInterval 600
ClientAliveCountMax 0

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

ClientAliveCountMax - Ini menunjukkan jumlah total checker   pesan yang dikirim oleh server ssh tanpa mendapatkan respon apa pun dari   klien ssh. Default-nya adalah 3.

ClientAliveInterval - Ini menunjukkan batas waktu dalam detik. Setelah x   detik, server ssh akan mengirim pesan ke klien bertanya   untuk respon. Deafult adalah 0 (server tidak akan mengirim pesan ke klien ke   memeriksa.).


Lihat juga: Apa pilihannya ServerAliveInterval dan ClientAliveInterval di sshd_config, tepatnya?


18
2017-10-02 13:52





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

Mosh (shell ponsel)

Aplikasi terminal jarak jauh yang memungkinkan jelajah, mendukung berselang   konektivitas, dan memberikan kecerdasan lokal   gema dan pengeditan baris dari keystroke pengguna.

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

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


15
2017-09-30 18:48





Bagi saya, saya mendapatkan Write failed: Broken pipe bahkan ketika saya aktif mengetik di vim atau di prompt shell. Saya tidak dapat menelusuri internet secara lokal baik untuk sementara waktu. (Saya terhubung dari 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 mencurigai itu 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. Upgrade paket broadband ISP saya sepertinya membuat koneksi saya yang rusak lebih jarang.


4
2017-07-30 13:33





Saya memiliki skrip di server 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 cepat jalankan sebelum Anda meminimalkan jendela atau menjauh darinya. Ini akan terus mencetak cap waktu saat ini di server dan membuat koneksi Anda tetap hidup selama koneksi tidak terjatuh karena alasan lain. Ketika Anda kembali ke terminal itu, cukup tekan CTRL + C dan teruskan bekerja.


3
2017-09-09 16:50



atau pergi begitu saja top berlari - Eben Geer


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

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

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

Misalnya. fungsi-fungsi bash ini, Anda dapat menambahkan ke. Bashrc Anda, 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 bisa digunakan atau do_ssh user@host <args> <command> dan keepalives akan aktif.


0
2018-02-12 13:05