「ssh先のUbuntuのtmuxでコピーしたテキストをローカルのMacOSのクリップボードに転送する」の版間の差分
| 行23: | 行23: | ||
</pre> | </pre> | ||
| − | === | + | === ユーザーログイン後に自動でClipperが動くようにする === |
| − | + | Clipperはネットワークポートに送られてくる情報を受け取ってクリップボードに転送してくれるデーモンプロセス的なものらしい。 | |
| + | |||
| + | 起動するには、多分、ログイン後に毎回手動でターミナルに "clipper" とか打てば済むのだとは思うが、めんどいのでログインしたら自動で起動するようにする。 | ||
| + | |||
| + | お好みのコマンドを自動実行するためには、launchctlを使う。plistというフォーマットの設定ファイルを書き、それを~/Library/LaunchAgents/に格納して、launchctlにロードさせれば、plistで設定した通りコマンドが実行されるようになる。らしい。 | ||
| + | |||
| + | plistとか何をどう書けばいいのかわかんないので、とりあえずClipperのGithubリポジトリから取ってきて使うことにする。 | ||
| + | <pre> | ||
| + | # 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/ | ||
| + | </pre> | ||
| + | |||
| + | で、[https://github.com/wincent/clipper Clipper] のREADMEに書いてある方法でロードする。 | ||
| + | <pre> | ||
| + | (MacOS)> launchctl load -w -S Aqua ~/Library/LaunchAgents/com.wincent.clipper.plist | ||
| + | </pre> | ||
| + | |||
| + | -wとか-S Aquaとかman読んでも全く意味がわからないが気にしないことにする。 | ||
| + | |||
| + | launchctl list でlaunchctlで管理されているプログラムの一覧が見れるらしいので、確認してみる。 | ||
| + | <pre> | ||
| + | (MacOS)> launchctl list | grep clipper | ||
| + | 69505 0 com.wincent.clipper | ||
| + | </pre> | ||
| + | |||
| + | PID(1列目の数字)が割り当てられているので、loadしただけで起動している様である。 | ||
| + | |||
| + | === sshリモートフォワードの設定 === | ||
| + | sshリモートフォワードを使って、リモート(Ubuntu)の特定のポートに飛んできた情報を、ローカル(MacOS)の特定のポートに転送することが可能である(トンネルを掘る、とか表現される)。この仕組みを使って、リモートのtmuxでコピーしたテキストをリモートのポート8377番に飛ばし、それをリモートフォワードでローカルのポート8377番(※Clipperがlistenするポート)に転送して、Clipperにテキストを流し込み、Clipperがそれをクリップボードに貼り付ける、みたいな流れを作れる。 | ||
| + | |||
| + | ==== sshのコンフィグ書く ==== | ||
| + | 簡単のため、まずは~/.ssh/config に以下の様に設定を書く。DL-Boxはリモート(Ubuntu)のホスト名。 | ||
| + | <pre> | ||
| + | # 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 | ||
| + | </pre> | ||
| + | |||
| + | ==== トンネル掘る ==== | ||
| + | 上記コンフィグを設定した後なら、 | ||
| + | <pre> | ||
| + | (MacOS)> ssh -fN DL-Box-Clipper-tunnel | ||
| + | </pre> | ||
| + | |||
| + | と叩けばトンネルは開通する(-fはバックグラウンド実行の指定、-Nはsshログイン後に何もコマンドを実行しないことを指定)。これもplist書いてlaunchdにやらせるようにしたいが、とりあえず先へ進む。 | ||
| + | |||
| + | |||
| + | == Clipperの動作確認 == | ||
| + | tmux云々の前に、適当な文字列がリモートからローカルのClipboardへ送れるかをチェックする。ncコマンド(netcat)を使う。ncコマンドは標準入力を特定のホストの特定のポートへ転送するためのコマンドである。 | ||
| + | |||
| + | <pre> | ||
| + | (Ubuntu)> echo 'hoge' | nc localhost 8377 | ||
| + | </pre> | ||
| + | |||
| + | 上記で、hogeという文字列を、リモート(リモートマシンから見ればローカルなのでlocalhostと書いている)のポート8377番へ送り込んでいる。DL-Box:8377→MacOS:8377へのトンネルは開通済みで、かつClipperも起動しているので、上記によりローカルのMacOSのクリップボードに'hoge'という文字列が貼り付けられているはずである。 | ||
| + | |||
| + | 実際 Command + v で貼り付けてみた結果、'hoge'という文字列が貼り付けられた。つまり成功。 | ||
| + | |||
| + | |||
| + | == リモート(Ubuntu)のtmuxの設定 == | ||
| + | tmuxの設定ファイルは ~/.tmux.conf である。ここに表題のことをするための設定を記載する。 | ||
| + | |||
| + | 設定はお好みなのでいろんな書き方があると思うが、私は以下のようにした。 | ||
| + | |||
| + | <pre> | ||
| + | </pre> | ||
2019年8月26日 (月) 08:12時点における版
目次
この記事について
表題の通りのことをやってみる。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 である。ここに表題のことをするための設定を記載する。
設定はお好みなのでいろんな書き方があると思うが、私は以下のようにした。