로컬 X 서버

로컬 X 서버

"루트" 액세스가 필요한 회사에서 만든 도구를 사용해야 했습니다.

더 나쁜 점은 GUI 응용 프로그램이라는 것입니다. 평소라면 이런 짓은 안 하겠지만 선택의 여지가 별로 없었어요.

현재, 나는 사용하고 있습니다

xhost + && sudo java -jar servermanager.jar && xhost -

응용 프로그램을 실행합니다. 그러나 이는 Java가 실행 중일 때 X-Server에 대한 액세스 제어가 비활성화됨을 의미합니다.

xhost -물론 이것이 가장 심각한 보안 문제는 아닐 수도 있지만, 응용 프로그램이 X 연결을 열자마자 문제가 발생하도록 시간을 측정하는 더 좋은 방법이 있는지 여전히 궁금합니다 .

핵심요약: GUI 창이 열리자마자 명령을 실행하는 방법은 무엇입니까?

답변1

로컬 X 서버

X 서버가 로컬인 경우(예: TCP가 아닌 Unix 소켓 연결) 더 세분화하여 특정 로컬 사용자만 허용할 수 있습니다.

xhost +SI:localuser:root

X SSH를 통해

그렇지 않은 경우 루트에 대한 직접 SSH 액세스를 허용하고(공개 키 인증 사용) 이 보안 연결을 통해 X를 전달하고 sudo 호출 대신 이를 사용하는 것을 고려할 수 있습니다.

ssh -X -f root@localhost java -jar servermanager.jar

.Xauthority 및 sudo

루트가 파일을 읽을 수 있다고 가정하면 (아마도 홈 디렉터리가 NFS에 있지 않는 한) sudo에서 실행하는 명령 환경에 1을 .Xauthority입력하기만 하면 연결할 수 있다는 것을 알 수 있습니다 .XAUTHORITY=$HOME/.Xauthority

XAUTHORITY="${XAUTHORITY-$HOME/.Xauthority}" \
  sudo -E java -jar servermanager.jar

sudo가 전달을 허용하지 않도록 구성된 경우 XAUTHORITY토큰을 명시적으로 내보낼 수 있습니다.

.Xauthority 및 xauth

xauth extract - $DISPLAY | sudo bash -c \
  "xauth merge - && java -jar servermanager.jar"

¹이것은 $HOME루트가 아닌 사용자의 홈 디렉터리입니다.

답변2

~/.bash_aliases에 다음을 넣었습니다.

   smg(){
     xhost + 
     sudo echo "Starting servermanager" #To get sudo prompt in fg
     sudo java -jar ~/downloads/servermanager.jar 2>/dev/null &
     sleep 5
     xhost -
    }

답변3

pgrep이 설치되어 있는 경우 다음 명령을 사용하여 보다 결정적으로 만들 수 있습니다.

smg(){
  xhost + 
  sudo echo "Starting servermanager" #To get sudo prompt in fg
  sudo java -jar ~/downloads/servermanager.jar 2>/dev/null &
  while  ! pgrep -l servermanager.jar > /dev/null ; do :; done
  xhost -
}

...최종 프로세스 이름에 따라 다릅니다. 너무 빨리 실행되는 것으로 밝혀지면 sleepwhile 루프 이후에 항상 작은 값을 유지할 수 있습니다.

관련 정보