今までsshしたリモートサーバ上でコマンド実行したときの結果出力とかは、 tmuxのコピーモードとかを駆使して、Macのクリップボードに送ってたんですが もっと手軽に出来る方法があったのでGitHubにまとめてみた。
仕組みの説明
- Mac上で、受け取った内容をクリップボード(pbcopy)に渡す
LaunchAgentを作って起動 - リモートサーバ上の出力を受け取るスクリプト
rpbcopy(nc)に渡す - sshの
RemoteForwardを利用して、リモートサーバでrpcopy(nc)に渡された内容をMac上のLaunchAgentに渡す - Mac上の
LaunchAgentが受け取ったデータをMacのpbcopy(クリップボード)に入れる pbpasteなどで貼り付けが出来る
図にすると下記のような感じ
1 2 3 4 5 6 7 8 | |
導入方法
動作検証環境
- リモートサーバ CentOS 6.4、Fedora 19
- ローカルMac OS X 10.9.1
glidenote/rpbcopyに各種ファイルをまとめているので、 cloneしてくるのが早いです。
1
| |
Mac側の設定
LaunchAgentを起動
2224ポートで待ち受けて、受け取った内容をクリップボードに渡すLaunchAgentを用意。
同梱のpbcopy.plistを~/Library/LaunchAgents/pbcopy.plistに設置して、下記で起動
1
| |
停止する場合は下記
1
| |
~/.ssh/configの設定
リモートサーバの2224ポートをフォワーディングするので、
~/.ssh/configに
1
| |
を追加。
~/.CFUserTextEncodingの設定
必ず必要な作業ではありませんが、UTF-8の内容を送ると文字化けが発生する場合、転送が上手くされない場合は
同梱の.CFUserTextEncodingを~/.CFUserTextEncodingに設置することで回避出来ると思います。
~/.CFUserTextEncodingを編集することで他に影響が及ぶ場合があるので、
必ずバックアップを取り、自己責任で編集お願いします。
リモートサーバ(CentOS)側の設定
ncの導入
nc(netcat)が無いと使えないのでncを導入。(ncのバージョンが古いと-Cオプションが存在しない場合があります。)
1
| |
rpbcopyスクリプトの設置
同梱のrpbcopyを~/bin/rpbcopyなどPATHが通っている場所に設置して権限を付与
1
| |
使い方
リモートサーバにsshログイン。 手元Macのクリップボードに送りたいファイルやコマンドの出力を、リモートサーバ上で
1 2 3 4 5 6 7 8 9 10 11 | |
という感じでrpbcopyに渡すと、手元のMacのクリップボードに渡されるので
Mac側でpbpasteや貼り付けが出来る。
補足
~/.bash_profileや~/.zsh_profileなどに
1
| |
とaliasを追加して、pbcopyでも使えるようにしておけば、
リモートサーバとローカルサーバを意識せずに利用出来る。
トラブルシューティング
導入の際にハマったところをまとめておく。
Mac側
launchctl load/unloadを実行するとCould not open job overrides database at: /private/var/db/launchd.db/com.apple.launchd/overrides.plist: 13: Permission deniedと出る。
tmuxを起動している状態でlaunchctl load/unloadを実行するとPermissionのエラーが出てしまうことがあるようです。ChrisJohnsen/tmux-MacOSX-pasteboardを利用することで回避出来る模様。
LaunchAgentは動作しているか、2224ポートは開いているか確認
1
| |
LaunchAgent => pbcopy とデータが渡っているか。
Macのncの場合オプションは-cなので注意
1 2 | |
LaunchAgent => pbcopy と日本語のデータが渡っているか。
Macのncの場合オプションは-cなので注意.
1 2 | |
駄目な場合は、~/.CFUserTextEncodingを同梱のものに入れ替えるてどうか確認。
CentOS側
ncが入っているか
1
| |
2224ポートと疎通が出来ているか。SSH RemoteForwardが出来ているか
1
| |
SSH RemoteForward経由でMacのpbpasteにデータを渡せているか
1
| |
mac側でpbpasteを実行してみてどうか。
普段私が常用しているmoshだとこれが利用出来ないので、いい方法がないか思案中。
とりあえず、ターミナル作業用のmosh接続とは別でrpbcopy専用のssh接続を作っておくことで利用してる。