私は多くのdrupalサイトを管理しており、drushを使用していくつかのものを自動化しようとしています。Drushrunは、サイトエイリアスの構成で指定されたオプションを使用して、ssh経由でリモートホストのdrushをローカルに呼び出します。私はこれらの呼び出しをかなり行っているので、スピードアップするために、次のようにssh configで永続的なssh接続を使用します。
Host *
# see http://www.revsys.com/writings/quicktips/ssh-faster-connections.html
ControlMaster auto
ControlPath ~/tmp/%r@%h:%p
ControlPersist 3600
スピードアップしましたが、次のようなメッセージも表示されます。
$ drush @alias drupal-directory webform
/var/local/www/example.com/htdocs/sites/all/modules/contrib/webform
Shared connection to 12.34.56.78 closed.
共有接続に関するメッセージは、必要な出力(真剣に?なぜstderrではないのか)と共にstdoutにあるため、スクリプトで出力をキャプチャしようとすると問題が発生します。
directory=$(drush @$alias drupal-directory $module)
マスター接続は既に開いていたはずですが、閉じられているようには見えません。だから、おそらくdrushはこの新しい接続を明示的にマスター接続にして閉じていますか?いずれにせよ、接続の終了に関するメッセージを抑制する方法はありますか?
[この問題はdrupal/drushのコンテキストにありますが、基本的にはsshに関するものだと思います。これは適切なサイトですか?]
編集:
この問題は、sshの-t
オプションが使用されている場所に固有のようです。 svnパスワードはさまざまな時点で入力する必要があるため、これを使用しています。-t
がないと、パスワードのプロンプトが表示されません。これらのプロンプトが失われるのを防ぐ別の方法があるのでしょうか?
メッセージの条件
OpenSSHポータブルソースコードのこの部分 によると、このメッセージを出力するには2つの条件が必要です。
メッセージを抑制するソリューション
ssh
コマンドラインに-o LogLevel=QUIET
を追加します。Host
ブロックの下にLogLevel QUIET
を追加します。たとえば、次の行を複数のサーバーに接続するshスクリプトで使用して、Dockerコマンドを実行します。
SSH = "ssh -t -o LogLevel=QUIET"
警告:エラーは破棄されます
この方法の欠点は、SSHの致命的なエラーも抑制されることです。
$ ssh -t -o LogLevel=QUIET notexisting.notld ssh anotherone.notld
$
代替:stderr出力を出力する代わりにログに記録する
Stderrが引き続き重要であると考えられる場合、代わりにssh -t -y
を使用して、代わりにstderrをsyslogにリダイレクトします(ただし、すべてのShared connection to <Host> closed
メッセージでログをフラッディングします)。