【问题标题】:Java program (class > .jar) as a Unix shell (in place of sh/bash)?Java 程序(类 > .jar)作为 Unix shell(代替 sh/bash)?
【发布时间】:2025-11-27 07:00:02
【问题描述】:

我希望将 Java 程序(已编译的类 > .jar 文件)作为我的 Unix shell 运行。基本上,我不希望 sh 或 bash 参与其中,因为这样用户可以退出/暂停我的 Java 程序并访问 unix shell。

这可能吗?

我需要使用 jail/chroot 吗?

是否像编辑 /etc/shells 并将 java -jar ... 命令放在那里一样简单?

或者,如果我必须使用 sh/bash,我是否可以在我的 java/vm 过期或卸载时自动退出 shell(这样没有人可以将 Java 应用程序转义到 bash/sh shell 本身)?

【问题讨论】:

    标签: java bash shell unix exec


    【解决方案1】:

    第一步:创建一个封装shell脚本/usr/bin/myjavashell

    #!/bin/sh
    exec /usr/bin/java -jar /usr/local/whatever/file.jar
    

    第二步:使其可执行:chmod +x /usr/bin/myjavashell

    第三步:将/usr/bin/myjavashell 添加到/etc/shells

    第四步:使用chsh -s /usr/bin/myjavashell youruser 将此设置为用户的登录shell。

    可选步骤五:在/etc/ssh/sshd_config 中,禁用您不希望用户能够执行且不需要外壳的任何其他选项,例如 tcp 转发:

    Match User youruser
    AllowTcpForwarding False
    

    【讨论】:

    • 感谢“那个人”——这是 DwB 所说的(更全面的描述)。幸运的是,我已经使用 Unix 工作了大约 20 年,所以在 DwB 提到 exec 之后(直到现在还没有遇到过这个问题!)我可以弄清楚其余的。不过,对于其他人,为了再次保证,感谢您的详细步骤,我想这就是我打算做的事情。我仍将探索 PTY 模型,作为另一种不错的替代方案(也许以备将来使用)。
    【解决方案2】:

    我想出的一个潜在解决方案是让我的 Java 应用产生一个 PTY 并输出到 PTY。然后重定向控制台(vga/serial/vnc/etc)以使用我的自定义 PTY。这样,接口只是我的 Java 应用程序的 I/O,并且不涉及任何 bash/shell。我认为它可以工作。当然需要研究如何生成 PTY 并对其进行写入/读取,但我确信这是可行的..

    还有什么想法吗??谢谢!

    【讨论】: