Debian
如何以另一個使用者身份執行 X 應用程序(vscode)
基本上我想要的是執行 vscode 而不授予它讀取我的主目錄的權限。
所以我創建了一個新使用者並從https://code.visualstudio.com/#alt-downloads
vscode
下載了.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。
你需要
- 正確設置
$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 的——作為非 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