解锁 VSCode 远程 SSH 的隐藏功能 - 跨用户访问文件系统的完美解决方案

Posted by Mike on 2024-07-24

在使用远程服务器(例如: 虚拟机)时,有时您需要切换到不同的用户,例如:短时间内获得更高的权限。

通常可以使用以下命令之一来完成:

1
2
$ su <different-user>
$ sudo -i -u <different-user>

但如果你想使用 VSCode 时更轻松地探索文件系统和编辑代码,这就不那么简单了。比如:登录用户为 mike,而您想在 VSCode 资源管理器中访问 root 用户的主目录。

首先,您需要在 VSCode 配置中启用一些标志,你可以在用户界面 ( 用 ctrl+, 打开设置,搜索 Remote.SSH ) 中启用:

settings.json 中编辑:

1
2
"remote.SSH.useLocalServer": true,
"remote.SSH.enableRemoteCommand": true,

然后,打开 SSH 配置文件(默认为 /home/$USER/.ssh/config),在主机中添加 RemoteCommandRequestTTY 选项。

例如:

1
2
3
4
5
6
Host example.com
HostName example.com
IdentitiesOnly=yes
User my_user
RequestTTY yes
RemoteCommand sudo -i -u other_user

注:RequestTTY 选项的作用是指定是否为会话请求伪 TTY。参数可以是:no(从不请求 TTY)、yes(当标准输入为 TTY 时始终请求 TTY)、force(始终请求 TTY)或 auto(打开登录会话时请求 TTY)。该选项与 -t 和 -T 标志相同。如果你不加上这个选项,通过 SSH 命令行登陆时将无法正常登陆。

如果远程服务器可以访问互联网,那就已经配置完成了。

否则,您需要采取以下两个步骤中的一个。

  1. 远程服务器可通过代理访问互联网

在这种情况下,请在需要切换用户的主目录下创建一个 .wgetrc 文件。例如: /home/other_user/.wgetrc,内容如下:

1
2
3
use_proxy=on
http_proxy=http://proxy.host:<port>
https_proxy=http://proxy.host:<port>

这是必要的,因为 VSCode 会在会话开始时使用 wget 下载必要的二进制文件。

  1. 远程服务器根本无法访问互联网

在这种情况下,您需要在本地下载 VSCode 服务器文件,然后将其复制(例如: 使用 scp)到服务器,具体步骤如下:

1
2
3
4
5
6
7
8
9
10
# 本地下载
$ commit_id=f1e16e1e6214d7c44d078b1f0607b2388f29d729
$ curl -sSL "https://update.code.visualstudio.com/commit:${commit_id}/server-linux-x64/stable" -o vscode-server-linux-x64.tar.gz
$ scp vscode-server-linux-x64.tar.gz user@remotehost:/home/user/

# 远程服务器操作
$ commit_id=f1e16e1e6214d7c44d078b1f0607b2388f29d729
$ mkdir -p ~/.vscode-server/bin/${commit_id}
$ tar zxvf ~/vscode-server-linux-x64.tar.gz -C ~/.vscode-server/bin/${commit_id} --strip 1
$ touch ~/.vscode-server/bin/${commit_id}/0

更详细步骤可参考:https://stackoverflow.com/a/57601121/8175198

或者,先用 VSCode 远程 SSH 连接正常用户,让它传输文件,然后将文件复制到另一个用户的主目录。

1
$ cp -r /home/mike/.vscode-server/ /root/

您还可以将默认设为在客户端上下载 VSCode 服务器文件,并使用 scp 将其传输到主机,而不是先尝试 wget 将其下载到主机上。

您也可以更改这些文件的安装位置

参考文档:

  1. https://medium.com/@krisztian.sala/vs-code-remote-ssh-as-another-user-57d449e20fb1
  2. https://stackoverflow.com/a/57601121/8175198
  3. https://github.com/b01/dl-vscode-server