代码之家  ›  专栏  ›  技术社区  ›  falstro

使用--init文件进行bash欺骗

  •  5
  • falstro  · 技术社区  · 16 年前

    我有一个bash脚本 /usr/bin/bosh )使用以下SHE BANG线:

    #!/bin/bash --init-file
    

    它定义了几个函数,通常将交互式shell放在一个用户可以控制我想要的一堆东西的环境中。这个很好用。现在,对于有趣的部分,我希望能够让用户在层与层之间使用它来编写新的脚本,而不需要显式地获取这个脚本的源代码。有可能吗?

    我试着写剧本 /usr/bin/foo )使用SHE BANG线

    #!/usr/bin/bosh
    

    我想,会重写它来执行命令

    /usr/bin/bosh /usr/bin/foo
    

    从而导致

    /bin/bash --init-file /usr/bin/bosh /usr/bin/foo
    

    但它不起作用, /UR/BI/FO 被执行,但是 /Ur/bin/波什 在此之前不是来源。

    即使脚本不是交互式的,我如何使它成为init文件的源代码?或者我必须为此编写一个包装脚本?我想有这样的剧本

    #!/bin/bash
    . /usr/bin/bosh
    . "$1"
    

    但如果我不指定一个要运行的脚本,这就不会变成一个交互式shell,这有点丢脸。

    编辑
    为了澄清,我真正要问的是,如何使bash源代码成为一个文件(比如--init文件),而不管它是交互的(在启动交互部分之前)还是不交互的(在执行脚本之前)?如果没有办法,有没有其他办法来解决我的问题?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Steve Baker    16 年前

    由指定的程序!恐怕至少在Linux内核2.6.27.9之前不能是另一个脚本,它允许这个特性。如果您在foo上运行strace,您将看到一个enoexec或exec格式错误,因为bosh不能作为独立程序执行。

    现在的情况是,登录shell不会执行/bin/bosh并将foo作为输入,而只是在子shell中静默地执行foo本身,这就是为什么它看起来几乎可以工作的原因。

    以您想要的方式启动bash的包装器或C程序可能是您唯一的选择。即使升级到您的内核,恐怕也不会像您希望的那样工作。

    你想知道的一切!在这里: http://www.in-ulm.de/~mascheck/various/shebang/

    编辑:如果您的内核确实支持链接脚本,那么 /usr/bin/bosh 可能是这样的:

    #!/bin/bash
    if [ ! $PS1 ]; then
       exec /bin/bash --init-file "$0" -i "$@"
    fi
    ... rest of bosh init file ...
    

    一个执行官似乎不可避免地要让它按你想要的方式工作。

        2
  •  0
  •   Adam Outler    16 年前

    脚本不是运行时环境。那可能是你的问题。shebang定义了运行时环境。即…/bin /java/bin /python /bin /bas/bin /dash。您的脚本不是环境。您的“包装示例”是合适的。

    推荐文章