私は多くのdrupalサイトを管理しており、drushを使用していくつかのタスクを自動化したいと思います。 Drush はローカルで実行され、サイトエイリアス構成で指定されたオプションを使用して SSH 経由でリモートホストから drush を呼び出します。私はこれらの呼び出しをたくさんしているので、作業を高速化するために、SSH設定で永続的な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.
共有接続に関するメッセージは、私が望む出力だけでなくstdoutにもあるので(本当に?stderrではないのはなぜですか?)スクリプトから出力をキャプチャしようとすると問題が発生します。
directory=$(drush @$alias drupal-directory $module)
すでに開いている接続をデフォルト接続に設定したいが閉じていないようです。それでは、Drushはこの新しい接続をデフォルト接続として明示的に作成して閉じることができますか?接続の終了に関するメッセージを抑制する方法はありますか?
[この質問はdrupal / drushの文脈にありますが、本質的にsshに関するものだと思います。では、このウェブサイトが正しいのでしょうか? ]
編集する:
-t
問題は、sshオプションが使用される場所に関連しているようです。複数のポイントでsvnパスワードが必要なため、これを使用していますが、それ以外の場合は-t
パスワードプロンプトは表示されません。おそらく、このヒントが消えるのを防ぐための別の方法がありますか?
答え1
メッセージ条件
~によるとこれはOpenSSH移植ソースコードです。OpenSSH 8.7より前にこのメッセージを印刷するには、2つの条件が必要です。
- ご存知のように、擬似tty割り当てが有効になります(-t)。
- ログレベルはQUIETとは異なる必要があります。
OpenSSH 8.8以降、条件は次のとおりです。
- 以前と同様に、pseudo-tty割り当て(-t)を有効にします。
- ログレベルはより大きくなければなりません。
バラより今回提出してくださいOpenSSHポータブルエディションに変更されました。
メッセージを抑制するソリューション
- OpenSSH 8.8以降にアップグレード
-o LogLevel=QUIET
コマンドラインに追加してくださいssh
。- ~/.ssh/config を編集し、
LogLevel QUIET
関連Host
ブロックの下に追加します。
たとえば、Dockerコマンドを実行するために複数のサーバーに接続するshスクリプトでは、次の行を使用します。そのうちのいくつかはインタラクティブかもしれません。
SSH = "ssh -t -o LogLevel=QUIET"
警告:すべてのエラーは削除されます。
この方法の欠点は、SSHの致命的なエラーも抑制することです。
$ ssh -t -o LogLevel=QUIET notexisting.notld ssh anotherone.notld
$
回避策:印刷する代わりにstderr出力を記録します。
stderrが依然として重要であると見なされている場合は、stderrをsyslogにリダイレクトする別のアプローチがありますssh -t -y
(しかし、そうすると、ログはこれらのすべてのメッセージでいっぱいになりますShared connection to <host> closed
)。