本质上我想要的是运行 vscode 而不授予它读取我的主目录的权限。
所以我创建了一个新用户vscode
并.tar.gz
从下载文件https://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
你需要
- 正确设置
$DISPLAY
变量, - 授予对该
~/.Xauthority
文件的访问权限 /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