Scripting 如何将linux shell脚本编译为独立的可执行文件*二进制文件*(即,不仅仅是chmod 755)?

Scripting 如何将linux shell脚本编译为独立的可执行文件*二进制文件*(即,不仅仅是chmod 755)?,scripting,binary,compilation,executable,obfuscation,Scripting,Binary,Compilation,Executable,Obfuscation,我正在寻找一个免费的开源工具集,它将编译各种“经典”脚本语言,例如Korn Shell、ksh、csh、bash等,作为一个可执行文件——如果脚本调用其他程序或可执行文件,它们将包含在单个可执行文件中 原因: 混淆交付给客户的代码,以免泄露我们的知识产权-交付到客户自己的机器/系统上,我无法控制我可以设置哪些访问权限,因此,程序文件必须是二进制文件,通过在文本编辑器或hextumpviewer中查看,无法轻松查看工作 为客户制定一个简单部署的程序,无需/或最少的外部依赖关系 我更喜欢不需要pac

我正在寻找一个免费的开源工具集,它将编译各种“经典”脚本语言,例如Korn Shell、ksh、csh、bash等,作为一个可执行文件——如果脚本调用其他程序或可执行文件,它们将包含在单个可执行文件中

原因:

  • 混淆交付给客户的代码,以免泄露我们的知识产权-交付到客户自己的机器/系统上,我无法控制我可以设置哪些访问权限,因此,程序文件必须是二进制文件,通过在文本编辑器或
    hextump
    viewer中查看,无法轻松查看工作

  • 为客户制定一个简单部署的程序,无需/或最少的外部依赖关系


  • 我更喜欢不需要package manager的简单功能,因为:

  • 我不能依靠客户的知识来执行(un)包装说明和

  • 关于安装软件包,我不能依赖管理他们机器的政策(事实上是来自第三方的)


  • 最简单的首选方法是能够将一个可执行文件编译成正确的机器代码,该文件将在没有任何依赖项的情况下开箱即用。

    您可以使用这些代码混淆shell脚本。不过,对于unix,您不容易将其他程序捆绑到单个可执行文件中。通常情况下,安装方法是为平台的包管理器(例如)构建一个包,或者提供一个tarball,以便在适当的目录中展开

    如果您需要一个解压内容的可执行文件,您可以使用shell存档。看一下你的文档,看看是否能得到你想要的

    如果您真的需要脚本功能来将多个C程序粘合在一起,请看一下Tcl语言。它有一个API,用于简单地包装希望看到
    argv[]
    样式参数的C程序。您甚至可以将C代码块嵌入到定制的Tcl解释器中,并将其与各种Tcl脚本粘合在一起

    如果您真的需要使其不透明,您可以加密tcl脚本,并将整个过程封装在某种东西中,将tcl脚本解压到缓冲区,然后在其上运行tcl解释器。Tcl可以接受来自文件或
    char*
    缓冲区的脚本,因此未加密的脚本不必访问文件系统。

    您可以使用以下方法:

    这将生成一个shell脚本,该脚本自动将绑定的tar.gz归档文件提取到临时目录中,然后在提取时可以运行任意命令

    使用此工具,您只能向客户端提供一个shell脚本


    然后,该脚本将把您的ofbsh模糊脚本和二进制文件提取到/tmp中,并透明地运行它们。

    完全满足我需求的解决方案是SHC—一个免费工具,或者CCsh—一个商业工具。两者都将shell脚本编译为C,然后可以使用C编译器编译

    有关SHC的链接:

    有关CCsh的链接:

    是一个很好的绑定器,您可以在其工作流程中集成模糊器。

    我修改了原始版本并升级到新版本,添加了一些功能和错误修复。 是的

    用法示例:

    shc -f script.sh -o binary_name
    
    script.sh将被编译成名为binary\u name的二进制文件


    请注意,您仍然需要在系统中安装所需的shell才能运行此可执行文件。

    您可以使用的选项:

    • 在代码中编写一个逻辑,当代码第一次在一个框上运行时,它将检查是否存在所有必需的包。如果他们不这样做,代码将自动获取软件包并安装它们…而不要求用户做任何事情。用户需要询问的唯一问题是“是否可以继续安装上述软件包?(Y/N)”。除此之外的任何东西都太多了

    • 一旦上述代码完成(是的,我知道您编写此代码可能不是那么简单,或者可能是,我不知道您的编码能力),将完成的代码复制并粘贴到一个站点,如,并将为您生成一个实际的可执行文件

    这一特殊选择有很多好处:

    • 是的,您将能够在不公开任何专有信息的情况下运行脚本的加密版本
    • 没有人可以尝试“查看”你的脚本,因为如果他们这样做,他们只会看到无法辨认、加密的行话,这些行话对他们来说毫无意义
    • 没有人可以尝试修改您的脚本,因为如果他们这样做,脚本将立即变得不可操作
    • 没有人可以在您的脚本上运行调试器来查看它是如何工作的。如果他们这样做,脚本将中止
    • 此外,没有人可以在同一台服务器上创建脚本的副本。如果他们这样做了,它将中止并且不起作用。它只允许用户创建指向脚本所在位置的符号链接
    我可能在你要求的东西中遗漏了一些东西,但我相信上面的内容很好地满足了你的要求


    不确定这是否适用于其他脚本,但适用于shell脚本。

    您也可以使用免费的在线版CCsh将shell脚本编译成二进制:

    我更喜欢不需要软件包管理器的简单方法,因为1)我不能依赖客户的知识来执行此类指示,2)我不能依赖管理其机器的有关安装软件包的政策(事实上是来自第三方)。最简单的首选方法是能够将一个可执行文件编译成适当的机器代码,该可执行文件将开箱即用,无需任何修改