web-dev-qa-db-ja.com

どうすればbusyboxashシェルを使用してargv [0]を変更したプログラムを実行できますか?

bashでは、単に_exec -a_を使用します。どうすればbusyboxでこれを行うことができますか?それも可能ですか、それともexec(3)を直接呼び出すために独自のCプログラムを作成する必要がありますか?

2
ali1234

あなたはbusyboxのどのバージョンを持っていますか? https://git.busybox.net/busybox/tree/Shell/ash.c によると、execを探し回ると、9352行目あたりで次のコードに遭遇する可能性があります。 exec [-a customname] ...をサポートしているようです

execcmd(int argc UNUSED_PARAM, char **argv)
{
    optionarg = NULL;
    while (nextopt("a:") != '\0')
        /* nextopt() sets optionarg to "-a ARGV0" */;

    argv = argptr;
    if (argv[0]) {
        char *prog;

        iflag = 0;              /* exit on error */
        mflag = 0;
        optschanged();
        /* We should set up signals for "exec CMD"
         * the same way as for "CMD" without "exec".
         * But optschanged->setinteractive->setsignal
         * still thought we are a root Shell. Therefore, for example,
         * SIGQUIT is still set to IGN. Fix it:
         */
        shlvl++;
        setsignal(SIGQUIT);
        /*setsignal(SIGTERM); - unnecessary because of iflag=0 */
        /*setsignal(SIGTSTP); - unnecessary because of mflag=0 */
        /*setsignal(SIGTTOU); - unnecessary because of mflag=0 */

        prog = argv[0];
        if (optionarg)
            argv[0] = optionarg;
        shellexec(prog, argv, pathval(), 0);
1
thrig

exec -aはBusybox1.27 以降サポートされています。他の方法でそれを実現する方法については、 ターゲットアプリケーションの0番目の引数を設定するPOSIXの方法はありますか? の回答も参照してください。

1
phk