imgssh - SSH内でローカルのクリップボード画像を貼り付ける
(github.com/coderredlab)こんにちは。
最近、リモートサーバーにSSHで接続してClaude CodeやCodexのようなターミナルツールを使うことが増えたのですが、画像を渡す手順が思ったより面倒でした。
ローカルではすでにスクリーンショットがクリップボードにあるのに、リモートサーバー側からはそれを知る手段がないため、毎回ファイルとして保存してscpで送り、パスをまた貼り付け直す必要がありました。
それが面倒だったので、imgsshを作ってみました。
GitHub:
https://github.com/coderredlab/imgssh
使い方は、通常のsshの代わりにimgsshで接続する形です。
imgssh user@host
その状態でローカルのクリップボードに画像があるときにCtrl+]を押すと、画像をリモートの/tmpにアップロードし、現在のSSHセッションにファイルパスを入力してくれます。
たとえば、こんな感じです。
'/tmp/imgssh-20260425-142744-a8f39c.png'
Claude CodeやCodexのようなCLIに画像ファイルのパスを渡すために作った機能です。
最初はターミナルごとのプラグイン方式も考えましたが、Ghosttyのようにプラグインシステムがないターミナルもありますし、ターミナルごとに個別対応するのもいまひとつだったので、ssh自体をラップする方向にしました。
重要視した方針はこれです。
- グローバルなキーボードフックなし
- バックグラウンドデーモンなし
- リバーストンネルなし
- リモートサーバーにインストール不要
- imgsshで開いたSSHセッション内でのみ動作
そのため、タブを複数開いても各imgsshプロセスが自分のセッションだけを処理します。たとえば、あるタブでimgssh dev、別のタブでimgssh prodに入っている場合、それぞれのタブで押したトリガーは対応するサーバーにだけアップロードされます。
その代わり、ネストしたSSHは追跡しません。imgssh devで接続したあと、その中でさらにssh prodを実行しても、画像は引き続きdev側にアップロードされます。これは意図的に範囲を絞っています。
現在は初期バージョンなので、対象範囲はシンプルです。
- Linuxでテスト
- OpenSSHを使用
- PNGのクリップボード画像
- デフォルトで
/tmpへアップロード - クォート付きパスを挿入
- アップロードには別のsshプロセスとOpenSSH ControlPathを使用
macOSについては、コード上ではpngpasteバックエンドを入れてありますが、まだ実機ではテストできていません。
似た問題を解くツールとしてclipsshやPasteHopもありますが、imgsshはone-shotアップローダーやターミナル統合ツールというより、「ssh wrapper」に近いです。
まだ磨くべき部分は多いです。特にSSH引数の処理、ターミナルごとのトリガーキー、tmux/nvimのような環境でのUXは、さらにテストが必要です。
試してみて、変わったケースやもっと良いやり方があれば意見をいただけると嬉しいです。
まだコメントはありません。