Windows/Interix - bashをコンパイル
Interix - wgetとbashをコンパイル

[ Linux / Unix リファレンスガイド ] ⇒ [ Interix SFU/SUA ] ⇒ [Windows/Interix - bashをコンパイル]


Interix - bashをコンパイル

SFUにはデフォルトで ksh と tcsh が用意されていますが、Linuxなどで広く使われている bash をSFUで使えるようにビルドしてみたいと思います。

BASHの脆弱性について追記 2014/11/15

なお、ShellShockと呼ばれるbashの重大な脆弱性ですが、Interix環境でも再現されますので、インストールする際は最新版の bash-4.2.53.tar.gz 以降が良いかと思われます。

ただ、SFU/SUAの /bin/sh の実態は ksh ですので、bash が system() などで呼び出されることはなく、個人用の閉じた環境での利用なら古いbashの脆弱性もそれほど心配しなくても良いでしょう。

bashの脆弱性に対する注意喚起 (JP-CERT)


◆WindowsXP のデータ実行防止(DEP)機能を無効にする

SFUにはgccのバージョン3.3が搭載されていますが、デフォルトではコンパイルで次のようなエラーがです。試しに次のコードをコンパイルします。

$ cat hw.c
#include <stdio.h>
main()
{
    printf("Hello Unix World!\n");
}

$ gcc hw.c
error: C compiler cannot create executables


このWinXPはVM上の閉じたマシンですので何も気にせずセキュリティー機能を変更します。Cドライブ直下の boot.ini を次のように常に
DEP OFF に変更します。[※セキュリティーに関する設定なので注意深く行って下さい]

せっかくSFU・Interixをインストールしたのですから、早速Unix環境からWindowsの設定ファイルを編集したいと思います。

# sed -i -e "s/OptIn/AlwaysOff/" /dev/fs/C/boot.ini

sedコマンドの結果、下記のように変更されます
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /NoExecute=OptIn /fastdetect

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /NoExecute=AlwaysOff /fastdetect

詳しくは@ITの記事で解説あります

WindowsXPを再起動し、再度コンパイルしてみます。

$ gcc hw.c

$ chmod 755 a.out

$ ./a.out
Hello Unix World!

コンパイルしたUnixの実行ファイル a.out (アセンブラアウトプット) が動作したので準備OK

◆bash をインストール
SFU標準搭載のkshはこれがkshの仕様でターミナル上でviライクなオペレーションを求められることがあり、bashに慣れてしまった私にはけっこう使いにくいです。ってことで、LinuxやMacOSXで使い慣れたbashをインストールしてみます。

GNUよりbash-4.2.tar.gzをダウンロードし解凍

$ cd bash-4.2

$ ./configure
checking build system type... i586-pc-interix3.5
checking host system type... i586-pc-interix3.5
Beginning configuration for bash-4.2-release for i586-pc-interix3.5
(以下省略)

bash4.2(2012年11月最新版)をダウンロード。Interix には timezone構造体が用意されていない(※)ため、コード内で struct timezone が宣言されている bash はコンパイルが通らないとの記事が@ITにあったが、最新版では解消されていた。timezone構造体自体、将来的に廃止されるのが決まっていたらしいので今後リリースされる新しいbashのコンパイルは問題ないと思われる。

$ make
問題なくコンパイルできた。

$ make install
          ***********************************************************           *                                                         
          * GNU bash, version 4.2.0(2)-release (i586-pc-interix3.5)
          *                                                                    ***********************************************************
(以下省略)

$ bash

bash-4.2$
⇒ 無事にbashが起動

bash-4.2$ bash --version

GNU bash, version 4.2.0(1)-release (i586-pc-interix3.5)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

いい具合にbashを使えるようになりました。隣のTeratermのLinuxも同じbash-4.2のため見分けがつかなくなったくらいです。

windows bash

WindowsXPにtelnetで接続し、bashを起動してみました。誰がなんと言おうとWindowsですし、誰がなんと言おうとUnixですよ。