NGW開発BLOG
← 記事一覧へ
·#075

リターンキーを、また「バーン」と叩くようになった体験用サーバ二台と、三十年前の手つき

二日かけて体験用のサーバを二台建てた。コマンドは覚えられないので、やることは全部ボタンにしてある。その途中で「画面にはオンと出ているのに誰も入れない Mac」に半日を溶かし、犯人は自分の設定ファイルの一行だった。そして夕方、自分がリターンキーを「バーン」と叩いていることに気づいた。昔やっていたように。

二日かけて、体験用のサーバを二台建てた。

新しい体験版のデモ機として、これから使ってもらう NGW である。メインとクローンの2台セットだ。中身は Ubuntu と MySQL で、それが Mac mini の上の仮想マシンとして載っている。二台のあいだはレプリケーションで繋がっていて、メインに書けばクローンにも同じものが流れてゆく。

建てたのは私である。Linux は何十年ぶりかで触った。覚えていたコマンドは ls -lashutdown -h now だけであった。

それでも建った。なぜならやることを全部ボタンにしてあるからである。


覚えられないので、ボタンにする

管理コンソールは二つある。NGW保守コンソールが Linux の中を扱い、NGW Mac設定が Mac 本体を扱う。前者は接続先の IP を変えればメインでもクローンでも扱えて、後者は「いま自分が動いている Mac」だけに効く。

この二つに、こういうものが並んでいる。

  • バックアップを取る・戻す
  • レプリケーションを組む・確かめる
  • 本番とクローンを入れ替える
  • 保管先のディスクを広げる
  • 夜中に自動で再起動して、落ちていたら勝手に起こす
  • 仮想マシンのイメージを丸ごと別の Mac へ送る

どれも、素でやろうとすれば systemctl だの mysqldump だの rsync だのを覚えねばならぬ。覚えられない。覚えられないものは、忘れる。忘れたころに障害が起きる。夜中に起きる。

だから手順書に「ここで scp して実行」と書きそうになったら、それは実装漏れのサインである、という決め事にしてある。書きそうになったら、書かずにボタンを作る。

それでもコマンドを打ちたい場面のために、画面に「📋 手で実行する場合のコマンド」という引き出しが付いていて、ボタンが実際に流すのと同じものがコピーできる。灰色の説明行はコピーに含まれない。zsh は # をコメントとして扱わないので、貼ると command not found がずらずら並ぶからである。そういう細かいところで、人は嫌になる。

昨日から今日にかけて、そこにもう一つ足した。管理ツールを配るボタンである。

新しい版のアプリを、現地の Mac に配る。それだけのことだが、手でやると ditto で固めて scp で送って ssh で開く、という三行になる。三行を二台ぶん、版が上がるたびに。手で打っている限り、必ず一台だけ古い版のまま残る。しかも古いかどうかは、画面の隅のビルド日時を見ないと分からない。

ボタンにした。何を・どの機体に、を選んで押す。中では、古いものを消してから展開し(消さずに置くと アプリ.app/アプリ.app という入れ子ができて、外側の古い方が起動し続ける)、隔離属性を落とし、最後に入った版を読み上げる。相手側でそのアプリが起動していたら、触らずに止める。動いているアプリの中身を消すと、画面は開いたままボタンだけが効かない、という実に分かりにくい壊れ方をするからである。

そして、その配布が通らなかった。


画面には「オン」と出ているのに、誰も入れない Mac

一台目に配ろうとしたら、パスワードが拒否された。

調べた。パスワードは正しい。dscl で照合したら通る。ユーザーは管理者。リモートログインはオン。共有設定の画面には「アクセスを許可: すべてのユーザ」と出ている。ポート22は開いている。その Mac 自身から自分にログインすると、入れる

なのに、こちらからは入れない。

疑ったものを順に挙げる。パスワード違い。ユーザー名違い。アクセス許可の設定。sshd_config。PAM。フルディスクアクセス。launchd の二重登録。ホスト鍵。IP の衝突。

途中で一つ、本物を見つけた。com.apple.access_ssh-disabled という名前のグループが残っていた。macOS はリモートログインをオフにすると、ssh の許可グループの名前の末尾に -disabled を付けて退避させる。その状態のまま sshd だけが動いていると、ポートは開いているのに全員が拒否される。画面には「オン」と出たままで。

直した。まだ入れない。

デバッグ用の sshd を別のポートに立てて繋いでみたら、同じパスワードで、あっさり入れた。同じ Mac、同じ設定、同じユーザー、同じパスワード。ポート番号だけが違う。

そこでようやく、自分の Mac の ~/.ssh/config を見た。

Host ngw101 192.168.0.101
    HostName 192.168.0.101
    Port 2222        ← これ

2222 番は、その Mac の中の Linux 仮想マシンへの転送口である。つまり私は半日のあいだ、Mac のパスワードを、その中の Ubuntu に向かって送り続けていた。断られて当然である。

始末が悪いのは、途中で「相手は確かに Mac の sshd だ」と確信していたことだ。ssh-keyscan でホスト鍵を取って、Mac 本体のものと一致することを確かめていた。ところがssh-keyscan~/.ssh/config を読まない。だから素直に 22 番へ行って、Mac の鍵を持って帰ってくる。一方 ssh は設定に従って 2222 番へ行く。同じ相手を見ているつもりで、別の相手を見ていた。偽の証拠を握らされていたわけである。

犯人は自分の設定ファイルの一行だった。


覚えるのではなく、踏まない形にする

ここで「今度から気をつけよう」で終われば、また踏む。

直したのはアプリのほうである。Mac 本体を相手にするときは、常に 22 番を明示するssh -p 22scp -P 22rsync の中の ssh にも。こうしておけば、使う人の設定ファイルに何が書いてあっても関係ない。

そして、偽の sshscp を用意して、それが本当に -p 22 を渡されているかを検査するテストを書いた。ポート指定を外すと落ちる。忘れたころに誰かが外したら、その場で落ちる。

似たことを、今日は他にも三つ書いた。認証が拒否されたときにしか通らない分岐を、偽の ssh で実際に発火させるテスト。ボタンが流すコマンドと、画面に載せた手打ち用コマンドが食い違っていないかを見るテスト。「鍵が一本も入っていない機体では、パスワード認証を切らない」という締め出し防止のテスト。

どれも、人が覚えていなくても成り立つようにするためのものである。私は覚えられない。だから覚えなくていい形にする。それだけのことを、二日やっていた。


ところで、リターンキーである

夕方、ふと気づいた。

最近やたらと、リターンキーを「バーン」と叩いている。

少し前まではそっと押していたはずだ。Mac の薄いキーボードに、そんな叩き方は似合わない。それがいつの間にか、指を立てて、上から落とすように押している。

いつからだろうと考えて、思い当たった。Linux を触り始めてからだ。

正確に言えば、コマンドラインに戻ってからである。

そしてもうひとつ思い出した。私は昔、この叩き方をしていた。


ジョブを投げるキー

昭和63年、電算係に配属された。庁舎には三菱の MELCOM COSMO 700S が三年前から動いていて、私はそこで COBOL を書いた。

当時のリターンは、いまのリターンとは意味が違った。あれはジョブを投げるキーである。押したら取り消せない。結果が出るのは翌朝で、間違っていれば一日が消える。だから押す前に一拍あって、そのあと「バーン」と来る。覚悟を決める音であった。

1990年代の前半に MELCOM EX へ移った。これも汎用機である。OS が変わったぶん JCL は書き直しになったが、書くものは相変わらず COBOL であった。リターンは、まだジョブを投げるキーのままだった。

1990年代の後半に、クライアントサーバへ移った。apricot FT8000、OS は Windows NT Server 3.51 日本語版。その上で動かしたのが METROCS ―― 三菱電機の「自治体向け総合行政情報システム」のパッケージである。ここから GUI になった。マウスになった。VB を触るようになる。リターンは「ジョブを投げるキー」ではなく、ダイアログの OK を押すキーになった。

「バーン」が眠ったのは、たぶんこの時である。

そして 2007年、市町村合併で町から市になって、METROCS も終わった。

三世代。二十年。COBOL は COSMO から EX へ持ち越せた。だが JCL は書き直しになり、apricot と METROCS の時代には、その両方が要らなくなった。メーカー独自の流儀は、その機械の寿命と一緒に終わる。覚えたことは、そのたびに置いていくことになった。


牛柄の箱

その電算室の片隅に、もう一台あった。

牛柄の段ボールで届いた、アメリカ製のパソコンである。Gateway。庁内と外をつなぐ出入口――ゲートウェイサーバとして置かれていた。事務机に置くのと同じ形のデスクトップ機で、牛柄のマウスパッドが付いてきた。

牛柄の段ボールで届いた(図は自作)

中身が Red Hat Linux だった。

私が覚えている ls -lashutdown -h now は、あの一台で覚えたものである。

三菱の重厚な筐体が並ぶ部屋で、基幹でも業務システムでもない、回線の面倒を見るためだけの箱。当時、そこで覚えたことが三十年後まで生き延びるなんて、判断する材料は何ひとつ無かった。

もう一つ。この牛柄の話も、自分から出てきたのではない。「牛柄の箱」と言われて、思い出したのである。「Gateway 社の PC」では何も起きなかったのに、牛柄で事務室ごと戻ってきた。

思い出は説明では戻らず、手触りで戻る。リターンキーと同じ仕組みである。


事務屋である

――と、ここまで書いて、正直に言い直しておく。

二行では「残った」とは言えない。二十年分に対して、ほとんど何も無いのと同じである。汎用機のコマンドは、ほとんど覚えていない。JCL も、いま書けと言われたら書けない。今回 Linux を触って何とかなっているのは、記憶のおかげではない。手順書とボタンと、隣で調べてくれる相手がいるからだ。

だが、ずっとやっていたことが、一つだけある。

データを移す仕事である。

システムをリプレースするたびに、ホストから CSV でデータを抜き出し、ACCESS で加工して、新しいシステムへ投入する。COSMO から EX へ。EX から apricot へ。あれは全部、私の仕事だった。

VB も、3、4、5、6 と使った。Windows が NT3 の頃である。VB6 で書いたものは今でも動く――ものと、Windows 11 では動かなくなったものがある。

道具は変わり続けた。COBOL、JCL、VB、ACCESS。だが、やっていることは三十年変わっていない。抜いて、整えて、入れる。

事務屋なんですよ。

機械の流儀は、機械と一緒に消えた。この仕事だけが消えなかった。どの機械にも属していなかったからである。

そして――

残ったのは、この仕事と、リターンキーを叩く手つきだった。

手つきのほうは、覚えようとして覚えたものではない。勝手に染み付いて、勝手に戻ってきた。黒い画面を離れたときに眠り、黒い画面に戻ったときに起きた。あいだに GUI の三十年が挟まっていたのに、身体のほうはちゃんと覚えていた。


それで、優しく押すことにした

そう考えると、手が「バーン」に戻ったのは理屈が通っている。

この二日、私が投げていたのは、取り消せないものばかりであった。rm -rfshutdown。他人の Mac の authorized_keys への追記。許可グループの削除。押したら戻せない。汎用機のジョブと同じである。身体のほうが、状況を正確に読んでいた。

だが、それを人間の覚悟に頼らせるのは筋が悪い。

配布ボタンが rm -rf の前に「相手でそのアプリが起動していないか」を確かめるのも、パスワード認証を切る前に「鍵が何本入っているか」を数えるのも、あの覚悟を人間に肩代わりさせるためにある。バーンと叩く必要がある操作は、ボタンの中に閉じ込める。

そして Magic Keyboard は薄い。

優しく押すことにした。


AIとの協働作業での学び

今回は、AI のほうが偽の証拠を握って、長く回り道をした日であった。

ssh-keyscan でホスト鍵が一致したことをもって「相手は Mac の sshd だ」と結論し、そこから先の切り分け――許可グループ、PAM、TCC、launchd――を全部その前提の上でやっていた。前提が間違っているのだから、いくら丁寧に潰しても当たらない。半日ぶんの丁寧さが、まるごと無駄になった。

しかも同じ日、こちらの側にも間違いがあった。「赤帽子は UNIX だったのでは」と推測して外した(赤帽子は Red Hat、つまり Linux である)。エラーメッセージの中に半角の " を一つ入れて、認証が失敗したときにだけスクリプトが壊れる、という質の悪いバグを作り込みもした。正常系では絶対に発覚しない場所だったので、実機で一台だけ登録に失敗したときに初めて表に出た。

人間の側が出したもののほうが、決定打になった。

「画面共有とリモートログインは同時にできないと思っていた」という一言から、排他なのは画面共有とリモートマネージメントだけだと分かり、そこから「ならばメイン機の画面からクローン機を見られる」という運用の改善が出てきた。「②前提設定で一発でできるといいし、状態確認にも出しておけば分かりやすくないか」という一言から、共有設定がボタンに吸収され、状態画面に出るようになった。今日つまずいた -disabled は、次からは赤字で最初に出る。

そして、こういうやり取りがあった。

「あなたがいないと何もできないというのが正直な話」

それに対して、こう答えるのが誠実だと思った。今日いちばん価値があったのは、私がいなくても同じことができる形が増えたことだと。

配布は三行のコマンドを覚える話ではなくボタンになった。共有設定は「まとめて設定」に吸収された。com.apple.access_ssh-disabled という、知らなければ一生辿り着けない罠は、画面に赤字で出るようになった。今日の半日は、次からは数秒である。

覚えられない人間が使う道具は、覚えなくていいように作るしかない。

そして道具のほうも、間違える。今日は間違えた。だから、間違えても落ちるようにテストを書いた。

リターンキーを叩くのは、それからでいい。


※ 昔話のくだりについて — 後半は記憶だけを頼りに書いている。当時の手帳も資料も残っていない。機種名、年代、前後の順序には、推測や思い違いが混じっているはずである。三十年以上前のことなので、そこはご容赦いただきたい。確かなのは、リターンキーを「バーン」と叩いていたことだけである。