Debian

如何以另一個使用者身份執行 X 應用程序(vscode)

  • March 25, 2022

基本上我想要的是執行 vscode 而不授予它讀取我的主目錄的權限。

所以我創建了一個新使用者並從https://code.visualstudio.com/#alt-downloadsvscode下載了.tar.gz文件

現在我正在嘗試以我的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. 正確設置$DISPLAY變數,
  2. 授予對~/.Xauthority文件的訪問權限
  3. /tmp/.X11-unix目錄中共享套接字

請注意,一旦您與不同的客戶端共享您的 X 伺服器,這與以您自己的使用者身份執行程序基本相同,安全方面:客戶端可以觀察鍵盤、截屏、合成按鍵,而我不會如果 X11 協議中一些較少使用的功能(載入紋理?字型?)可能被濫用為遠端文件閱讀器,您會感到驚訝。不過,不是 X11 協議方面的專家。

由於隔離非常弱,無論如何,您也可以在限制對主目錄的訪問方面不那麼複雜:容器。

Linux 有命名空間,docker、kubernetes、snap 等技術都依賴於它。您可以做的是以普通使用者的身份啟動一個程序,並為該程序提供使用者和文件系統環境的完整視圖 - 一個沒有您的主目錄的視圖。

Podman 是這些技術之一,它在 debian、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 /]#

看看你是如何突然在一個你自己啟動的容器中成為 root 的——作為非 root!

我們現在可以將 vscode 安裝到這個容器中,~/sourcecode/sourcecode在容器中一樣共享您的文件夾,並將其用作 vscode 的使用者數據目錄:

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

引用自:https://unix.stackexchange.com/questions/681398