Hindari pesan “Koneksi bersama ke <host> ditutup”

11

Saya mengelola banyak situs drupal, dan mencoba mengotomatisasi beberapa hal menggunakan drush. Drush menjalankan panggilan lokal drush pada host jarak jauh melalui ssh menggunakan opsi yang ditentukan dalam konfigurasi untuk alias situs. Saya membuat cukup banyak panggilan ini, jadi untuk mempercepatnya saya menggunakan koneksi ssh persisten dengan ssh config seperti:

Host *
  # see http://www.revsys.com/writings/quicktips/ssh-faster-connections.html
  ControlMaster auto
  ControlPath ~/tmp/%r@%h:%p
  ControlPersist 3600

Saya mendapatkan percepatan, tetapi saya juga mendapatkan pesan seperti:

$ drush @alias drupal-directory webform 

/var/local/www/example.com/htdocs/sites/all/modules/contrib/webform
Shared connection to 12.34.56.78 closed.

Pesan tentang koneksi bersama ada di stdout, bersama dengan output yang saya inginkan (serius? Mengapa tidak stderr?), Jadi itu menyebabkan masalah ketika saya mencoba untuk menangkap output dalam skrip saya:

directory=$(drush @$alias drupal-directory $module)

Saya berharap koneksi master menjadi salah satu yang sudah saya buka, dan sepertinya tidak tertutup. Jadi mungkin drush secara eksplisit membuat koneksi baru ini menjadi master dan menutupnya? Bagaimanapun, apakah ada cara untuk menekan pesan tentang penutupan koneksi?

[Masalah ini dalam konteks drupal / drush, tapi saya pikir ini pada dasarnya tentang ssh. Apakah ini situs yang benar?]

EDIT:

Sepertinya masalahnya khusus di mana -topsi untuk ssh sedang digunakan. Saya menggunakan ini karena kata sandi svn perlu dimasukkan di berbagai titik, dan tanpa -t, kata sandi tidak ditampilkan. Mungkin ada cara lain untuk menghentikan pertanyaan yang hilang?

mc0e
sumber
1
1) Ya, sepertinya Anda berada di tempat yang tepat. 2) apakah hack yang jelek directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")sudah cukup?
terdon
Itu kira-kira yang saya lakukan saat ini. Hanya saja lebih buruk dari itu dengan umpan baris dan hal-hal lain yang harus dihadapi, dan itu ada di banyak tempat, jadi saya benar - benar berharap ada beberapa cara untuk mendapatkan ssh agar tetap diam tentang hal itu.
mc0e
"Koneksi bersama ke 12.34.56.78 ditutup." keluaran pesan sebenarnya pada stderr, bukan stdout.
Dereckson
@ Dereckson - tidak kecuali seseorang memperbaikinya.
mc0e

Jawaban:

9

Ketentuan pesan

Menurut bagian dari kode sumber portabel OpenSSH ini , diperlukan dua kondisi untuk mencetak pesan ini:

  • Alokasi pseudo-tty diaktifkan (-t), seperti yang sudah Anda perhatikan
  • level log harus berbeda dari QUIET

Solusi untuk menekan pesan

  • Tambahkan -o LogLevel=QUIETke sshbaris perintah Anda .
  • Edit ~ / .ssh / config dan tambahkan di LogLevel QUIETbawah Hostblok yang relevan .

Sebagai contoh, saya menggunakan baris ini dalam skrip sh yang menghubungkan ke beberapa server untuk menjalankan perintah Docker, beberapa berpotensi interaktif:

SSH = "ssh -t -o LogLevel=QUIET"

Peringatan: kesalahan apa pun dibuang

Kelemahan dari metode ini adalah ini juga menekan kesalahan fatal SSH.

$ ssh -t -o LogLevel=QUIET notexisting.notld ssh anotherone.notld
$

Alternatif: keluaran log stderr daripada mencetaknya

Jika stderr masih dianggap penting untuk didapatkan, alternatifnya adalah dengan mengarahkan ulang stderr ke syslog, dengan ssh -t -y(tetapi kemudian Anda akan membanjiri log Anda dengan semua Shared connection to <host> closedpesan itu).

Dereckson
sumber
2
Menurut sumber itu, pesan masuk ke stderr - mungkin itu adalah perubahan dibandingkan dengan versi yang digunakan oleh si penanya? Jika demikian, mungkin perlu dipertimbangkan untuk ditingkatkan.
Toby Speight
Saya tidak benar-benar ingin pesan "Koneksi bersama ke <host> ditutup", tetapi secara umum saya ingin melihat pesan kesalahan pada stderr. Masalahnya bukan dengan ssh, itu dengan drush ketika beroperasi dari jarak jauh. Stderr perintah drush remote yang berakhir pada stdout dari perintah drush lokal.
mc0e
-o LogLevel=QUIETadalah praktik standar dalam alat otomatisasi jarak jauh.
Dereckson