Glide Note

glidenote's blog

ssh接続したリモートサーバの出力を手元Macのクリップボードに送る

今までsshしたリモートサーバ上でコマンド実行したときの結果出力とかは、 tmuxのコピーモードとかを駆使して、Macのクリップボードに送ってたんですが もっと手軽に出来る方法があったのでGitHubにまとめてみた。

仕組みの説明

  1. Mac上で、受け取った内容をクリップボード(pbcopy)に渡すLaunchAgentを作って起動
  2. リモートサーバ上の出力を受け取るスクリプトrpbcopy(nc)に渡す
  3. sshのRemoteForwardを利用して、リモートサーバでrpcopy(nc)に渡された内容をMac上のLaunchAgentに渡す
  4. Mac上のLaunchAgentが受け取ったデータをMacのpbcopy(クリップボード)に入れる
  5. pbpasteなどで貼り付けが出来る

図にすると下記のような感じ

1
2
3
4
5
6
7
8
+ - - - - - - - - -+                       +- - - - - - - - - - - - - - - - -+
' Remote Server:   '                       ' Mac:                            '
'                  '                       '                                 '
' +--------------+ '  ssh(RemoteForward)   ' +--------------+     +--------+ '
' | rpbcopy(nc)  | ' --------------------> ' | LaunchAgent  | --> | pbcopy | '
' +--------------+ '                       ' +--------------+     +--------+ '
'                  '                       '                                 '
+ - - - - - - - - -+                       +- - - - - - - - - - - - - - - - -+

導入方法

動作検証環境

  • リモートサーバ CentOS 6.4、Fedora 19
  • ローカルMac OS X 10.9.1

glidenote/rpbcopyに各種ファイルをまとめているので、 cloneしてくるのが早いです。

1
git clone https://github.com/glidenote/rpbcopy

Mac側の設定

LaunchAgentを起動

2224ポートで待ち受けて、受け取った内容をクリップボードに渡すLaunchAgentを用意。 同梱のpbcopy.plist~/Library/LaunchAgents/pbcopy.plistに設置して、下記で起動

1
launchctl load ~/Library/LaunchAgents/pbcopy.plist

停止する場合は下記

1
launchctl unload ~/Library/LaunchAgents/pbcopy.plist

~/.ssh/configの設定

リモートサーバの2224ポートをフォワーディングするので、 ~/.ssh/config

1
RemoteForward 2224 127.0.0.1:2224

を追加。

~/.CFUserTextEncodingの設定

必ず必要な作業ではありませんが、UTF-8の内容を送ると文字化けが発生する場合、転送が上手くされない場合は 同梱の.CFUserTextEncoding~/.CFUserTextEncodingに設置することで回避出来ると思います。

~/.CFUserTextEncodingを編集することで他に影響が及ぶ場合があるので、 必ずバックアップを取り、自己責任で編集お願いします。

リモートサーバ(CentOS)側の設定

ncの導入

nc(netcat)が無いと使えないのでncを導入。(ncのバージョンが古いと-Cオプションが存在しない場合があります。)

1
sudo yum -y install nc

rpbcopyスクリプトの設置

同梱のrpbcopy~/bin/rpbcopyなどPATHが通っている場所に設置して権限を付与

1
chmod a+x ~/bin/rpbcopy

使い方

リモートサーバにsshログイン。 手元Macのクリップボードに送りたいファイルやコマンドの出力を、リモートサーバ上で

1
2
3
4
5
6
7
8
9
10
11
# 転送が出来るかテスト
echo "hello" | rpbcopy

# 日本語が転送が出来るかテスト。駄目な場合はMac側の `~/.CFUserTextEncoding`を設定する必要あり
echo "こんにちは" | rpbcopy

# fileの中身を手元Macのクリップボードにコピー
cat fileneme | rpbcopy

# リモートサーバのhistoryの内容を手元Macのクリップボードにコピー
history | rpbcopy

という感じでrpbcopyに渡すと、手元のMacのクリップボードに渡されるので Mac側でpbpasteや貼り付けが出来る。

補足

~/.bash_profile~/.zsh_profileなどに

1
alias pbcopy='~/bin/rpbcopy'

と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
nc -vz 127.0.0.1 2224

LaunchAgent => pbcopy とデータが渡っているか。

Macのncの場合オプションは-cなので注意

1
2
echo "hello" | nc -c 127.0.0.1 2224
pbpaste

LaunchAgent => pbcopy と日本語のデータが渡っているか。

Macのncの場合オプションは-cなので注意.

1
2
echo "日本語のテスト" | nc -c 127.0.0.1 2224
pbpaste

駄目な場合は、~/.CFUserTextEncodingを同梱のものに入れ替えるてどうか確認。

CentOS側

ncが入っているか

1
type nc

2224ポートと疎通が出来ているか。SSH RemoteForwardが出来ているか

1
nc -vz 127.0.0.1 2224

SSH RemoteForward経由でMacのpbpasteにデータを渡せているか

1
echo "hello" | nc -c 127.0.0.1 2224

mac側でpbpasteを実行してみてどうか。


普段私が常用しているmoshだとこれが利用出来ないので、いい方法がないか思案中。
とりあえず、ターミナル作業用のmosh接続とは別でrpbcopy専用のssh接続を作っておくことで利用してる。

参考

Comments