【发布时间】: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