0

使用 sudo 启动 Java 应用程序时,我无法使其正常运行。我的应用程序使用套接字进行客户端连接并建立数据库连接。如果我正常启动应用程序:

java myApp

一切都很完美。但是,我试图让它能够从网站在后台启动。所以我创建了一个 PHP 来使用 exec() 或 passthru() 来启动它。起初,这似乎可行,但我很快发现套接字实际上并没有连接。进一步的试验和错误使我得出结论,这是因为当我这样做时java myApp,我以 root 身份登录,但 PHP 没有以 root 身份执行,因此存在安全问题。

所以我写了一个脚本,设置SUDOERS允许脚本在没有密码的情况下运行。该脚本只有一行,java myApp. 如果我运行脚本:

bash myScript

套接字将无法连接。(也就是说小程序客户端在尝试连接时挂起。)如果我尝试:

sudo bash myScript

找不到 jdbc MySql 驱动程序。我尝试了各种方法来解决这个问题,包括弄乱类路径,包括在编译和/或运行时使用 -classpath 并将 jdbc jar 的副本放在不同的地方但没有运气。显然,sudo 环境与以 root 身份登录的环境有一些微妙的不同,这会导致 Java 无法找到 jdbc 驱动程序。

sudo bash myScript需要明确的是,当我以root 身份登录 时尝试运行时,我得到了 jdbc ClassPathNotFound(或没有合适的驱动程序错误,具体取决于我尝试连接的方式) 。bash myScript在以 root 身份登录的所有计数上都可以正常工作。当我尝试从 PHP 脚本运行时,我的客户端小程序无法连接,这可能是套接字或 jdbc。我没有使用任何类型的 IDE,只是使用文本编辑器进行编辑并使用 javac 进行编译。

任何建议,将不胜感激。

更新:

如果有帮助,服务器正在运行 CentOS。我认为 -E 是环境问题(并且猜测环境损失是原因,但我发现的 sudo 文档并没有帮助我找出解决方案)。我已经尝试过passthru('sudo -i bash /path/to/myScript.sh');,但 java 应用程序仍然无法启动。通过 passthru,浏览器中没有显示任何内容。该脚本现在显示:

cd /path/to/app
java myApp

我自己还在玩弄它;我知道我即将完成这项工作。

4

1 回答 1

0

在通过我理解的评论进行讨论后,这sudo -E有效(适用于您的用户名) - 这似乎是对正在发生的事情的赠品:

您的交互式登录设置了许多环境变量,其中一些是执行 Java 应用程序所必需的。

通常,sudo在切换用户之前会“清理”您的环境 - 因此它将删除必要的环境变量,但sudo -E会保持环境完整,使其适合您。

现在网络服务器用户(例如 Ubuntu 中的 www-data)没有设置环境,导致sudo -E环境存在缺陷。

有几种方法可以解决这个问题,最简单的是使用sudo -i- 这将运行目标用户的 shell,就像在登录时一样。

于 2012-05-24T04:25:41.467 回答