java.net.SocketException : Разрешение запрещено, Подключиться Сообщение об ошибке в файле war, развернутом в tomcat на том же компьютере.
Следующий код выполняется, когда я запускаю его на своем компьютере, а также на компьютере развертывания, когда Я вхожу в него и запускаю класс с помощью java RunClass, но не тогда, когда классы упакованы в файл war и развернуты в tomcat. Я получаю это сообщение либо в коде session.connect(), либо в коде ChannelExec.connect().
java.net.SocketException : Разрешение отклонено, подключение не выполнено.
Почему происходит такое поведение?
Раньше, когда я использовал класс ProcessBuilder Я также смог выполнять команды на машине, но не с помощью войны, развернутой на tomcat. Мне пришлось столкнуться с Отказано в доступе, невозможно выполнить команду chmod (или команду conda).
Controller.java
Код: Выделить всё
@RequestMapping(value="/endpoint", method=RequestMethod.GET)
public Response generateOrderTrail2(@RequestParam("id) String id){
ScriptCaller scriptCaller = new ScriptCaller();
scriptCaller.setId(id);
scriptCaller.executeCommand();
if(scriptCaller.isSuccessful()){
return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body("Successful");
}
else{
return ResponseEntity.badRequest().contentType(MediaType.APPLICATION_JSON).body("Unsuccessful");
}
}
Код: Выделить всё
boolean isSuccessful = false;
public void executeCommand(){
String command = './dir/folder/executeFile.sh';
try{
JSch jsch = new JSch();
Session session = jsch.getSession(this.username, this.hostname, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.setPassword(this.password);
session.connect();
StringBuilder output = new StringBuilder("");
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setInputStream((InputStream)null);
InputStreamReader stream = new InputStreamReader(channelExec.getInputStream());
channelExec.setInputStream((InputStream) null);
channelExec.setCommand(command);
channelExec.connect();
char[] buffer = new char[128];
int read;
while ((read=stream.read(buffer 0, buffer.length))>=0){
output.append(buffer, 0, read);
}
this.callerResponse = outputString.toString();
int exitCode = channelExec.getExitStatus();
channelExec.disconnect();
session.disconnect();
if(exitCode == 0){
System.out.println("Shell Script Executed Successfully");
isSuccessful = true;
}
else{
System.out.println("Shell Script Failed to Execute");
isSuccessful = false;
}
}
catch(Exception e){
e.printStackTrace();
isSuccessful = false;
}
Код: Выделить всё
mvn clean deploy -Denvironment=local -Dskip.webapp=true -Dmaven.test.skip=true
Код: Выделить всё
java.net.SocketException: Permission Denied(connect failed)
..
..
..
..
at com.jcraft.jsch.Util.createSocket(Util.java)
Я проверил, нет ли у пользователя без полномочий root прав или у файла нет разрешений на выполнение,
Файл оболочки имеет rwx для всех пользователей (разрешения 777).
Один и тот же файл исполняется одним и тем же пользователем при локальном тестировании или когда код запускается внутри одного Java файл, если я войду в систему и запущу на компьютере.
Это просто отказ в разрешениях, когда я вызываю конечную точку после развертывания файла войны на сервере Tomcat
Подробнее здесь: https://stackoverflow.com/questions/787 ... he-war-fil