rcmdnk's blog

Hostname

ノートパソコンを持ち歩いていろいろなところのWi-Fiで作業することが多いですが ネットワークによってはDHCPでホスト名も配っているところがあります。

そんなところに繋いだり他で作業したりしてる間にちょっと問題が起こりました。

Macのローカルホスト名

Macでの話ですが、システム環境設定の共有からコンピューター名を決めることが出来、 通常この値にMyMacとか入れておくと、

$ hostname
MyMac.local

といった.localを付けたホスト名として認識されます。

これ以外に、Mac特有のツールで

$ scutil --get ComputerName
MyMac
$ scutil --get LocalHostName
MyMac
$ HostName
MyMac.local

と、scutilを使っても確かめることが出来ます。

ホスト名が変わる

これがDHCPサーバー側からホスト名が配られる様な設定になっていると、 hostnameの結果がその指定してきたものに変わってきます。

$ hostname
example.host

一方scutilの結果は

$ scutil --get ComputerName
MyMac
$ scutil --get LocalHostName
MyMac
$ scutil --get HostName
HostName: not set

といった具合に、ComputerNameLocalHostNameは相変わらず同じ名前を出す一方、 HostNamenot setになっています。

起こった問題

今回起こったのはGNU screenのソケットディレクトリの設定に関してです。

通常、/tmp/uscreens/S-userの様なところに設定してありますが、 SCREENDIRという環境変数で変更することが出来、これを

SCREENDIR=$HOME/.screen_$(hostname|cut -d. -f1

みたいな値に設定していました。

これは/tmpに置くのが嫌なのと、分散サーバーみたいなところでHOMEを共有している場所で、 他の端末でscreenを立ち上げてる時にさっとls ~/.screen_*みたいにすると どこで立ち上がってるか簡単に確認出来る様にするためです。

Macではホスト名を付ける必要は特にないのですが、 dotfiles で共通のものを使ってるので持ち運び端末でも同じ様にホスト名のついたソケットディレクトリを使っていました。

ここで、ある環境でhostnameMymac.localの所でターミナルを立ち上げ、 その後、DHCPでホスト名(example.host)が配られる環境に接続後、立ち上げ済のターミナルからGNU screenを立ち上げると

$ screen -ls
No Sockets found in /Users/user/.screen_example

といった感じで中からscreenの情報が取れません。

これは、GNU screenを立ち上げるターミナルではSCREENDIRがターミナル立ち上げ立ち上げ時に設定された ~/.screen_MyMacであるのに対し、 立ち上げ後にscreen内で起動するBashはSCREENDIR~/.screen_exampleと設定してしまうからです。

これに対処するためにMacにおいてはscutilを使うように変更しました。

.bashrc
1
2
3
4
5
6
7
8
9
if [[ "$OSTYPE" =~ darwin ]];then
  export SCREENDIR=$HOME/.screen_$(scutil --get ComputerName)
else
  export SCREENDIR=$HOME/.screen_$(hostname|cut -d. -f1)
fi
if [ ! -d "$SCREENDIR" ];then
  mkdir -p "$SCREENDIR"
fi
chmod 700 "$SCREENDIR"

WindowsのノートPCに関してはどうするか、ちょっとまだ考え中です。 cygwinならまだ条件分岐出来ますが、 最近使えるようになったUbuntu on Windowsとか そもそも区別し辛いものだと辛い。

今のところこれ以外にホスト名に頼って直接何かするような設定はなさそうなんですが、 結構こういうことは起こりそうなので気をつけて見ていかないと、と。

Sponsored Links
Sponsored Links

« ターミナルで超高速にディレクトリを戻る/進む shell-subcommand: Gitライクなサブコマンドをシェルスクリプトで作る »

}