macOS から macOS の画面を Ubuntu のディスプレイに表示させる
経緯
ゼミやなんかをやるときに、HDMI で MacBook Pro を大型ディスプレイに接続していると、
- なかなか接続できない
- ケーブル (との接点) を動かすと接続が切れる
- 相性が悪いのか、そもそも接続できない
なんてことが多々起きて、フラストレーションが溜まっていました。
お金の力で解決してもいいのですが、たまたま、同一ディスプレイに Ubuntu の乗った PC が繋がっていたので、
MBP -> Ubuntu -> ディスプレイ
って感じで Remmina を使って VNC で接続して画面共有していました。
しかし、しかし、ネットワークの都合上、接続の度に MBP の IP アドレスが変わるため、
という面倒な手間を踏まなければならず、フラストレーションが解消されずにいたので、シェルスクリプトの力を借りて解決したという話です。
方法
大雑把に書くと、
- ユーザ名と IP アドレスを受け取って、設定ファイル (~/.remmina/*.remmina) を書き換えて起動するスクリプト (start.sh) を Ubuntu に配置
- 自 PC のユーザ名と IP アドレスを ssh 経由で Ubuntu に投げるスクリプト (connect.sh) を MBP に配置
- connect.sh を実行
で、ターミナルで一発で画面共有できます。ただし、前準備として
- Ubuntu 側で *.remmina を作成
- MBP 側で画面共有を ON に
しておく必要があります。また、頻繁に ssh するので、公開鍵も登録しておく方がいいでしょう。
スクリプト
上記の方法を踏まえて、作成したシェルスクリプトと解説をしたいと思います。
start.sh
if [ "$#" -ne "2" ]; then echo 'usage: server user_name ip_address' >&2 exit 1 fi user_name=$1 ip_address=$2 cd ~/.remmina file_name=`ls | xargs grep "username=$user_name" | cut -d':' -f1` sed -i -e "s/^server=.*/server=$ip_address/g" ./$file_name export DISPLAY=:0 /usr/bin/remmina -c ./$file_name
10,11 行目は、ls と grep を使って username=$user_name
の行が含まれる設定ファイルを取得します。そのファイルに対して、server=$ip_address
に書き換えています。
export DISPLAY=:0
は、ssh 経由で remmina を使うときに怒られるエラーへの対処で、その次の行で、設定ファイルを指定して remmina を起動しています。
connect.sh
trap "ssh ubuntu pkill remmina" 2 15 user_name=`whoami` ip_address=`ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'` ssh ubuntu "bash ~/.remmina/start.sh $user_name $ip_address"
まず、trap の必要性についてですが、connect.sh
を実行し、それを control + c
で停止すると、MBP 上のスクリプトは止まりますが、remmina は起動したままで VNC 接続は切れません。そこで、^C
が実行されたら、Ubuntu 側の remmina を停止するようにしています。
ip_address の取得は、ここ を参考にさせてもらいました。
あとは、ssh で start.sh を実行するように投げるだけです。
まとめ
これで、MBP のディスプレイ接続がまともなものになるまでは、快適に大画面でなんやかんやできるようになったはずです。
ただし、VNC なので遅延がそこそこあり、動画なんかはカクカクしてしまうため、スライドや論文をみんなで見るくらいしかできなさそうです。
何か他に、お金も対してかからず、最高な解決策が欲しいところです。