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 -t
opsi 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?
sumber
directory=$(drush @$alias drupal-directory $module | grep -v "Shared connection to")
sudah cukup?Jawaban:
Ketentuan pesan
Menurut bagian dari kode sumber portabel OpenSSH ini , diperlukan dua kondisi untuk mencetak pesan ini:
Solusi untuk menekan pesan
-o LogLevel=QUIET
kessh
baris perintah Anda .LogLevel QUIET
bawahHost
blok 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.
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 semuaShared connection to <host> closed
pesan itu).sumber
-o LogLevel=QUIET
adalah praktik standar dalam alat otomatisasi jarak jauh.