ローカルマシンでscreenを実行し、さまざまな画面ウィンドウを使用してさまざまなホストに接続します。 sshプロセス中にウィンドウ名をホスト名に自動的に変更すると便利です。
以下の2つのアプローチのさまざまなバリエーションを試しました。
1)ssh設定ファイルでLocalComand
を使用する:
_Host *
PermitLocalCommand yes
LocalCommand '[ "${TERM:0:6}" == "screen" ] && printf "\ek@%h\e\\"
_
2)カスタムbash関数の作成:
_# function to set screen name based on Host and reset on exit
function ssh() {
echo -e '\033k'@$1'\033\\'
ssh -Y "$@"
echo -e '\033k'local'\033\\'
}
_
これらのアプローチはどちらも機能しますが、オートコンプリートなどにも干渉するようです。
_$ scp user@Host:~/.s<tab>
...o^[\\\\ ...cal^[\\\\
_
ホストに接続しているときだけLocalCommand
(またはssh()
関数)を実行できるようにする(_$TERM == screen
_かどうかのチェックに加えて)使用できる条件はありますか?オートコンプリートに使用する場合は?
これらの制御シーケンスを印刷する必要があるため、screen
がそれらをキャプチャします。それでも、それらをssh
の標準出力に出力してはなりません。 stderrに出力します。ssh
を使用する完了関数は、出力のみをキャプチャして使用する必要があり、エラーメッセージを無視する必要があります。ただし、通常ssh
を使用すると、screen
はssh
からstdoutとsterrを取得します。
関数が変更されました:
# function to set screen name based on Host and reset on exit
function ssh() {
echo -e '\033k'@$1'\033\\' >&2
command ssh -Y "$@"
echo -e '\033k'local'\033\\' >&2
}
単語command
を追加したことに注意してください。これがないと、関数はそれ自体を再帰的に呼び出します。
上記の関数は、$1
がホスト名などであることに依存しています。一般的にはそうではないかもしれません。より堅牢な解決策は、LocalCommand
とその%h
を使用して一方向に変更してから、関数を使用してlocal
に戻すことです。
Host *
PermitLocalCommand yes
LocalCommand exec bash -c '[ "${TERM:0:6}" == "screen" ] && printf "\ek@%h\e\\" >&2' ssh-bash
${TERM:0:6}
は移植性がないため、bash
にコマンドの処理を強制しました。 LocalCommand
は、一般に構文をサポートしない可能性のあるユーザーのシェルを使用します。
# function to reset screen name on exit
function ssh() {
command ssh "$@"
echo -ne '\033klocal\033\\' >&2
}
関数から-Y
を削除しました。これで、必要に応じて引数として提供しても安全です。
Stderrへの印刷が他の何かに干渉する場合は、/dev/tty
(printf … >/dev/tty
)に直接印刷することを検討してください。ただし、これには独自の微妙な点があります。