【问题标题】:Executing a Java application with sockets & jdbc from PHP从 PHP 执行带有套接字和 jdbc 的 Java 应用程序
【发布时间】:2012-05-24 02:47:42
【问题描述】:

使用 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 驱动程序。

需要明确的是,当我以 root 身份登录时尝试运行 sudo bash myScript 时,我得到了 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

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

【问题讨论】:

  • 您的脚本是否设置了类路径来告诉 Java 应用程序数据库驱动程序在哪里?
  • @EugenRieck:这很有帮助。使用sudo -E bash myScript 直接运行脚本效果很好,但是从PHP 脚本中有些东西失败了。 @Mano:我已经尝试了所有我能想到的用于指定类路径的变体。
  • 更具体地说,exec 或 passthru(我都尝试过)没有启动脚本。似乎什么都没有发生。 PHP 是: 有什么想法吗?

标签: java mysql sockets jdbc sudo


【解决方案1】:

经过我了解的 cmets 讨论后,sudo -E 有效(对于您的用户名) - 这似乎是对正在发生的事情的赠品:

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

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

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

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

【讨论】:

  • 这很有帮助,尽管我仍然没有启动 Java 应用程序。请参阅我对问题的更新。
  • 我们需要更深入地挖掘 - 作为初学者尝试这个:在您的正常环境中(应用程序工作)set > /path/to/starterscript.sh && echo "cd /path/to/app" >> /path/to/starterscript.sh && echo "java myApp" >> /path/to/starterscript.sh。然后sudo -u wwwrun /bin/bash(或任何apache用户),最后sudo /path/to/starterscript.sh,看看应用程序是否出现。
  • 如何找到 apache 用户是什么?
  • 对不起,不是 Redhat 的人:运行快速而肮脏的 ps auxwww | grep apache 并查找用户名。
  • Apache 用户名似乎是:apache。当我尝试这个时,我在脚本文件中得到了很多新的东西。我按照接下来的步骤进行操作,并提示输入我试图避免的 root 密码。 /etc/sudoers 有这一行:www ALL=(ALL) NOPASSWD: /bin/bash path/to/script/script.sh 那么为什么提示输入密码?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 1970-01-01
  • 2010-12-19
  • 2013-08-14
  • 1970-01-01
相关资源
最近更新 更多