Armadilloフォーラム

特定のbusyboxファンクションの直接実行を禁止してbusybox引数形式のみに限定する方法

yanagihara

2014年5月12日 13時48分

こんにちは、柳原です。

Armadillo-440にはbusybox v1.00の設定方法に関する質問です。

busyboxのファンクション(cat等)の実行方法は、
# busybox cat foo.txt ----(a)
# cat foo.txt ----(b)
の様に、(a)busyboxの引数としてファンクションを与える方法と、
(b)ファンクションを単独のコマンドであるかのように実行する方法が
あります。

これに対し、ファンクション(例としてcat)の実行方法として、
(a)では従来通りbusybox版catを実行するが、
(b)ではbusyboxとは別のcatを実行する
ようにしたいのですが、そのように動作させる設定を、どなたかご存知
ないでしょうか?

なお、安易にbusyboxへのシンボリックリンクであるcatを削除しても
ファイルシステムにcatというファイルが存在しないにも関わらず(b)の
方法でbusybox版catが実行されてしまいます。

そして、シンボリックリンクを消すだけでなくPATHの通ったディレクトリに
busyboxではないcatを置いたとしても、相変わらずbusybox版cat
が実行されてしまいます。

catをファイルシステムから抹殺した状態で
# type cat ----(i)
# which cat ----(ii)
(i)は正常を返し、(ii)は異常を返すことから、PATHを検索する事なく
ashがファンクションを実行してしまうということなんだろうと考えています。

これに対し、PATHに無いファンクションは(a)の形式でないと実行できない
ようにしたいのです。

一応、フルパスで
# /bin/cat foo.txt ----(c)
とすればbusybox版ではないcatを実行できるのですが、ファイルシステムに
/bin/catしか無い場合は、(b)と(c)は同義と理解されるのが普通なので、
なんとか(c)で(b)と同じ挙動にしたいのです。

コメント

busybox には、applet first という機能があります。busyboxが持っているファ
ンクション (busybox 用語では applet と言います)があれば、
PATH に関係なく applet の方を実行するというものです。

この機能は、設定で無効にできますので、コンフィグしてみてください。

if [ "$CONFIG_USER_BUSYBOX_SH_STANDALONE_SHELL" = "y" ]; then
bool 'sh: applets first' CONFIG_USER_BUSYBOX_SH_APPLETS_ALWAYS_WIN
fi

先程のat_yashiのコメントへの補足です。

CONFIG_USER_BUSYBOX_SH_APPLETS_ALWAYS_WIN は特に何もしないコンフィグになっているので
CONFIG_USER_BUSYBOX_SH_STANDALONE_SHELL をnot setしてください。

アドバイス有難うございました。

busyboxのビルド設定「sh: stand alone」のチェックを外す事により
CONFIG_USER_BUSYBOX_SH_APPLETS_ALWAYS_WINが#undefされて(a)の形式に制限
できる事を確認しました。