慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

小众软件
小众软件
博客园 - 叶小钗
有赞技术团队
有赞技术团队
大猫的无限游戏
大猫的无限游戏
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
Hugging Face - Blog
Hugging Face - Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
T
Tailwind CSS Blog
Jina AI
Jina AI
量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
J
Java Code Geeks
V
Visual Studio Blog
月光博客
月光博客

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Кто решает судьбу вашего проекта? Разбираем заинтересованные стороны. BABOK #1 Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как Фалькон Тех меняет пространство к лучшему
macOSでWinSSHTermのまともな代替品を見つけられず、キレて自分で書いた。
bekhzad-kham · 2026-05-28 · via Все публикации подряд на Хабре

難易度レベル簡単

読了時間4分

範囲と読者1.2K

TL;DR

macOSに移行した後、WinSSHTermと同じくらい便利に日常のシナリオをカバーするSSHクライアントが見つかりませんでした。
絶え間ない妥協に疲れ果て、要件をまとめ、自分のクライアントを構築し、コードをオープンソースとして公開した。

リポジトリ

コンテキスト

複数のサーバーを扱う場合、ほとんどどのSSHクライアントでも「まあまあ」使える。
毎日数十から数百のホストを扱う場合、スライド上の機能よりも、速度と予測可能性が重要になる。

  • どのくらい早く目的のホストを見つけるか;

  • 接続までの操作の数;

  • 環境構造を整理しておくのがどのくらい便利か;

  • アプリが1ヶ月の積極的な使用後にどのように動作するか。

Windowsでは、この点で長い間WinSSHTermに助けられていた。
macOSに移行した後、一晩で類似品を見つけられると思っていた。うまくいかなかった。

既存の解決策で何が不満だったのか

私は「理想」を探していたわけではない。仕事の妨げにならないツールを探していた。
問題はクライアントごとに繰り返されていた:

  1. セッションに至るまでの道のりが長すぎる
    主要なシナリオは迅速であるべきだが、しばしば不要なクリックに埋もれていた。

  2. 大規模なホストプールの組織化が不十分
    多くの環境やプロジェクトがあるとき、適切なグループ、タグ、検索がなければ、すべてが混乱に陥ります。

  3. 過負荷なインターフェース
    美しいパネルと「リッチなUI」は、アプリケーションを開く目的である接続と作業をしばしば損なっていました。

  4. 設定の不便な移植性
    保存、移植、バージョン管理が容易な透明な構成が望まれました。

数週間のテストの後、私は気づいた。ツールとの格闘に、課題解決よりも多くの時間を費やしていると。

なぜ自分で書くことにしたのか

理由は「周りの全てが悪い」からではない。
理由は、特定の日常業務に合わせた具体的な要件セットがあったからだ。

私は座って、何を必須と考えるかを形式化した:

  • 起動と接続が最速;

  • 名前/IP/タグでの検索;

  • 環境やプロジェクトごとのグループ構造;

  • 頻繁な操作のホットキー;

  • 予測可能な設定保存;

  • 視覚的ノイズ最小化;

  • 多数ホスト時の安定動作。

この後、明らかになったのは、他人の妥協に際限なく適応するよりも、自分自身のツールを構築する方が簡単だということだ。

クライアントを構築する際の原則

1) Local-first

主要なシナリオは、迅速に動作し、ネットワーク依存がないこと。
ホストとセッションのデータはローカルで利用可能であり、リストを開くためにUIが「外部サービス」を待つことはない。

2) 接続への迅速化

すべての機能は、アクティブセッションへの道を加速させるかどうかという質問で評価される。
そうでなければ、バックログへ。

3) 予測可能性は「魔法」よりも重要

少し「自動的な賢さ」が少なくても、理解可能で制御可能なロジックの方が良い。

4) コンフィグを資産として

設定は次の条件を満たすべきである:

  • 人間が読みやすいこと;

  • バックアップに適していること;

  • マシン間で移植可能;

  • Gitに便利。

アーキテクチャ(高レベル)

アプリケーションをいくつかの独立したレイヤーに分割しました:

  1. UI Layer
    ホスト一覧、検索、フィルター、セッションカード、クイックアクション。

  2. Session Layer
    SSHセッションのライフサイクル: 起動、再接続、終了、ステータス。

  3. 構成レイヤー
    設定の読み取り/検証/移行(ホスト、グループ、タグ、プリセット)。

  4. ストレージレイヤー
    サービスデータ用のローカルストレージ(例:最近/お気に入り/履歴)。

  5. 統合レイヤー
    システムSSHおよびmacOS環境との連携。

これにより、UIロジックと接続を混在させず、設定形式を変更してもすべてを壊さないようになりました。

実際に役立つデータモデル

最初は簡略化した「ホストリスト」モデルを試しました。
すぐに明らかになったのは、インフラストラクチャが成長するにつれて、適切な構造が必要になることです。

基本エンティティ:

  • ホスト
    名前、アドレス、ポート、ユーザー、authパラメータ、メタデータ。

  • グループ
    論理グループ(例: prod、 staging、 clients/*)。

  • タグ
    横断的な切り口(k8s、 db、 critical、 legacy)。

  • プロファイル
    再利用可能な接続パラメータ。

  • SessionPreset
    セッション動作のプリセット。

まさに組み合わせ group + tags + search が実際に速度面で最大の効果をもたらしました。

最大の効果をもたらしたUXソリューション

  1. デフォルトの検索に焦点
    クライアントを開けば、すぐに入力とフィルタリングが可能。

  2. キーボードでのクイック操作
    「キーボード/マウス」の切り替えが少なければ少ないほど、作業サイクルは速くなる。

  3. 最近使用したホストとお気に入りホスト
    頻繁に接続する相手は1アクションでアクセスできるべき。

  4. 最小限のモーダルウィンドウ
    モーダルは作業の流れを妨げる。やむを得ない場合にのみ使用している。

  5. 安定した情報階層
    同じ種類の情報は常に同じ場所にある。

セキュリティと運用

私は、よく後回しにされる基本的なことを別途組み込んだ:

  • プライベートキーをアプリケーション内に保存しない;

  • システムのSSHメカニズムを使用する;

  • 接続先のホスト/環境を明示的に表示する;

  • 危険なデフォルトを避ける;

  • 診断に必要なものだけをログに記録し、機密データの漏洩を防止する。

これによりクライアントが「絶対に安全」になるわけではない(そんなことはありえない)が、「便利だがリスクがある」という典型的な間違いを排除する。

最も難しかったこと

  1. 余分な機能を削除すること
    ボタンを追加するのは簡単だが、不要なものを取り除くのは難しい。

  2. シンプルさと柔軟性のバランスを保つ
    「シンプルでありながら強力」をコンバインなしで実現するのは、反復的なプロセスであり、一度のデザインではない。

  3. 細かい部分を使いやすく仕上げる
    最も「目に見えない」もの(フォーカス、タブの順序、キーボードシナリオ)は、大きな機能よりも重要である。

最終的に得られたもの

主な変化は「もう一つのSSHクライアントが登場した」ことではない。
重要なのは、日常的な摩擦が消えたことだ:

  • 目的のノードをより速く見つけられる;

  • 環境を切り替える際のミスが減った;

  • インターフェースに気を取られない;

  • 移行やバックアップ時に設定と格闘しなくて済む。

簡単に言えば、ツールは問題の一部ではなくなり、再び解決策の一部となった。

ロードマップ

プロジェクトの次のステップ:

  1. 大規模ホスト群向けのバルク操作の改善。

  2. 設定のインポート/エクスポートの拡張。

  3. より柔軟なフィルターと保存されたビュー。

  4. 長期使用シナリオ(毎日数時間の作業)向けのUXの洗練。

  5. デフォルト設定での追加セキュリティチェック。

同じような状況にある方へ

もしあなたもmacOSの既成の解決策に満足していないなら、コードではなく、日々の痛みのチェックリストから始めることをお勧めします。
要件を正直に明確にすると、さらに探すべきか、自分で書くべきかがはっきりします。

私の場合は、後者でした。

リポジトリ