다른 사용자로 X 애플리케이션을 실행하는 방법(vscode)

다른 사용자로 X 애플리케이션을 실행하는 방법(vscode)

본질적으로 내가 원하는 것은 내 홈 디렉터리에 대한 읽기 권한을 부여하지 않고 vscode를 실행하는 것입니다.

그래서 새 사용자를 만들고 다음에서 파일을 다운로드했습니다 vscode..tar.gzhttps://code.visualstudio.com/#alt-downloads

이제 다음과 같이 로그인하여 code실행 하려고 합니다 .vscode

~$ su - vscode -c "/home/vscode/code-stable-x64-1638855856/VSCode-linux-x64/bin/code --verbose"
Password: 
[8347:1214/125108.021461:ERROR:browser_main_loop.cc(1402)] Unable to open X display.
The futex facility returned an unexpected error code.
/dev/fd/3: No such file or directory
Server response:

나는 또한 내부에서 시작을 사용해 보았고 ssh -Y vscode@localhost효과 code가 있었지만 가능하다면 ssh 사용을 피하고 싶습니다.

답변1

당신은해야합니다

  1. 변수를 올바르게 설정하십시오 $DISPLAY.
  2. 파일 ~/.Xauthority에 대한 액세스 권한 부여
  3. /tmp/.X11-unix공유 디렉터리 내의 소켓

X 서버를 다른 클라이언트와 공유하면 보안 관점에서 볼 때 이는 기본적으로 자신의 사용자로 프로그램을 실행하는 것과 동일합니다. 클라이언트는 키보드를 관찰하고, 스크린샷을 찍고, 키 입력을 합성할 수 있지만 일부는 놀라지 않습니다. X11 프로토콜의 덜 사용되는 기능(텍스처 로딩? 글꼴 로딩?) 중 일부가 원격 파일 판독기로 남용될 수 있습니다. 하지만 저는 X11 프로토콜의 전문가는 아닙니다.

격리가 매우 약하기 때문에 어쨌든 홈 디렉터리인 컨테이너에 대한 액세스를 제한하는 방법이 덜 정교할 수도 있습니다.

Linux에는 네임스페이스가 있으며 docker, kubernetes, snap과 같은 기술은 모두 이에 의존합니다. 당신이 할 수 있는 일은 일반 사용자로 프로세스를 시작하고 해당 프로세스에 홈 디렉터리 없이 사용자 및 파일 시스템 환경에 대한 전체 보기를 제공하는 것입니다.

Podman은 이러한 기술 중 하나이며 데비안, IIRC에서 사용할 수 있습니다. 설치는 가능한 한 간단해야 합니다.

sudo apt install -y podman

그러면 컨테이너를 실행할 수 있습니다.

podman run -it --rm debian:sid
#       |   |   |    |
#       +--------------- Run subcommand: run a container
#           |   |    |
#           +----------- interactive, i.e., assign a virtual terminal, 
#               |    |   so you can see and type into an interactive session
#               |    |
#               +------- Remove the container after you're done - no data survives,
#                    |   if it's only in the container. Of course, things on 
#                    |   volumes specified using the -v source_path:destination
#                    |   persist, since they are "outside".
#                    |
#                    +-- name:tag is the way to specify what
#                        container you want to fetch in which version

그래픽 작업을 실행하려면 위에서 언급한 사항을 허용하고 SELinux에게 약속한 작업을 수행하고 있음을 알려야 합니다.

podman run -e DISPLAY=$DISPLAY \
            -v /tmp/.X11-unix:/tmp/.X11-unix:Z \
             -v ~/.Xauthority:/root/.Xauthority:Z \
              --security-opt label=type:container_runtime_t \
               -it --rm fedora:35
#           ||||
#           +---- -e INSIDE=OUTSIDE  set an env variable INSIDE inside the
#            |||     container to the value OUTSIDE
#            ||| 
#            +--- -v SOURCE:DEST[:permissions]
#             ||     SOURCE directory or file appears under DEST within
#             ||     container; :Z means that the podman-running users'
#             ||     permissions are translated to root permissions inside.
#             ||     Here, mount the host's X11 socket directory at the same place
#             ||
#             +-- -v SOURCE:DEST[:permissions] again
#              |     Here, mount the podman-running user's ~/.Xauthority
#              |     as /root/.Xauthority owned by root.
#              |     
#              +- --rm -it: see above     
[root@4da385540218 /]#

시작한 컨테이너 안에서 갑자기 루트가 아닌 상태가 된 것을 확인하세요!

이제 이 컨테이너에 vscode를 설치하고 컨테이너에서 ~/sourcecode와 같이 폴더를 공유하고 /sourcecodevscode의 사용자 데이터 디렉터리로 사용할 수 있습니다.

podman run -e DISPLAY=$DISPLAY \
           -v /tmp/.X11-unix:/tmp/.X11-unix:Z \
           -v ~/.Xauthority:/root/.Xauthority:Z \
           --security-opt label=type:container_runtime_t \
           -v ~/sourcecode:/sourcecode:Z \
           -it --rm fedora:35
[root@4da385540218 /]#
 rpm --import https://packages.microsoft.com/keys/microsoft.asc
[root@4da385540218 /]#
 echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo
[root@4da385540218 /]#
 dnf --refresh update -y
[root@4da385540218 /]#
 dnf install -y code
[root@4da385540218 /]#
 code --user-data-dir /sourcecode/ --no-sandbox

답변2

이 단계를 어떻게 수행합니까? $DISPLAY 변수를 올바르게 설정하고, ~/.Xauthority 파일에 대한 액세스 권한을 부여하고, /tmp/.X11-unix 디렉토리에서 소켓을 공유합니다.

저는 우분투를 처음 접했고 이것이 무엇을 의미하는지, 어떻게 수행하는지 전혀 모릅니다. 코드를 설치했는데 어제는 열 수 있었는데 오늘은 열 수 없습니다. --verbose 코드를 입력하면 "X 디스플레이를 열 수 없습니다. futex 도구가 예기치 않은 오류 코드를 반환했습니다. /dev/fd/3: 해당 파일 또는 디렉터리가 없습니다."라는 메시지가 표시되고 여기에 표시됩니다. 저는 우분투 20.04를 사용하고 있습니다

관련 정보