walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

macOS から macOS の画面を Ubuntu のディスプレイに表示させる

経緯

ゼミやなんかをやるときに、HDMIMacBook Pro を大型ディスプレイに接続していると、

  • なかなか接続できない
  • ケーブル (との接点) を動かすと接続が切れる
  • 相性が悪いのか、そもそも接続できない

なんてことが多々起きて、フラストレーションが溜まっていました。

お金の力で解決してもいいのですが、たまたま、同一ディスプレイに Ubuntu の乗った PC が繋がっていたので、

MBP -> Ubuntu -> ディスプレイ

って感じで Remmina を使って VNC で接続して画面共有していました。

しかし、しかし、ネットワークの都合上、接続の度に MBP の IP アドレスが変わるため、

  1. Ubuntussh
  2. Remmina を起動して設定の IP アドレスを書き換える
  3. 接続

という面倒な手間を踏まなければならず、フラストレーションが解消されずにいたので、シェルスクリプトの力を借りて解決したという話です。

方法

大雑把に書くと、

  1. ユーザ名と IP アドレスを受け取って、設定ファイル (~/.remmina/*.remmina) を書き換えて起動するスクリプト (start.sh) を Ubuntu に配置
  2. 自 PC のユーザ名と IP アドレスを ssh 経由で Ubuntu に投げるスクリプト (connect.sh) を MBP に配置
  3. 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 なので遅延がそこそこあり、動画なんかはカクカクしてしまうため、スライドや論文をみんなで見るくらいしかできなさそうです。

何か他に、お金も対してかからず、最高な解決策が欲しいところです。