如何以另一个用户身份运行 X 应用程序 (vscode)

如何以另一个用户身份运行 X 应用程序 (vscode)

本质上我想要的是运行 vscode 而不授予它读取我的主目录的权限。

所以我创建了一个新用户vscode.tar.gz从下载文件https://code.visualstudio.com/#alt-downloads

现在我尝试codevscode我的身份登录时运行,如下所示:

~$ 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 是这些技术之一,它可以在 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 身份进入您自己启动的容器中!

我们现在可以将 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

答案2

您如何执行这些步骤?正确设置 $DISPLAY 变量,授予对 ~/.Xauthority 文件的访问权限,共享 /tmp/.X11-unix 目录中的套接字

我是 ubuntu 新手,不知道这意味着什么或如何执行此操作。我安装了代码,昨天我能够打开它,今天却不能。当我输入 code --verbose 时,它​​显示“无法打开 X 显示。futex 工具返回了意外的错误代码。/dev/fd/3:没有这样的文件或目录”,这就是我在这里的结果。我在 ubuntu 20.04

相关内容