ssh先のUbuntuのtmuxでコピーしたテキストをローカルのMacOSのクリップボードに転送する

提供: Eospedia
2019年8月26日 (月) 08:14時点におけるKttn (トーク | 投稿記録)による版

移動: 案内検索

この記事について

表題の通りのことをやってみる。Clipperというプログラムを活用する。参考にしたのはClipperのREADMEと、こちらのページ → https://blog.freedom-man.com/tmux

2019年8月26日実施。


実行環境

リモート

  • Ubuntu 16.04.6 LTS
    • tmux 2.9a

ローカル

  • MacOS Mojave 10.14.6


ローカル(MacOS)側準備

Clipperのインストール

まずはMacOSにClipperをインストールする。Homebrew(パッケージマネージャ)を使う。

clipperのインストールはtmuxセッション内で実行してはいけないらしい。まるで理由がわからないが。

(MacOS)> brew install clipper

ユーザーログイン後に自動でClipperが動くようにする

Clipperはネットワークポートに送られてくる情報を受け取ってクリップボードに転送してくれるデーモンプロセス的なものらしい。

起動するには、多分、ログイン後に毎回手動でターミナルに "clipper" とか打てば済むのだとは思うが、めんどいのでログインしたら自動で起動するようにする。

お好みのコマンドを自動実行するためには、launchctlを使う。plistというフォーマットの設定ファイルを書き、それを~/Library/LaunchAgents/に格納して、launchctlにロードさせれば、plistで設定した通りコマンドが実行されるようになる。らしい。

plistとか何をどう書けばいいのかわかんないので、とりあえずClipperのGithubリポジトリから取ってきて使うことにする。

# Clipperリポジトリをダウンロード
(MacOS)> git clone https://github.com/wincent/clipper.git

# plistを~/Library/LaunchAgents/ にコピーする
(MacOS)> cp clipper/contrib/darwin/tcp-port/com.wincent.clipper.plist ~/Library/LaunchAgents/

で、Clipper のREADMEに書いてある方法でロードする。

(MacOS)> launchctl load -w -S Aqua ~/Library/LaunchAgents/com.wincent.clipper.plist

-wとか-S Aquaとかman読んでも全く意味がわからないが気にしないことにする。

launchctl list でlaunchctlで管理されているプログラムの一覧が見れるらしいので、確認してみる。

(MacOS)> launchctl list | grep clipper
69505	0	com.wincent.clipper

PID(1列目の数字)が割り当てられているので、loadしただけで起動している様である。

sshリモートフォワードの設定

sshリモートフォワードを使って、リモート(Ubuntu)の特定のポートに飛んできた情報を、ローカル(MacOS)の特定のポートに転送することが可能である(トンネルを掘る、とか表現される)。この仕組みを使って、リモートのtmuxでコピーしたテキストをリモートのポート8377番に飛ばし、それをリモートフォワードでローカルのポート8377番(※Clipperがlistenするポート)に転送して、Clipperにテキストを流し込み、Clipperがそれをクリップボードに貼り付ける、みたいな流れを作れる。

sshのコンフィグ書く

簡単のため、まずは~/.ssh/config に以下の様に設定を書く。DL-Boxはリモート(Ubuntu)のホスト名。

# DL-BoxにClipper用のsshトンネル掘るための設定
Host DL-Box-Clipper-tunnel
    # リモートのIPアドレス
    HostName <IPアドレス>
    # sshログインのユーザー名
    User <ユーザー名>
    # リモートのポート8377番(第一引数)をローカルのポート8377番にリモートフォワードする
    RemoteForward 8377 localhost:8377
    # RSA鍵交換でログイン
    IdentityFile ~/.ssh/id_rsa

トンネル掘る

上記コンフィグを設定した後なら、

(MacOS)> ssh -fN DL-Box-Clipper-tunnel

と叩けばトンネルは開通する(-fはバックグラウンド実行の指定、-Nはsshログイン後に何もコマンドを実行しないことを指定)。これもplist書いてlaunchdにやらせるようにしたいが、とりあえず先へ進む。

Clipperの動作確認

tmux云々の前に、適当な文字列がリモートからローカルのClipboardへ送れるかをチェックする。ncコマンド(netcat)を使う。ncコマンドは標準入力を特定のホストの特定のポートへ転送するためのコマンドである。

(Ubuntu)> echo 'hoge' | nc localhost 8377

上記で、hogeという文字列を、リモート(リモートマシンから見ればローカルなのでlocalhostと書いている)のポート8377番へ送り込んでいる。DL-Box:8377→MacOS:8377へのトンネルは開通済みで、かつClipperも起動しているので、上記によりローカルのMacOSのクリップボードに'hoge'という文字列が貼り付けられているはずである。

実際 Command + v で貼り付けてみた結果、'hoge'という文字列が貼り付けられた。つまり成功。


リモート(Ubuntu)のtmuxの設定

tmuxの設定ファイルは ~/.tmux.conf である。ここに表題のことをするための設定を記載する。

設定はお好みなのでいろんな書き方があると思うが、私は以下のようにした。