使用 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
我自己还在玩弄它;我知道我即将完成这项工作。