[インデックス 10029] ファイルの概要
コミット
コミット: 7bc4f8de0fc91b209265f797fd20820914f5baaa
作成者: Adam Langley agl@golang.org
日付: 2011年10月18日 12:58:57 (UTC-4)
メッセージ: exp/terminal: split terminal handling from exp/ssh
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/7bc4f8de0fc91b209265f797fd20820914f5baaa
元コミット内容
exp/terminal: split terminal handling from exp/ssh
This change splits terminal handling from exp/ssh, as suggested
several times in the ssh code review.
shell.go and shell_test.go are copies from exp/ssh with minimal
changes, so don't need another full review. A future CL will remove
that code from exp/ssh.
R=bradfitz, r, dave, rsc
CC=golang-dev
https://golang.org/cl/5278049
変更されたファイル:
- src/pkg/exp/terminal/Makefile (15行追加)
- src/pkg/exp/terminal/shell.go (359行追加)
- src/pkg/exp/terminal/shell_test.go (110行追加)
- src/pkg/exp/terminal/terminal.go (103行追加)
- src/pkg/syscall/types_linux.c (107行追加)
- src/pkg/syscall/ztypes_linux_amd64.go (111行追加)
合計: 6ファイル変更、805行追加
変更の背景
このコミットは、Go言語の初期開発段階(2011年)において、SSH機能と端末処理機能の分離を行った重要な変更です。当時、Goはバージョン1.0のリリース前で、実験的パッケージ(exp/)の下で新機能の開発が進められていました。
SSH実装の開発過程で、端末処理(terminal handling)機能がSSH特有の機能と密結合になっていることが問題となっていました。コードレビューの過程で複数回にわたって、この機能を分離すべきという提案がなされており、このコミットでその分離が実現されました。
この分離により、端末処理機能は独立したパッケージとして再利用可能になり、SSH以外の用途でも利用できるようになりました。これは、Go言語の設計哲学である「小さく、再利用可能なコンポーネントの組み合わせ」に沿った変更でした。
前提知識の解説
端末処理(Terminal Handling)とは
端末処理とは、コンピューターの端末(ターミナル)との入出力を制御する機能です。これには以下のような機能が含まれます:
- PTY(Pseudo Terminal)管理: 仮想端末の作成と制御
- 端末サイズの取得・設定: 行数、列数、ピクセル数の管理
- 端末モードの制御: raw mode、cooked mode等の設定
- シグナル処理: SIGWINCH(ウィンドウサイズ変更)等の処理
SSH(Secure Shell)との関係
SSH接続では、リモートホストとの間で端末セッションを確立する必要があります。この際、以下の機能が必要になります:
- 端末エミュレーション: クライアント側の端末をサーバー側で再現
- 端末サイズの同期: クライアントとサーバー間でのウィンドウサイズ同期
- 制御文字の処理: Ctrl+C、Ctrl+Z等の制御文字の適切な処理
実験的パッケージ(exp/)について
Go 1.0リリース以前、新機能はexp/
パッケージの下で開発されていました。これらのパッケージは:
- API安定性の保証なし: 将来的に大きく変更される可能性
- 実験的な実装: 新しいアイデアや機能の試作品
- フィードバック収集: コミュニティからの意見を収集する場
技術的詳細
システムコール層の実装
このコミットでは、Linux向けのシステムコール定義が追加されています:
- types_linux.c: C言語でのシステムコール型定義
- ztypes_linux_amd64.go: AMD64アーキテクチャ向けのGo型定義
これらのファイルは、端末制御に必要な低レベルシステムコールをGoから呼び出すために必要です。
端末サイズ構造体
端末のサイズを表現するための構造体が定義されています:
type Winsize struct {
Row uint16 // 行数
Col uint16 // 列数
Xpixel uint16 // 幅(ピクセル)
Ypixel uint16 // 高さ(ピクセル)
}
PTY(Pseudo Terminal)の実装
仮想端末の作成と制御のための機能が実装されています:
- マスター・スレーブ構造: PTYペアの作成と管理
- I/O制御: 非ブロッキングI/O、バッファリング制御
- シグナル処理: SIGWINCH等のシグナルの適切な処理
コアとなるコードの変更箇所
1. Makefile の追加
新しいパッケージのビルド設定が追加されました。
2. shell.go の移動
SSH パッケージから端末処理機能が分離され、独立したシェル実装が作成されました。
3. shell_test.go の追加
端末処理機能のテストコードが追加されました。
4. terminal.go の実装
端末制御の基本機能が実装されました。
5. システムコール定義の追加
Linux向けの端末制御システムコールが定義されました。
コアとなるコードの解説
端末サイズ取得機能
端末のサイズを取得する機能は、SSH接続時にクライアントとサーバー間でウィンドウサイズを同期するために重要です。これにより、リモートアプリケーションが適切な画面サイズで動作できます。
PTY管理機能
仮想端末の作成と管理機能は、SSH接続時にサーバー側で端末セッションを提供するために必要です。この機能により、リモートからのコマンド実行が可能になります。
シグナル処理
SIGWINCH(ウィンドウサイズ変更)シグナルの処理により、端末のサイズが変更された際に適切に対応できます。これはインタラクティブなSSHセッションには不可欠な機能です。
関連リンク
- golang.org/x/crypto/ssh パッケージ
- golang.org/x/term パッケージ
- creack/pty - Go PTY パッケージ
- Go SSH 実装例
- 端末エミュレーション入門
参考にした情報源リンク
- Go Packages - golang.org/x/crypto/ssh
- Go Packages - golang.org/x/crypto/ssh/terminal
- GitHub - golang/crypto ssh/terminal
- Go Weekly Snapshot History
- Unix & Linux Stack Exchange - PTY/TTY について
- Medium - Go SSH クライアントシェルセッション
- TheLinuxCode - Golang SSH 実装例
- DEV Community - Linux 端末、TTY、PTY、シェル
- DoltHub Blog - Go での対話型シェル構築