我有一个在Linux服务器上运行的Java应用程序,并执行一系列操作(创建目录,复制几个文件,检查应用程序是否正在运行等)。我正在使用log4j2记录消息,并且运行良好。
我需要读取一个帐户并将其模拟为该帐户(无密码sudo切换用户),然后执行上述一系列操作。已获得执行无密码sudo的权限。
我已经使用外壳(首先切换用户,然后执行Java程序)来完成此操作,但是我提出了这个问题以了解是否可以在Java程序中完成此操作?
Execution: java -jar xyz.jar parm1
为了进行评估,我更改了Java代码以运行如下所示的shell命令(我正在使用processbuilder):
当我运行Java程序时,日志仅显示到sudo shell命令执行时为止,并且在该步骤之后未显示任何日志。
有没有办法在切换用户(模拟)之前和之后保留所有日志? (我正在使用log4j2并写入对其他用户具有写访问权的日志文件。)
请分享是否有已知解决方案?
[EDIT]添加用于触发sudo的Java代码段
public boolean switchUser(String account) {
ShellCommand shellCommand = new ShellCommand();
List<String> cmd = new ArrayList<String>();
cmd.add("su");
//....I construct asu command for the passed account here. I have passwordless sudo su access and tested fine manually
//I've some logger messages here
shellCommand.runCommand(cmd); //Class with method that uses ProcessBuilder and executes shell command
}
[EDIT]我想当我从Java触发su时,它将在Java等待它完成时打开一个新的shell。这可能是之后没有可见日志的原因。因此,一种解决方案是将其包装在外壳中,使用命令执行su以运行jar。