응용 프로그램을 시작하는 작은 포장지를 작성하십시오. 가장 간단한 방법은 쉘 래퍼를 만드는 것입니다.
#!/bin/sh
java ...
하지만 서버 설치에서는 작동하지 않을 가능성이 있습니다. 아래를 참조하십시오.
변경 jar 파일을 읽을 수있는 권한이 사용자와 그룹에 래퍼의 소유자와 그룹 : 그래서 (
$ chown user:group wrapper
래퍼의 권한이 세계적으로 실행하게 변경하고, setuid
을 그것은 이전 단계에서 설정 한 래퍼의 소유자)로 실행됩니다 :
$ chmod a+rx,og-w,u+s wrapper
그런 다음 래퍼는 실행 파일 또는 지원 파일을 통해 누구 추가 권한을 부여하지 않고, 지정된 사용자로 실행됩니다.
이 아닌은 포장 자의 소유자가되도록하는 것이 좋습니다. root
. 당신이 통제하지만 루트 액세스 권한이없는이 목적을 위해 생성 된 사용자를 사용하십시오.
경우 시스템이 여기에 작동해야하는 간단한 C 래퍼입니다 (즉, 오두막 (#!
) 라인 스크립트) 통역 setuid 비트를 준수하지 않습니다. 아래 표시된대로 수정해야하고 컴파일합니다 :
cc -Wall -o wrapper wrapper.c
을 (-o wrapper
이 생산하는 바이너리가 wrapper
호출됩니다 "를 의미한다.) 당신이 원하는대로 이름을 대체, 그리고 장소에 래퍼 파일을 넣어 /usr/local/bin/wrapper
과 같이 찾을 수있는 곳 시스템 구성에 대해 알지 못해도 정확한 지시를 내리기는 어렵습니다. 행운을 빌어 요. 행운을 빌어 요. 행운을 빌어 요. 응용 프로그램을 어떻게 실행하는지 모르겠지만 명령을 삽입해야합니다. 줄을 다음 코드로 바꾸고 java
을 실제 사용 된 명령으로 바꾸고 /path/to/java
의 출력을으로 바꾸십시오(다시 "java"가 아닌 경우 실제 명령 이름을 사용하십시오). 명령 줄의 인수는 arg1
, arg2
대신 삽입됩니다. 따옴표는 사용하지 마십시오. 명령 행을 구성하는 문자 만.
#include <stdio.h>
#include <unistd.h>
int main() {
execl("/path/to/java",
"java",
"arg1",
"arg2",
/* ... */
(char*)0);
/* If we get here, the exec didn't work */
perror("Failed to execute /path/to/java");
return 1;
}
신뢰할 수없는 사용자가 응용 프로그램이 위의 래퍼는 또한 "제한된 쉘 '로 사용할 수있는 실행중인 호스트에 다른 액세스 권한이없는 경우; 사용자의 쉘로 만들거나 (그렇지 않으면 ssh
을 구성하여 해당 사용자가 로그인 할 때 래퍼를 실행하게 됨) 로그인시 자동으로 다시 시작됩니다. 그러나 응용 프로그램이 이미 실행 중이거나 시작되었는지 확인하지 않는 한 실제로는 좋은 생각이 아닙니다. 또는이 검사를 수행하도록 수정할 수 있습니다. 또는 래퍼를 수정하여 응용 프로그램을 다시 시작하기 전에 현재 실행 중인지 여부를 감지 할 수 있습니다. 이 두 가지 가능성 중 하나는이 대답에 삽입 될 수있는 것보다 자세한 내용을 포함합니다.
근본적으로 불가능합니다. 파일을 읽지 않고 실행할 수는 없습니다. – SLaks
@SLaks Linux/UNIX는 파일을 실행할 권한 ("x")을 가지고 있지만 읽을 필요는 없습니다 ("r")./실행중인 jar 파일을 지원하는 Linux를 찾지는 못하지만 조금 까다 롭습니다. 나는 당신이 끈적 끈적한 비트 설정 런처를 가질 수 있다고 생각하지만, 반드시 옳은 것은 반드시 쉬운 것은 아닙니다. –
@ TomHawtin-tackline : 그러나 코드를 실행하려면 여전히 어떻게 든 읽어야합니다. – SLaks