別のマシンへのSSHリモートロギング後の端末タイトルを修正


18

現在、1行のperlコードを使用して、ターミナルバーのタイトルを変更しています。

print("\e]0;@ARGV\7");

しかし、別のリモートマシンにsshするたびに、ホストによってタイトルが変更されます(これにより、特に気にする必要はありません)。しかし、接続を終了した後、変更されたタイトルは残ります。これを修正する方法はありますか?基本的に、ローカルで操作するとき、端末のタイトルを固定したいです。

私は主にCentOSまたはDebianでxfceターミナルとターミネーターを使用します。ありがとう。

編集

別の微妙な点は、すべての端末に同じ名前を付けるのではなく、その場でタイトルを編集する自由を持ちたいが、SSHセッションで編集内容を変更することだけを禁止することです。

回答:


6

ウィンドウのタイトルについては知りませんが、sshセッションの終了後、実際にはsshセッションを終了した後、システムに何かを実行させようとしました。つまり、そのようには機能しません。基本的に、次の3つの選択肢があります。

  1. sshの周りのラッパー、つまり、途中に行を含む$ PATHでssh優先される名前の実行可能シェルスクリプトを記述/usr/bin/sshしますexec /usr/bin/ssh $@。これにより、オーバーヘッドを最小限に抑えながら、有効なsshバイナリを実行する前後にシェルに何らかの処理を実行させることができます。

  2. 選択したSSHソースに対してパッチを作成して、コマンドラインまたはいくつかの設定で渡されたシェルコマンドを実行するクリーンアップフックを提供します。それが私たちの望みです。

  3. PROMPT_COMMANDの出力を評価しますhistory。基本的に、1へのより一般的でandいアプローチです。


基本的に、現在のタイトルを取得してSSHセッションの前に保存し、その後タイトルを回復する簡単なスクリプトを作成しました。
nye17

4
@ nye17使用したソリューションスクリプトを投稿できますか?
レグMem 14

ソリューションスクリプトを以下に投稿しました。@ nye17がしたこととほぼ一致するはずです。 unix.stackexchange.com/a/341277/112190
phyatt

7

解決策:いくつかの関数〜/ .bashrcを追加して sshおよびsuコマンドの後に何かを行う

function title()
{
   # change the title of the current window or tab
   echo -ne "\033]0;$*\007"
}

function ssh()
{
   /usr/bin/ssh "$@"
   # revert the window title after the ssh command
   title $USER@$HOST
}

function su()
{
   /bin/su "$@"
   # revert the window title after the su command
   title $USER@$HOST
}

注:〜/ .bashrcの編集後、bashを再起動します

例:

# title is "user1@boxA"
ssh boxB  # auto changes title while on boxB to "user1@boxB"
exit
# title returns back to "user1@boxA" because of our title call in ssh()
su - user2 # auto changes title while switched user to user2: "user2@boxA"
exit
# title returns back to "user1@boxA" because of our title call in su()

お役に立てば幸いです。


revert以前の値を確認していないため、以前の値を照会して保存した場合に言うのは少し不正確ですtho
;

4

お近くのシェルドットファイル(例えば設定$PROMPT_COMMAND中に~/.bashrc同じメカニズムを使用して、適切に、端末のタイトルを設定します)。

例えば:

export PROMPT_COMMAND="printf '\e]0;bash\7\n'"

1. prompt_commandは、ターミナルウィンドウのタイトルとは関係ありませんか?prompt_commandをセットアップしていますが、プロンプト専用です。2. sshロギングを終了した後、ローカル設定を記憶してアクティブにするメカニズムが必要です。
nye17

プロンプトコマンドは、ターミナルがタイトルバーの名前を変更するために必要なエスケープシーケンスを単に出力します。:)
モニカの復活

しかし、すべてのセッションに同じ名前を付けるのではなく、自由に任意の端末の名前を変更することもできます。実際には、基本的に端末のタイトルマニュアルを編集し、SSHのログイン/ログアウト後も端末のタイトルが固定されたままになることを願っています。理にかなっていますか?
nye17

1
そのため、目的のタイトルを変数に入れて出力します。
イグナシオバスケス-エイブラムス

この端末エスケープシーケンスを使用してヌルタイトル(例export PROMPT_COMMAND="printf '\e]0;\7\n'":)を設定すると、端末エミュレーターは適切と思われるウィンドウタイトルを設定できます。ターミナルタイトルを設定するリモートホストにsshすると、ターミナルエミュレータにそのタイトルが表示され、ログアウトすると、独自のタイトルの使用に戻ります。少なくとも、それがmacOSターミナルアプリの仕組みです。
クレイメーション

3

これらの行を〜/ .bashrcに追加します

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"

    ;;
*)
    ;;
esac

DebianベースのLinuxでうまく機能します


1
ITは...しかし、タイトルを設定していません
Bananguin

これは通常、使用することをお勧め作品PROMPT_COMMAND使用するのではなく、PS1あなたは含める必要はありませんから、\[ \]ブラケティングをし、それはいくつかの引用を排除することができます。
クリスページ14年

2

1つの解決策は、sshする前に端末変数をvt100に変更することです。

export TERM=vt100

これは、通常、初期化スクリプトが端末変数を調べて、xtermのタイトルのみを変更するために機能します。別の画面、色、その他のファンシーな機能を失うかもしれません。

ローカル端末をxtermとして保持したい場合は、sshをエイリアスして、その場で端末変数を変更します。

alias ssh='TERM=vt100 /usr/bin/ssh'

物事の表示方法を変更します。色が表示されない
npk

0

.bashrcファイルのPS1にこれを追加して、この問題を修正しました。

\[\e]2;\u@\H:\w\a\]

したがって、行全体は次のようになります(PSをカスタマイズしました!:

export PS1='\[\e]2;\u@\H:\w\a\]\n($LOGNAME@$HOSTNAME) \t\n[$PWD]: '

それが他の人の役に立つことを願っています。


この端末エスケープシーケンスを使用してヌルタイトル(例export PS1='\[\033]0;\007\]\h:\W \u\$ ':)を設定すると、端末エミュレーターは適切と思われるウィンドウタイトルを設定できます。ターミナルタイトルを設定するリモートホストにsshすると、ターミナルエミュレーターにそれが表示され、ログアウトすると、独自のタイトルの使用に戻ります。少なくとも、それがmacOSターミナルアプリの仕組みです。
クレイメーション

0

SSHを終了するとき、他の答えはうまくいきませんでしたが、私に近づきました。リモートsshセッションを終了するときにsetwの自動名前変更を追加すると、自動名前変更が行われ、リセットするためにウィンドウを終了する必要がなくなります。[1月。2018-Debian 9]

ssh() {
tmux rename-window "$*"
command ssh "$@"
tmux setw automatic-rename
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.