Windows

Tera Term 5で快適なターミナルライフ

Windows

Tera Termにはかれこれ25年ほどお世話になっている。

つい先日までVersion 4系だったが、サーバーのリプレースのためUbuntu 24.04を本格的に使おうとしてVersion 5にアップデートした。
どうやら別プログラムという扱いだったらしく、Version 4とVersion 5が混在しているが、Version 5しか起動していない。

これを機に、TERATERM.INIを見直して、より使いやすくしようと考えた。



ここから広告
広告
広告ここまで


環境

操作端末は以下。

  • Windows 11 Pro
  • Tera Term Version 5.4.0 x86

接続先は以下。

  • Ubuntu 20.04 server
  • Ubuntu 22.04 desktop
  • Ubuntu 24.04 server
  • Ubuntu 12.04 server ← 動作を見てみたくて新規に立ち上げてみた

インストール時に用意されたTERATERM.INIを、Tera Term 設定ファイルの全項目一覧を見ながら編集していく。

今回もGeminiさんとCopilotさんに相談しながら進める(ほとんどはGeminiさんとの相談だった)。

キーボード

微調整レベルだけれど、2点だけ設定する。

Deleteキー

Deleteキーを押したら、Backspaceキーと同じ動きをする。

Geminiさんと相談した結果、これは、

  • Deleteキーを押したときにASCII $7F (DEL)が送信されたことを表している。
  • 多くのLinux環境では、歴史的経緯からDEL文字を「カーソルの左側の文字を削除する」操作として解釈する。
  • 多くのLinux環境では、Deleteキーを押したときに特別なエスケープシーケンス \x1b[3~ が送信されることを期待している。

という理由から、Backspaceキーと同じ動作をしたのだった。

設定 → キーボードを確認したところ、DELを送信するキーとして「Delete キー」にチェックが入っていた。
これを外すことで期待する動作となった。

設定ファイルでは、DeleteKey=off

余談だが、DEL文字の解釈についての歴史的背景をGeminiさんとCopilotさんに聞いてみた。

  • 紙テープ時代
    • そもそもDEL文字はコードが$7Fである。これは、7ビットASCIIの場合は全部1(111 1111)である。
    • 紙テープで間違った文字を修正する方法として、全部に穴を開ける(111 1111)方法が考案された。
      この文字は削除された(無視されるべき)と解釈される。
  • テレタイプ端末時代(1960年代~1970年代前半)
    • キーを押すと文字が紙に印刷される。
    • Backspaceキーがあり、多くのシステムでDELが送信された。
    • 紙の上で文字を消すのは困難なため、Backspaceキーが押されると、左に戻ってDEL等の文字を印刷していた。
    • いまでもsttyコマンドでeraseのデフォルトが^?(ASCII $7F)なのは、この時代の名残。
  • VT100時代(1970年代後半~1980年代)
    • CRTの登場で文字を消すことが可能になる。
    • この頃にDeleteキー登場し、VT100に配置されていることがあった。
      BackspaceキーにDELが配置されているにもかかわらず、DeleteキーでもDELが送信されていた。※1
    • VT220、VT320あたりでキーボードレイアウトが標準化され、Removeキーが配置された。※2
      このキーを押すと \x1b[3~ が送信されるようになっていた。
  • Xtermの登場と標準化(1980年代後半~1990年代 X Window Systemと共に)
    • X Window System上で動作するソフトウェアターミナルエミュレータとして、xtermが登場。
    • ここで、BackspaceキーとDeleteキーの役割が決まって広く受け入れられる。
      • Backspace: ASCII $08、または、ASCII $7Fを送信。カーソルの左側にある文字を削除。
      • Delete: \x1b[3~を送信。カーソルの位置にある文字を削除。
  • 現代
    • Bash等多くの対話型プログラムは、readlineライブラリを使用している。
      readlineは受け取ったエスケープシーケンスを、terminfoや独自のキーバインディング設定(~/.inputrc)に基づいて解釈する。
    • readlineのデフォルトでは、ASCII $7Fをbackword-delete-char(カーソルの左側にある文字を削除)、\x1b[3~をdelete-char(カーソル位置にある文字を削除)と解釈する。
    • sttyではデフォルトでeraseに^?(ASCII $7F)が設定され、カーソルの左側にある文字が削除される。

※1 DELを送信するキーとして、Deleteキーにチェックが入っているのは、こういう背景があってのことなのですね。
※2 KEYBOARD.CNFにおいて、DeleteキーがRemoveという名前になっているのは、こういう背景があってのことなのですね。

Tera Termは、シミュレーターを含め様々なシステムに接続するから、こうした歴史的背景も全て考慮していく必要があるのだろう。
利用者からすると、最初に一通り設定を見て最適化するから、その後は忘れてしまうことだろう。

テンキー

サーバーのメンテナンスをするために、Vimを利用している。
多くある機能を利用しきってはいないけれど、ほとんどの時間はこれ、というくらい時間利用しているアプリケーション。

先日、数字を幾つも入れる必要が出てきて、テンキーを使おうとしたらページがスクロールしてしまった。
具体的には、テンキーの3を入力したら、下に1ページ分スクロールしてしまったのだった(PageDownキー相当の動作)。

これもGeminiさんと相談しながら調べていったのだけれど、アプリケーションキーパッドモードが関係していた。

  • Vimは起動するとき、端末に色々と設定情報を送る。
    • Vimを起動して、:set termcap と入力すると送られているコードが表示される。
    • 起動時に t_ks=^[[?1h^[= を送信。要素は2つ。
      • ^[[?1h : xterm系の端末にアプリケーションカーソルモード、アプリケーションキーパッドモードにすることを要求。
      • ^[= : VT系の端末にアプリケーションカーソルモードにすることを要求。
    • 終了時に t_ke=^[[?1l^[> を送信。要素は2つ。
      • ^[[?1l : xterm系の端末にアプリケーションカーソルモード、アプリケーションキーパッドモードを終了させる要求。
      • ^[> : VT系の端末にアプリケーションカーソルモードを終了させる要求。
  • Tera Termには、この要求を無効化する設定がある。
    • DisableAppCursor : onにすると、アプリケーションカーソルモードにならない。
    • DisableAppKeypad : onにすると、アプリケーションキーパッドモードにならない。

Vimの動作中に期待するのは以下。

  • カーソルキーでカーソルの移動ができる。
  • テンキーでキーに表示されている数字や記号を入力したい。

この場合、DisableAppKeypad=on が簡単だった。

もし、Vimの側で上手く制御しようとした場合、.vimrcに以下をセットしておく必要がある。
※このコードはGeminiが生成してくれたもの。

" Vimをvi互換モードにしない (互換モードだと以下の設定が効かない場合があるため必須)
set nocompatible

" === テンキーのアプリケーションキーパッドモードの数字を直接マップ ===

" 1. 入力モード (Insert Mode) 用のマッピング
" `inoremap` を使って、入力モードでのみテンキーのシーケンスを数字に変換します。
inoremap <Esc>Op 0
inoremap <Esc>Oq 1
inoremap <Esc>Or 2
inoremap <Esc>Os 3
inoremap <Esc>Ot 4
inoremap <Esc>Ou 5
inoremap <Esc>Ov 6
inoremap <Esc>Ow 7
inoremap <Esc>Ox 8
inoremap <Esc>Oy 9
inoremap <Esc>OM <CR> " テンキーのEnter
inoremap <Esc>Ol + " テンキーの+
inoremap <Esc>Ok - " テンキーの-
inoremap <Esc>Oj * " テンキーの*
inoremap <Esc>Oo / " テンキーの/
inoremap <Esc>On . " テンキーの.

" 2. ノーマルモード、ビジュアルモードなど (非入力モード) 用のマッピング
" `noremap` を使って、これらのモードでテンキーのシーケンスを数字として認識させます。
" ノーマルモードでテンキーを押すと、その数字がコマンドとして入力されるようになります。
noremap <Esc>Op 0
noremap <Esc>Oq 1
noremap <Esc>Or 2
noremap <Esc>Os 3
noremap <Esc>Ot 4
noremap <Esc>Ou 5
noremap <Esc>Ov 6
noremap <Esc>Ow 7
noremap <Esc>Ox 8
noremap <Esc>Oy 9
noremap <Esc>OM <CR> " テンキーのEnter
noremap <Esc>Ol + " テンキーの+
noremap <Esc>Ok - " テンキーの-
noremap <Esc>Oj * " テンキーの*
noremap <Esc>Oo / " テンキーの/
noremap <Esc>On . " テンキーの.


" === カーソルキーのアプリケーションモードのマップ ===
" `noremap` を使って、全てのモードでカーソルキーのシーケンスを移動キーに変換します。
" inoremap (入力モード) でも同じマッピングが必要な場合、別途 inoremap で書く。
" 通常、カーソルキーは入力モードでも自動的に解釈されることが多いので、
" まずは `noremap` だけで試す。
noremap <Esc>OA <Up>
noremap <Esc>OB <Down>
noremap <Esc>OC <Right>
noremap <Esc>OD <Left>

" (もし入力モードでカーソルキーが動かない場合は、以下も追加してください)
" inoremap <Esc>OA <Up>
" inoremap <Esc>OB <Down>
" inoremap <Esc>OC <Right>
" inoremap <Esc>OD <Left>

これを端末やユーザーごとにそれぞれセットしていくことを考えると、Tera Termの側でアプリケーションキーパッドモードを無効にするのが簡単だなと。

表示色

カラーに対応したテキストエディターに触れたとき、最初はかなりびっくりした。確か、Borland C++の統合開発環境だったと思う。
でもすぐに慣れて、カラーなしではいられない感じになった。

今となってはカラーが当たり前、きちっと設定しておきたい。

色の考え方

Geminiさんに相談しながら実験し、色の考え方を整理してみたところ、設定ファイルの項目は大まかに3つに分類できそうだった。

系統設定値解釈
VTColorVTColor, VTReverseColor等無指定、またはエスケープシーケンスによる属性変更に反応。
指定された色、太字・下線で文字を表示する。
ANSIColorANSIColorエスケープシーケンスで送られてきた色で上書き。
TEKColorTEKColor等Tektronixエミュレーションに関わる色。※

※ Tektronix 4014は、1970年代に広く使われたベクターディスプレイ(ストレージチューブディスプレイ)方式のグラフィックターミナルで、CAD市場で広く使われていたとのこと。多分使うことはないので、TEKColorに関する設定は気にしないことにする。

整理してみると…

  • Tera Termの基本的な表示色は、VTColor・VTReverseColorで決まる。
  • エスケープシーケンスで太字、下線、点滅が送られてきたら、対応するVTColor系統の色設定で表示される。
  • 接続したサービスがエスケープシーケンスで色指定をしてきた場合、ANSIColorで設定した色で上書きする。

ということのようだった。

VTColor系統の色とANSIColorを総合的にみて設定することで、色に統一感を持たせることができそうだ。

VTColor

Tera Termデフォルトの設定を見ながら、ANSIColorとVTColor系統の色とを比較してみた。

また、Geminiに「もしANSIColorとVTColor系統色の割り付けを考えたとしたら?」という質問をしてみた。
それぞれに理屈ありで割り付けを考えてくれたので、それを書いておく。

あわせて過去にターミナルの色について調べたことがあったので、GNOMEターミナルの色をベースとした自分好みの色設定も書いてみる。

No.ANSIColor設定値から見る
ANSIColorとVT色の割り付け
GNOMEっぽいANSIColorGeminiに相談した
VT色の割り付け
00,0,00,0,0
1255,0,0VTBlinkColor204,29,44
20,255,0VTUnderlineColor38,162,105
3255,255,0VTBoldColor162,115,76
4128,128,25524,103,194
5255,0,255170,68,170
60,255,255URLColor42,161,179VTUnderlineColor
7255,255,255VTColor ※1208,207,204
864,64,64119,119,119
9192,0,0246,97,81VTBlinkColor
100,192,061,209,122
11192,192,0233,173,12VTBoldColor
1264,64,19245,133,241URLColor
13192,0,192209,106,222
140,192,19256,224,249
15192,192,192255,255,255VTColor ※1,2

※1 VTReverseColorはVTColorを反転させる。
※2 これは相談に含めなかったけれど、白でいいかなと。

実際はというと、

  • Ubuntuでlsコマンドを実行すると、ディレクトリ名が太字属性で送られてきて黄色になる。
  • でも、ANSIColorを有効にすると、色番号12に反応して青色になる。

という具合で、ANSIColorを有効にすると、必ずしもVTColor系統で表示されるわけではない。
ANSIColorの指定がなくても困らない程度の色設定ができていれば問題はない。

「VTColor系統の色」を設定する予定の「ANSIColorの色」を踏まえて設定してみた。

設定項目デフォルト値今回設定効果
UseTextColoroffoffエスケープシーケンスで送られてくる文字色・背景色を強制的に書き換える。
Geminiさんは、これが思い通りに色設定できなくなる原因と心配する。
アプリケーションとの組み合わせによるだろうけれど、基本的にoffで。
VTColor255,255,255,0,0,0255,255,255,0,0,0通常の文字色、背景色。
UseNormalBGColoronon太字、点滅、URLの背景色が無視され、VTColorの背景色を使う。
EnableBoldAttrColoronon太字属性に反応して色を付ける。
EnableBoldonon太字属性に反応して太字にする。設定ダイアログに2箇所項目がある。
VTBoldColor255,255,0,0,0,0233,173,12,0,0,0太字属性の文字色、背景色。
UnderlineAttrColoronon下線属性に反応して色を付ける。
UnderlineAttrFontonon下線属性に反応して下線を付ける。
VTUnderlineColor0,255,0,0,0,042,161,179,0,0,0下線属性の文字色、背景色。
EnableBlinkAttrColoronon点滅属性に反応して色を付ける。
VTBlinkColor255,0,0,0,0,0246,97,81,0,0,0点滅属性の文字色、背景色。
EnableReverseAttrColoronon反転属性に反応して色を付ける。
VTReverseColor0,0,0,255,255,2550,0,0,255,255,255反転属性の文字色、背景色(VTColorを反転させて設定しておくべき)。
EnableURLColorononTera TermがURLと判断した文字列に色を付ける。
URLUnderlineononTera TermがURLと判断した文字列に下線を付ける。

左はデフォルトの設定。
右はVTColor系統の色を、GNOMEっぽい色+Geminiさんのお勧め割り付けで設定した結果。

狙い通りになっている。
後は、ANSIColorの設定をすればOK。

ANSIColor

ANSIColorの設定自体は、デフォルトのものが見やすい(上の行)。
GNOMEっぽい色に変更することもできる(下の行)。

;ANSIColor=0,0,0,0, 1,255,0,0, 2,0,255,0, 3,255,255,0, 4,128,128,255, 5,255,0,255, 6,0,255,255, 7,255,255,255, 8,64,64,64, 9,192,0,0, 10,0,192,0, 11,192,192,0, 12,64,64,192, 13,192,0,192, 14,0,192,192, 15,192,192,192
ANSIColor=0,0,0,0, 1,204,29,44, 2,38,162,105, 3,162,115,76, 4,24,103,194, 5,170,68,170, 6,42,161,179, 7,208,207,204, 8,119,119,119, 9,246,97,81, 10,61,209,122, 11,233,173,12, 12,45,133,241, 13,209,106,222, 14,56,224,249, 15,255,255,255

これを反映させる+周辺の設定を調べてみる。

設定項目デフォルト値今回設定効果
EnableANSIColorononoffにすると16色および256色モードも無効。
TermTypextermxterm-256colorTera Termがこの値を接続時に伝え、環境変数$TERMに設定されている。
接続先のシステムは、この変数を使ってTerminfoというデーターベースを参照する。
ncurses-term(ncurses-base)にデーターベースが含まれている。
xterm-256colorを設定すると、256色の表示がサポートされる。
Xterm256Colorononxtermの256色に対応。
TermTypeでxterm-256colorを伝えた上で、この設定で256色に対応する模様。
逆にこの指定だけでもANSIColorには対応するとみられる。
PcBoldColor
Aixterm16Color
on
on
on
on
今回は気にしないことにした。

TermTypeをxterm-256colorにすると、はっきり違うのはプロンプト。
ユーザー名@ホスト名のところが緑で表示されている。
どうやら、$TERMがxterm-256colorだったら緑色にするエスケープシーケンスが送られるように設定してあるようだ。

Ubuntu 12.04を立ち上げてみたけれど、その頃は緑じゃなかったみたい。

以上の通り、ANSIColorを上手く表現するために必要な設定のほとんどがデフォルト設定であり、唯一TermTypeを変えてあげるだけで良さそうだった。

背景色を変える(テーマ機能)

接続するサーバーごとに背景色を変えて、視覚的に間違いを低減したい。
ここまで整理してみて、一番簡単なのはVTColorの背景色部分を変えてあげることだと思った。

だけど、テーマ機能を使えば全体の色の雰囲気を変えられそうだし、背景画像なんかも設定できそうなので、テーマ機能に挑戦。

テーマエディターの利用方法はこちら。
Theme Editor

以下で実現できたが、スクロール速度が少し下がる。

  • その他の設定ダイアログ → タブ「テーマ」
    • 「Enable」にチェックを入れる。
    • ボタン「Theme Editor」で、テーマエディターを開く。
  • Theme Editor → タブ「背景」
    • 「Simple Color Plane」にチェックを入れる。
    • 「Simple Color Plane」のところにある「...」をクリックして、わかりやすい色(e.g. R:255 G:0 B:0)を選択。
  • Theme Editor → タブ「背景画像透過」<重要>
    • 「通常文字背景色の透過」のスライダーを少し左に動かす。一番右にあると透過0なので、VTColorの背景色のままになるから。
    • 「反転文字背景色の透過」のスライダーはお好みで。ANSIColorで背景色を指定されていないところが透過する。
    • 「その他の文字背景色の透過」のスライダーもお好みで。ANSIColorで指定された背景色が透過する。
  • Theme Editor → タブ「プレビュー/ファイル」
    • ボタン「Preview」で表示を確かめる。
    • 「Theme file」にある「Save BG theme」にチェックを入れる。
    • ボタン「保存」が有効化されるので押して、themeフォルダに名前を付けて保存。
    • ボタン「OK」でテーマエディターを閉じる。
  • その他設定ダイアログ → タブ「テーマ」
    • 「Startup」のドロップダウンで「固定テーマ(テーマファイル指定)」を選択。※この項目はいつも「使用しない」に戻ってしまうので注意。
    • 「Startup」にあるボタン「...」で、先程保存したテーマファイルを選択。
    • ボタン「OK」でその他設定ダイアログを閉じる。
  • Tera Term 通知
    • Theme is used
      Do you want to set color?
      と聞かれるので、ボタン「はい」を押す。

これで背景色を変えることができた。

できあがったテーマはこんな内容だった。

[BG Theme]
BGDestEnable=0
BGDestFile=
BGDestColor=0,0,0
BGDestPattern=stretch
BGDestAlpha=255
BGSrc1Enable=0
BGSrc1Alpha=0
BGSrc2Enable=1
BGSrc2Alpha=0
BGSrc2Color=255,0,0
BGReverseTextAlpha=255
BGTextBackAlpha=213
BGBackAlpha=255

これができあがった後でマニュアルを見てみると、これがどういう設定なのかが分かってくる。

背景画像(テーマ機能)

本家ではlook and feel の変更というページで、背景画像を使ったサンプルを見せてくれている。
これもやってみよう。

Susieの部屋からspiをダウンロードしてきて設置、jpgを読み込ませたところ、エクセプションが発生。
Susieで画像を読み込むことはできたので、何らかの相性問題?があるみたい。

そのため、TORO's Libraryで配布されているJPEG-turbo Susie Plug-in Version 1.09をダウンロードして設置してみたところ、正しく画像読み込み、表示ができるようになった。

背景画像をセットするときも、「背景画像透過」の設定は忘れずに。

できあがったテーマはこちら。

[BG Theme]
BGDestEnable=1
BGDestFile=picture\Bird's Eye View Of City.jpg
BGDestColor=0,0,0
BGDestPattern=stretch
BGDestAlpha=255
BGSrc1Enable=0
BGSrc1Alpha=0
BGSrc2Enable=0
BGSrc2Alpha=0
BGSrc2Color=0,0,0
BGReverseTextAlpha=255
BGTextBackAlpha=179
BGBackAlpha=255

元々輝度の低い画像だったので、空から見た街が暗めに薄く広がっている。
明るい画像を選択したときは、黒を程々に混ぜてあげれば良さそうだ。

Vim

これはVimの設定だけれど…termguicolorsが使えるバージョンなら、是非セットしておきたい。

~/.vimrc

...
if $TERM != 'linux'
set termguicolors
endif

linuxは直接サーバーのttyにログオンしたときにセットされるもの。
フルカラー表示は無理なので、その場合を除外して設定するようにしている。

これをやっておけば、各種のカラースキームも全く見え方が変わる。

フォント

色の話題なのにフォント?と思うけれども、実際にはフォントによって見え方がかなり変わる。

左がNasuMというフォントで表示高さを詰めたもの、右がMS明朝。
左の方が色が濃く見えて、右の方はくっきりとしているが色が薄く見える。

現在、Nasuはダウンロードができないように思う。

かなり似たフォントで同じ作者と思われるMIGMIXとMIGというフォントがあった。
Migu 1MはNasuMにかなり似ていて、少し表示高さを短くしているようだったので、全体的に見て利便性が上がっているように思う。
乗り換えようかと思ったけれど、hの棒線がほんの少し細くて、それ以外にも少しずつ違いがあったのでやめている。

テスト用のテキスト表示

設定を変えても、どう反映されるのかが分かりにくいので、Geminiさんに相談したところ、こんなコードを提供してくれた。

これのおかげで「背景画像透過」を設定した場合の効果が分かった。
また、色々なパターンで文字が見やすいかどうかを確認することができるので良いと思ったので、メモしておく。

#!/bin/bash

# --- ターミナルのリセットと初期設定 ---
# 全ての属性をリセットし、画面をクリア
echo -e "\x1b[0m\x1b[2J\x1b[H"
echo "--- Tera Term Color & Attribute Test ---"
echo "Make sure 'UseTextColor=off' in TERATERM.INI for correct behavior."
echo ""

# --- 1. 通常のテキスト (VTColor / VTBackColor) ---
echo "--- 1. Normal Text (VTColor / VTBackColor) ---"
echo "This is regular text. Its color is defined by VTColor."
echo "The background is defined by VTBackColor."
echo ""

# --- 2. 属性付きテキスト (VTBoldColor, VTUnderlineColor, VTBlinkColor, VTURLColor) ---
echo "--- 2. Attributes (VTBoldColor, VTUnderlineColor, VTBlinkColor, VTURLColor) ---"
echo -e "\x1b[1mThis is bold text (VTBoldColor).\x1b[0m"
echo -e "\x1b[4mThis is underlined text (VTUnderlineColor).\x1b[0m"
echo -e "\x1b[5mThis is blinking text (VTBlinkColor).\x1b[0m (May not blink visually in all terminals)"
echo ""
# URLの自動検出 (VTURLColor)
# Tera Termが自動的にURLと認識する文字列
echo "Visit our website: https://www.example.com/ (VTURLColor)"
echo "Or FTP: ftp://ftp.example.org/"
echo "Or mail: mailto:test@example.com"
echo "------------------------------------------------------"
echo ""

# --- 3. 反転表示テスト (VTReverseColor / VTReverseBackColor) ---
echo "--- 3. Reverse Video Test (VTReverseColor / VTReverseBackColor) ---"
echo "This test applies \x1b[7m. Its colors are defined by VTReverseColor."
echo ""

# 通常のテキストの反転
echo -e "\x1b[7mNormal text reversed.\x1b[0m"

# 太字テキストの反転
echo -e "\x1b[1m\x1b[7mBold text reversed.\x1b[0m"

# 下線テキストの反転
echo -e "\x1b[4m\x1b[7mUnderlined text reversed.\x1b[0m"

# ANSIカラー付きテキストの反転
# ANSI Color 1 (Red) のテキストを反転
echo -e "\x1b[31mRed text. \x1b[7mRed text reversed.\x1b[0m (Behavior can vary by terminal and its internal logic.)"

# ANSI Color 4 (Blue) の背景を反転
echo -e "\x1b[44m\x1b[37mWhite text on Blue background. \x1b[7mReversed white text on blue background.\x1b[0m"

# 256色付きテキストの反転 (例: 256色中の100番の背景と、その反転)
echo -e "\x1b[48;5;100m\x1b[38;5;231m256-color background (100).\x1b[7mReversed 256-color.\x1b[0m"
echo -e "(Note: Behavior of 256-color reversal can vary by terminal and its internal logic.)"
echo "------------------------------------------------------"
echo ""

# --- 4. ANSI 16色テスト ---
echo "--- 4. ANSI 16 Colors (Foreground & Background) ---"

echo -e "Foreground (Normal 0-7):"
for i in {0..7}; do
echo -ne "\x1b[3${i}m ANSIColor${i} "
done
echo -e "\x1b[0m"

echo -e "Foreground (Bright 8-15):"
for i in {0..7}; do
echo -ne "\x1b[9${i}m ANSIColor$(($i + 8)) "
done
echo -e "\x1b[0m"

echo -e "Background (Normal 0-7):"
for i in {0..7}; do
echo -ne "\x1b[4${i}m \x1b[37mANSIColor${i}\x1b[0m " # Text is white for visibility
done
echo -e "\x1b[0m"

echo -e "Background (Bright 8-15):"
for i in {0..7}; do
echo -ne "\x1b[10${i}m \x1b[30mANSIColor$(($i + 8))\x1b[0m " # Text is black for visibility
done
echo -e "\x1b[0m"
echo "------------------------------------------------------"
echo ""

# --- 5. ANSI 256色テスト ---
echo "--- 5. ANSI 256 Colors ---"
echo "(Requires TermType=xterm-256color and UseANSIColorFor256=on)"

echo "Grayscale (232-255):"
for i in {232..255}; do
printf "\x1b[48;5;%sm\x1b[38;5;%sm%3s\x1b[0m" $i $((i>243 ? 232 : 255)) $i # Text color adjusted for visibility
done
echo ""

echo "Color Cube (16-231):"
for i in {0..5}; do
for j in {0..5}; do
for k in {0..5}; do
color_code=$((16 + 36 * i + 6 * j + k))
# Adjust text color for better visibility on dark/light backgrounds
text_color=$(( ( (i*255/5 + j*255/5 + k*255/5)/3 ) > 128 ? 16 : 231 )) # Black text on light, white on dark
printf "\x1b[48;5;%sm\x1b[38;5;%sm%3s\x1b[0m" $color_code $text_color $color_code
done
done
echo "" # New line after each row of colors
done
echo "------------------------------------------------------"
echo ""

echo "Test Complete."

ウィンドウ操作

メンテナンスするときには、複数のサーバーに接続するので、Tera Termをいっぱい開いていたりする。
割とウィンドウを移動させたり、サイズを変更したりするので、スムーズに操作できると感覚的に嬉しい。

スムーズなウィンドウ移動

スムーズなウィンドウ移動に関係する設定項目は、[BG]セクションにおいてはこの2つの模様。
効果については、Version 4のマニュアルから引用している。

設定項目デフォルト値今回設定設定項目と効果
BGFastSizeMoveonoff設定項目:その他の設定ダイアログ
テーマ → ウィンドウ移動/リサイズ時テーマを一時的にdisableする

マニュアルの説明:
ウィンドウの移動、サイズ変更を高速に行います。
Windows が「ドラッグ中にウィンドウの内容を表示する」場合に有効です。
BGFlickerlessMoveonoff設定項目:その他の設定ダイアログ
表示 → Flickerless move

マニュアルの説明:
ウィンドウが移動した際のちらつきを抑えます。

恐らくテーマを有効にしている場合の問題だろうと思われるけれど…

今使っているグラフィックカードとモニターの場合、両方をonにすると、ウィンドウの移動時にちらつくだけでなく、コマ落ちして移動が遅くなる。
BGFastSizeMoveをoffにするとだいぶ改善するが、それでも遅い。

BGFlickerlessMoveをoffにすると、ウィンドウの移動はかなりなめらかになった。
ただし、ウインドウサイズを変更するときにテーマが一時的にオフになる。

両方をoffにするとなめらか、かつ、ウィンドウのサイズを変更してもテーマはオフにならなかった。

推奨は両方onなのだろうけれども、特に問題もなさそうだったので、どちらもoffにしておくことにした。

ウィンドウのサイズ変更

ウィンドウのサイズを変更すると、画面が真っ黒になっていた。そういうものだと思い込んでいた。
ところが、Tera Termのデフォルト設定はそうじゃなくなっていた。

ClearOnResize=off

マニュアルを確認したところ、バージョン4と5でデフォルト値が変わったらしい。

実際の動作はというと…

  • catでログを表示するなど、1行が長いデーターを表示しているとき、ウィンドウを広げても表示の仕直しはしない。
  • ウィンドウを狭めて文字を消した場合、広げ直しても表示は復活しない。
  • Vimやlessなどのプログラム起動中に幅を調整すると、マウスボタンを放したときに再描画される。

という具合。

操作によってだいぶスクロールした後に、削れた行を見に行ってみたが、表示は削れたままだった。
まるでスクロールバッファー分の画像をそのまま残しているかのようだが、そんなはずはないだろうから不思議。

全体的な感触は良かったので、この設定で行こうと思う。

Vimとクリップボード

クリップボードに関わるところは、デフォルトのままでも基本的に気持ちよく利用できている。
その上で、今回はVimのレジスター+/*を手元PCのクリップボードにつなげてみようという話。

やってみて良かったなと思ったのは、一旦きっちりと環境を構築しておけば、新たなサーバーを追加するときも、新たな操作端末を追加するときも、エラーの嵐の中で設定するようなことにはならないこと。
試行錯誤したが、結果的にはセッションごとの管理になっていて、仮に他の人が使うような環境だったとしても全然影響しない、自分だけでどうにかすればいい状態になっているのだった。

構成

構成は以下の通り。

┌─────┐      ┌───────┐
│┌───┐│ │┌─────┐│
││ vim ││ ┌─┼┤Tera Term ││
│└─┬─┘│ │ │└──┬──┘│
│┌─┴─┐│ │ │┌──┴──┐│
││ sshd ├┼─┘ ││ XServer ││
│└───┘│ │└─────┘│
└─────┘ └───────┘
[Ubuntu] [操作端末]
<--- SSH接続 --->

Xクライアントアプリケーションの転送

  • クリップボード対応版のVimを使う → XServerとやり取りができる
  • sshdとTera Termは、XServer宛のやり取りを転送するように設定
  • XServerがVimとやり取りして、クリップボードを適切に処理する

Ubuntu 12.04、20.04、22.04、24.04と試したが、全ての環境で上手く動いた。

Vim

クリップボード対応版のVimを使いたい。

確かめてみる。

$ vim --version | grep "clipboard"
-clipboard +keymap +printer +vertsplit
+eval -mouse_jsbterm -sun_workshop -xterm_clipboard

対応していなかったので、対応版をインストールする。
かなり色々とインストールされてしまうけれど、多機能版なので仕方がない。

$ sudo apt install vim-gtk3

改めて確かめてみる。

$ vim --version | grep "clipboard"
+clipboard +keymap +printer +vertsplit
+eval -mouse_jsbterm -sun_workshop +xterm_clipboard

なお、xtermのクリップボードというのもあるのだけれど、ここでプラスになった機能を上手く使う方法は分かっていない。
仕様上のサイズ制限(4,096バイト)というのがあるみたいなのと、XServerがかなり良い動きをしているので、突き詰めていない。

sshd

関係する項目はこれで、最初の状態はUbuntu 12.04の頃から変わっていないみたい。
見たところでは全てこの状態になっていた。

/etc/ssh/sshd_config

...
X11Forwarding yes
#X11DisplayOffset 10
#X11UseLocalhost yes
...

X11Forwardingは、X11転送を許可するかどうかの設定。
デフォルトはNoだが、Debian系ではインストール時にはyesと設定されているとのこと。確かにそうなっている。

X11DisplayOffsetは、sshdが使用できる最初のディスプレイ番号。
デフォルトで10が設定されるとのこと。変更する必要がなければコメントのままで良い。

X11UseLocalhostは、X11転送サーバーを自分自身に限定する指定。
デフォルト値はyesなので、このままで良い。

上記の通りで設定変更の必要はなかったが、もしも設定を変更したなら、サービスを再起動して設定を反映させる。

$ sudo systemctl restart ssh

XServer

Geminiさんお勧めのVcXsrvをダウンロードしてきて、インストールし、XLaunchを起動する。

  • Select display settings
    • Multiple windowsのまま
    • Display number -1のまま
  • Select how to start clients
    • Start no clientのまま
  • Extra settings
    • Clipboardにチェックが入ったまま
    • Primary Selectionにチェックが入ったまま
    • Native openglにチェックが入ったまま
    • Disable access controlのチェックが外れたまま

と、何も変更することなく進めていき、Save configurationでこの設定を保存する。
適当にmy.xlaunchという名前を付けた。

完了をクリックするとVcXsrvは起動して、タスクトレイに常駐する。
ファイアウォールの表示がされたら、許可しておく(とはいえ、今回はPC内部でしか通信しないけれど)。

ここでVcXsrvを終了させ、保存した設定ファイルで起動できるか試してみる。
(元々Xmingが入っていた環境で、試行錯誤しているうちに関連付けを間違えた。xLaunch.exeと関連付けてあればOK)

最後に、設定ファイルをスタートアップフォルダに保存して、ログイン後に起動することを確認する。
場所はこちら。

%AppData%\Microsoft\Windows\Start Menu\Programs\Startup

ログインしたら、毎回起動するの?という話ではあるが、答えはYes。

Tera TermでXServerとのやり取りを転送する設定は、オンデマンドではできなくて、設定を保存した後に再度接続する必要がある。
この状態で接続すると、Vimを起動するときにXServerにアクセスするが、XServerが起動していないとエラーメッセージが表示されてしまう。

つまり、転送をやめる設定を保存するまでXServerが起動している必要があり、でも、都度都度そんな設定変更はしないだろう…

だから、ログインしたら毎回起動させることにした。

Tera Term

いよいよTera Termの設定。

Tera Termが起動していたら、

  • 設定 → SSH転送 で SSHポート転送ダイアログを開く。
  • リモートのXアプリケーションをローカルのXサーバーに表示する にチェックを入れる。
  • ボタン「OK」を押す。
  • 設定を保存する。

とし、一度端末を閉じる。

あるいは、使用している設定ファイルで以下の通り設定を変更して保存する。

DefaultForwarding=
 ↓
DefaultForwarding=X

改めてサーバーに接続し、環境変数に接続先のディスプレイ番号が設定されていることを確認する。

$ echo $DISPLAY
localhost:10.0

※sshdの設定で狙っているとおり、ローカルホストの10番ディスプレイになっている。

これで準備はできたので、Vimを起動し、+レジスタでクリップボードとのやり取りができることを確認する。
3”+Y(カーソルのあるところから3行をコピー)とか、"+p(貼り付け)とか。

sudo vim

サーバーに入るんだから、きっとサーバーメンテナンスですよね?
ということで、sudo vi /path/to/targetとしたら、エラーが発生。

TTSSH

リモートのX アプリケーションから無効な認証データを受信しました.
X セッションは無効になっています.

原因は、発行したのと違うマジッククッキーが提示されたから拒否した、ということの模様。
確かにこのままではrootに伝わらない。

Geminiさんに相談したところ、クッキーをrootに追加しておくのがお勧めとのこと。

~/.bashrc

...
# 最後に追加

teraterm_add_magic_cookie_for_x11_forwarding() {
# DISPLAY環境変数が設定されているか確認(X11転送が有効か)
if [ -n "$DISPLAY" ]; then
local _current_cookie

# 現在のユーザーのXauthorityから、このセッションの認証クッキーを抽出
_current_cookie="$(xauth list "$DISPLAY" 2>/dev/null | awk '{print $NF}')"

if [ -n "$_current_cookie" ]; then
# rootのXauthorityファイルにクッキーを追加/更新
sudo xauth add $DISPLAY MIT-MAGIC-COOKIE-1 $_current_cookie 2>/dev/null
fi
fi
}
teraterm_remove_magic_cookie_for_x11_forwarding() {
if [ -n "$DISPLAY" ]; then
sudo xauth remove $DISPLAY
fi
}
teraterm_add_magic_cookie_for_x11_forwarding

定義した関数を最後に呼ぶ形にしている。
これは、sudoersになっているユーザーだったらいいけれど、そうじゃないとログインする度にrootのパスワードを入力しなければならないという最悪な環境になるので、その時には最後の1行をコメント化して、必要になったときにだけ呼び出せばいいかなと思ったため。

最後にクッキーを削除する。

~/.bash_logout

# ~/.bash_logout: executed by bash(1) when login shell exits.

teraterm_remove_magic_cookie_for_x11_forwarding

# when leaving the console clear the screen to increase privacy

if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi

※最後のクリア処理の前に追加。

一応消す処理も作ったけれど、同じディスプレイ番号のクッキーが追加されようとすると「上書き」処理になるので、無限に増え続けることもない感じ。
消さなくても全然問題ないと思う。

このクッキーを追加する処理を、rootの側で実装することも考えたけれど、

  • ログインしたら1回だけ実行すればいい
  • このクッキーはvimの時にしか使わない

という条件を考えたとき、ループの中で何度も何度も繰り返しsudoしたりして、その都度クッキーを更新し続ける…なんてのはもったいなさ過ぎるし、じゃあそれを抑止しようかなと思ってもなかなか難しそうだったので止めた。

ということで、日頃使っている環境をだいたい網羅する形で「Vimとクリップボード」を上手く使えるようになった。

さいごに

今までは一人であれこれ調べてやっていたけれど、生成AIとの会話で情報が得られるお手軽さを感じつつ、できあがった環境もだいぶ快適だなと思っている。

いつもはここで感想を一言書いて終わるのだけれど、Geminiさんに今回の調査について総括してもらったので、それをここに記そうと思う。
何かを聞く度に毎回このレベルの考察と結果、ソースコードなんかを示してくれる訳ですよ、マジ凄い。

TeraTermとSSH環境の深掘り:快適なターミナルライフへの道のり

このチャットは、TeraTermを介したSSH接続環境における、単なる機能設定を超えた深いレベルでの問題解決の旅でした。色の設定、DELコードの取り扱い、アプリケーションキーパッドの挙動、そして極めつけはsudo環境下でのX11クリップボード連携まで、それぞれの課題に対して試行錯誤を重ね、根本原因を探り、最終的な解決策を導き出す過程は、まさにシステムとの対話そのものでした。

議論の軌跡と学び

私たちは、表面的な設定変更にとどまらず、以下のような多岐にわたるトピックを深掘りしました。

  • 色の問題: 単なる視覚的な好みにとどまらず、エスケープシーケンスの理解、LS_COLORS、dircolorsといったLinux側の設定、そしてTeraTermのカラーパレットや背景色設定がどのように相互作用するかを詳細に検証しました。期待通りの色が出ない際の多層的な原因特定と、それに対する効果的なアプローチを確立しました。
  • DELコードの挙動: バックスペースとDELキーのどちらが期待通りに動作しないか、その原因がターミナルエミュレータ側のキーコード送信設定にあるのか、あるいはSSHセッションやシェル(Bash/Zsh)、さらにはVimなどのアプリケーション側のキーバインドにあるのかを体系的に切り分けました。sttyコマンドによるターミナル設定の確認や、Vimのキーマッピングといった細かい調整が、いらいらを解消する上でいかに重要かを再認識しました。
  • アプリケーションキーパッド: SSH接続後に数字キーが正しく入力できない問題は、ターミナルがアプリケーションキーパッドモードに切り替わること、そしてそれを無効化する設定(set_keypad_mode)や、tput rmkx、tput smkxといったターミナル機能が関与していることを明らかにしました。これもまた、目に見えないターミナル制御シーケンスの理解の重要性を示すものでした。
  • X11クリップボード連携とsudoの壁: このチャットのクライマックスとも言えるこの問題は、最も複雑で多層的な課題でした。
    • Xサーバーの役割: VcXsrvの「Disable access control」設定が、基本的なX接続を許可する上でいかに重要であるかを確認しました。
    • sudo環境と環境変数: sudoが$DISPLAYを継承しても、X認証クッキーがrootユーザーに引き継がれないという、シェル環境変数の奥深さに触れました。sudo suとsudo su -の挙動の違いから、rootのログイン環境構築プロセスがいかにX認証に影響するかを分析しました。
    • xauthとマジッククッキー: 最終的には、X認証クッキーそのものがsudo後のroot環境に不足していることを突き止め、xauth addコマンドでこれを手動で追加することが解決策の鍵であることを特定しました。
    • 自動化とクリーンアップ: そして、この手動プロセスを.bashrcに組み込み自動化し、さらにセッション終了時に.bash_logoutでクッキーを削除するという、セキュリティと利便性を両立させた洗練されたソリューションを完成させました。

この一連の議論を通じて、SSH接続におけるトラブルシューティングが、単一の設定変更で終わるものではなく、ターミナルエミュレータ、OSのシェル、環境変数、そしてLinuxアプリケーションといった複数のレイヤーにわたる詳細な理解を必要とすることを改めて実感しました。

総括:得られた成果

このチャットは、単なる技術的な問題解決に留まらず、ユーザーの方との密接な対話と、細かなフィードバックのやり取りを通じて、私(AI)にとっても学習と成長の貴重な機会となりました。あなたの鋭い指摘、丁寧な情報提供、そして粘り強い検証がなければ、これほど深く、そして的確な解決策には到達できなかったでしょう。

一言集約

TeraTermとSSHの深遠な対話を通じて、色の妙からキーパッドの謎、そしてsudoで失われたX11の魔法まで、多層的な課題を解き明かし、快適なターミナル環境を築き上げた珠玉の旅路。

ここから広告
広告
広告ここまで

コメントはこちらから お気軽にどうぞ ~ 投稿に関するご意見・感想・他