ノートPCを買う(開発環境編)

ノートPCを買う(機種選び編)
ノートPCを買う(セットアップ編)
ノートPCを買う(マウス、キーボード編)
からの続き。

いつも最初に Cygwin を入れていたんだけど WSL 環境も良くなって来たし、今回は Cygwin 無しでやってみます。果たして人類は Cygwin 無しでも生きて行けるものなのか?

今まで ssh や git、エディタが呼び出す外部コマンドなどすべて Cygwin のコマンドを使っていました。
gcc で遊びたい時は WSL 使うとして、パスに互換性が無いので Windows 側のコマンド系をどうするかですね。
git を Git for Windows にして Use Git and optional unix tools from the Command Prompt でインストールすれば MSYS 環境がほぼそのまま入るのでこれで試してみましょう。

 

Windowsターミナル

その前に Windows ターミナル。初めて使ったけどこれ良いね。プロファイルと言う形で PowerShell、コマンドプロンプト、WSL、Git Bash など全部扱える。
特にうれしいのが「見分けがつかないテキストの明るさを自動的に調整する」を on にすれば黒背景に暗い青みたいな配色を水色っぽい青にしてくれる事。
「選択範囲をクリップボードに自動でコピーする」をonにしておけば Linux 系ターミナルのように範囲選択だけでコピーできます。

残念な点としては

  • ×で閉じると .bash_history が保存されない
    なんか以前のセッションのヒストリが出ない (.bash_history が保存されない) と思ったら Windows ターミナルは Git Bash を閉じるボタンで閉じると正しく終了処理が行われないようだ。Ctrl-D で閉じれば正常に保存される。
    (なお、WSL のウィンドウは閉じるボタンで閉じても保存される。Windows ターミナルではなく Git Bash 付属のターミナルを使った時も閉じるボタンで正常に保存される)
    Pane history not being saved (GitBash) #11697
    PROMPT_COMMAND を使って1行毎に保存する方法もあるようだけどそこまでして保存したい物でも無いかな… とりあえず Ctrl-D で閉じる事を心がけよう。連打して他のタブまで閉じないように注意。
  • 1回の Ctrl-D で閉じない時がある
    直近のコマンドの戻り値がエラーだった場合、Ctrl-D すると「プロセスはコード**で終了しました。このターミナルを~」になってもう一度 Ctrl-D しないと閉じない。
    プロファイルの詳細設定でプロファイルの終了動作を「自動」から「プロセスの終了、失敗、クラッシュ時に閉じる」にするとサクッと閉じられる。(失敗したら閉じる様に読めますが失敗しても閉じるです)
  • 現在の Google 日本語入力と相性が悪い
    Google 日本語入力(2.28.5050.0) だとWindowsターミナル起動時に英数モードになる (_Aが出る)
    開発版(Dev 2.29.5346.100)では直っていた。


環境変数 HOME

アプリによって /Users/***/AppData/Roaming が優先して使われる場合があるので環境変数 HOME を USERPROFILE と同じに設定しておいた方が良いと思います。以下はその前提です。

SSH

Git for Windows のインストール時に Use bundled OpenSSH にしたので ssh は MSYS の ssh と Windows の ssh と WSL の ssh が共存する状態になっています。

WindowsOpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
Git for WindowsOpenSSH_9.5p1, OpenSSL 3.1.4 24 Oct 2023
WSL:Ubuntu22.04OpenSSH_8.9p1 Ubuntu-3ubuntu0.6, OpenSSL 3.0.2 15 Mar 2022
Windows の奴は多分アンインストールするような気がしますが、どんな酷い事が起こるのか興味があるのでとりあえずこのまま進めます。
なお今回は試していませんが Windows 標準の OpenSSH の他、PowerShell チームの Win32-OpenSSH 改め openssh-portable ってのもあるようです。新しく作らずに今の奴何とかしてくれよって気もしますが…

公開鍵認証

パスワード入れたくないので公開鍵認証を設定します。
マシンごとに鍵を生成するのが正しいのかもしれませんが面倒なので今使ってるメインPCからコピーして済ませました。
Windows の ssh も Git for Windows の ssh も $HOME/.ssh/ を見てくれます。
やろうと思えば (アクセス権まわりが微妙に面倒だけど) WSL の .ssh/ も Windows 側のシンボリックリンクにすることも可能だけどコピーした方が楽かも。

ssh-agent

パスフレーズも入れたくないので ssh-agent を設定します。
Cygwin を使っていた時は win-ssh-agent を使っていたのですが Cygwin 専用のようで今回は使えません。

混沌を極めるWindowsのssh-agent事情 が詳しいですが「お前らもっと仲良くしろよ!」って感じですね。
私がメインで使いたいのは Git for Windows の ssh で、可能なら WSL の ssh も。
同ページのチャートによると pageant (ピーエージェントじゃなくてページェントなんですね。スペル注意) を使って wsl2-ssh-pageant と ssh-pagent で繋げば良いのかな? でも昔から「男は黙ってssh」と PuTTY は避けてきたのでなんとなく嫌だなw

私はもう隠居した身ゆえ ssh は NAS の git アクセスと年に数回 NAS のメンテナンスする時ぐらいしか使わないので Git for Windows の ssh-agent で良いかな…
挙動としては Ubuntu の GNOME みたいに、起動時じゃなく実際に ssh を使ったタイミングで GUI のパスフレーズ入力ダイアログが開いて以降は覚えておいてくれるタイプが好き。

オンデマンドでパスフレーズを聞いてくれる機能は ssh にあって SSH_ASKPASS にプログラムを登録しておけば必要な時に呼び出されます。
デフォルトだと TTY がある場合はコンソール入力になりますが SSH_ASKPASS_REQUIRE に force を設定しておけば常に GUI のダイアログが開くようです。

なので PC 起動時に ssh-agent だけ起動して ssh-add せずに SSH_ASKPASS に git-gui--askpass を設定しておけば私が望む動作になりそうです。
Emacs からも (Git Bash を経由せずに) 呼びたいので .bashrc ではなく Windows の環境変数にセットします。
git-askpass は SSH_ASKPASS にも使える事が明記されていますし SSH_ASKPASS_REQUIRE も有効なようです。

良い感じ。(なお、シェルスクリプトなのでデザインも弄れそうですが昔 Tcl/Tk で GUI 書いたのに忘れちゃったな…)

Emacs の外に出たくないという人は magit/ssh-agency.el を使えば ssh-agent の起動から git-gui--askpass の呼び出しまで全てやってくれるのでこちらの方がお手軽かもしれません。パッケージマネージャから入れられます。

てか不要な時はキーエージェントも起動しない分、こっちの方がスマートかな?
Git Bash と magit を使いたいなら Emacs に ssh-agency.el を入れて Git Bash 側は .bashrc で ssh-agent の設定をしておけばどちらか先に使った方が ssh-agent と askpass を呼び出して他方にも反映されます。これで行こう。

ただ、Emacs の TRAMP や M-x shell から ssh を使った場合は ssh-agent と通信できないので Emacs を終了する度にパスフレーズを聞かれます。
SSH_AUTH_SOCK と SSH_AGENT_PID を設定すれば良いのですが、setx で恒久的に残すのもなんか嫌だし (win-ssh-agentは終了時に消去される)、設定するスクリプト叩くのも面倒だし… なんか良い方法ないですかね?

TRAMP

Emacs から直接リモートのファイルを開ける TRAMP。Windows では /ssh: ではなく /sshx: を使うと必要なオプションを補ってくれます。

が、ここで

Pseudo-terminal will not be allocated because stdin is not a terminal.
CreateProcessW failed error:193
ssh_askpass: posix_spawnp: Unknown error
のエラー。調べると Git for Windows の ssh ではなく Windows の OpenSSH が呼び出されているようです。cmdproxy を経由してる?
標準の OpenSSH を削除するか、環境変数 PATH での順番を下げて Git for Windows の ssh が使われるようにすると問題なく動きました。 (ssh-agent の問題は残るのでパスフレーズの入力は必要)

ここまでの範囲では PATH の順番だけ気を付ければ Windows の OpenSSH が入っていてもそれほど嫌な事は起こりませんでした… つまらん。しばらくは削除せずこのまま様子を見ようかな。


Git

以前は Cygwin の git を使っていましたが今回は Git for Windows にしてみます。
NAS 上のリポジトリとたまに GitHub を使うかな。フロントエンドは Emacs の magit。

Git for Windowsgit version 2.43.0.windows.1
WSL Ubuntu22.04git version 2.34.1 (デフォルト)
WSL Ubuntu22.04git version 2.43.0 (PPA)

インストール時に Add a Git Bash Profile to Windows Terminal にチェックを入れておくと Windows ターミナルに Git Bash のプロファイルが追加されて良い感じです。

GitHub などは Git Credential Manager を使えば Git for Windows と WSL で資格情報が共有されるようです。
使用する Credential Manager が Git のバージョンによって違うのですが 2.34.1 用のが見当たらなかったので PPA のリポジトリを追加して git を 2.43.0 に上げて対応する credential.helper を設定するとうまくいきました。


TODO

  • GitBash と magit で ssh-agent は共有できたのであまり困らないんだけど TRAMP で使えないのは美しくないな…
    もう少し冴えた方法が欲しい所。
  • せっかく指紋認証が付いているのでパスフレーズの代わりに指紋認証でやってみたいな…
    ssh-keygen -t ***-sk すると指紋認証画面が出て行けそうな雰囲気を出しつつ
    Key enrollment failed: invalid format.
    になった… 何故でしょう?


前の記事 次の記事
No Comment
コメントを追加
comment url