首页 > 其他分享 >VS Code Remote

VS Code Remote

时间:2023-05-30 14:45:31浏览次数:31  
标签:Code Remote vscode authority readonly VS remoteAuthorityResolverService ._ retur

与 remote 有关的功能,vscode 总共有四条不开源的产品线:

  • vscode live share
  • vscode remote (container, wsl, ssh)
  • visual studio online
  • vscode web

实现的功能都是 vscode 编辑的不是本地的文件,而是远程机器上的文件。vscode remote 来说,远程文件则是你指定的通信方式,比如 ssh,连接过去的文件。而 vscode live share 和 visual studio online 这两种方式都不是直连的,而是通过微软在公网上的代理服务器进行的中转。这个也就导致了 live share 在国内用起来并不是特别快。
vscode web 与 vistual studio online 是一样的实现,只是少了走微软的公网代理这个步骤,直接是连了本地暴露的端口。
image.png

第一步:构造 workbench 的参数

一个 workbench 就是我们所看见的 vscode 整个界面。构造它需要的参数有:

interface IWorkbenchConstructionOptions {
  readonly remoteAuthority?: string;
  readonly connectionToken?: string;
  readonly webviewEndpoint?: string;
  readonly workspaceProvider?: IWorkspaceProvider;
  userDataProvider?: IFileSystemProvider;
  readonly webSocketFactory?: IWebSocketFactory;
  readonly resourceUriProvider?: IResourceUriProvider;
  readonly credentialsProvider?: ICredentialsProvider;
  readonly staticExtensions?: ReadonlyArray<IStaticExtension>;
  readonly urlCallbackProvider?: IURLCallbackProvider;
  readonly updateProvider?: IUpdateProvider;
  readonly resolveCommonTelemetryProperties?: ICommontTelemetryPropertiesResolver;
  readonly resolveExternalUri?: IExternalUriResolver;
  readonly logLevel?: LogLevel;
  readonly driver?: boolean;
}
  1. remoteAuthority:远程地址,即从哪里提供工作台的 IP: PORT。例如,用于 WebSocket 连接。connectionToken:要发送到服务器的连接标记。
  2. webviewEndpoint:帧内容(“webview”)的终端节点,必须提供以完全安全隔离工作台主机。workspaceProvider:打开工作区并提供初始工作区的处理程序。
  3. userDataProvider:用户数据提供程序用于处理用户特定的应用程序状态,例如设置、键绑定、UI 状态(例如打开的编辑器)和片段。
  4. webSocketFactory:Web 套接字的工厂。
  5. resourceUriProvider:资源 URI 的提供程序。
  6. credentialsProvider:用于存储和检索凭据的凭据提供程序。
  7. staticExtensions:添加不能卸载但只能禁用的静态扩展。
  8. urlCallbackProvider:URL 回调支持。
  9. updateProvider:更新报告支持。
  10. resolveCommonTelemetryProperties:支持将附加属性添加到遥测中。
  11. resolveExternalUri:在打开外部 URI 之前解析它。
  12. logLevel:当前日志级别。默认为 LogLevel.Info。driver:是否启用“ smoke test”驱动程序。

第二步:构造 workbench

其中比较关键的几行

// 远程
const remoteAuthorityResolverService = new RemoteAuthorityResolverService(this.configuration.resourceUriProvider);
serviceCollection.set(IRemoteAuthorityResolverService, remoteAuthorityResolverService);

// 远程代理
const remoteAgentService = this._register(new RemoteAgentService(this.configuration.webSocketFactory, environmentService, productService, remoteAuthorityResolverService, signService, logService));
serviceCollection.set(IRemoteAgentService, remoteAgentService);

// 文件
const fileService = this._register(new FileService(logService));
serviceCollection.set(IFileService, fileService);
this.registerFileSystemProviders(environmentService, fileService, remoteAgentService, logService, logsPath);

这里就分出了三条支线剧情

  • remoteAuthorityResolverService
  • remoteAgentService
  • fileSystemProvider

第三步:remoteAuthorityResolverService 设置全局变量 RemoteAuthorities

resolveAuthority(authority: string): Promise<ResolverResult> {
  if (authority.indexOf(':') >= 0) {
  const pieces = authority.split(':');
  return Promise.resolve(this._createResolvedAuthority(authority, pieces[0], parseInt(pieces[1], 10)));
}
return Promise.resolve(this._createResolvedAuthority(authority, authority, 80));
}
private _createResolvedAuthority(authority: string, host: string, port: number): ResolverResult {
  RemoteAuthorities.set(authority, host, port);
  return { authority: { authority, host, port } };
}

这里通过全局变量 RemoteAuthorities,影响了其他地方的 Uri 的解析。

第四步 remoteAuthorityResolverService 被谁调用的?

是在 RemoteExtensionHostClient 中调用的。顾名思义,这个类就是去连接 remoteExtensionHost 这个进程的,从而间接操作远端机器上运行的插件进程。

const options: IConnectionOptions = {
  commit: this._productService.commit,
  socketFactory: this._socketFactory,
  addressProvider: {
    getAddress: async () => {
      const { authority } = await this.remoteAuthorityResolverService.resolveAuthority(this._initDataProvider.remoteAuthority);
      return { host: authority.host, port: authority.port };
    }
  },
  signService: this._signService,
  logService: this._logService
};

remote 主要就四个功能

  • 远程插件执行
  • 文件系统读写
  • terminal
  • port forwarding

这里已经可以找到远程插件执行是怎么过来的了。

第五步:RemoteFileSystemProvider

// 转发调用
stat(resource: URI): Promise<IStat> {
  return this.channel.call('stat', [resource]);
}

open(resource: URI, opts: FileOpenOptions): Promise<number> {
  return this.channel.call('open', [resource, opts]);
}

close(fd: number): Promise<void> {
  return this.channel.call('close', [fd]);
}

还是非常直白的。直接把对 FileSystemProvider 调用转成 IPC 调用,并跑在 REMOTE_FILE_SYSTEM_CHANNEL_NAME 这个 channel 上。
这里的连接都是用 webSocketFactory 这个最初从 IWorkbenchConstructionOptions 上传进来的参数控制的。所以 remote 的关键,还是怎么用 websocket 和 remoteAgent 连上。这个地方连上了,vscode 就可以在这个连接上转发一切,从文件系统调用,到插件的消息。

服务端

我们只能看到 vscode remote 客户端的部分。websocket 对端的 remoteAgent 是没有提供开源代码的。我们可以自己脑补一下,一个类似冰河木马的进程,在用 websocket 把你的机器暴露出去。在 vscode 的开源代码中,并没有提供对这个 socket 的加密机制,而是选择由插件去处理如何加密。

标签:Code,Remote,vscode,authority,readonly,VS,remoteAuthorityResolverService,._,retur
From: https://www.cnblogs.com/xusun/p/17443184.html

相关文章

  • function () { [native code] }
    这是文章的主要内容function(){[nativecode]}##正文开始央视网消息:今天(5月29日)的生态环境部发布会,同时还发布了《2022年中国海洋生态环境状况公报》。公报显示,2022年我国海洋生态环境状况稳中趋好,海水环境质量总体保持稳定。全国近岸海域海水水......
  • [LeetCode] 51. N-Queens
    The n-queens puzzleistheproblemofplacing n queensonan nxn chessboardsuchthatnotwoqueensattackeachother.Givenaninteger n,return alldistinctsolutionstothe n-queenspuzzle.Youmayreturntheanswerin anyorder.Eachsolution......
  • vscode设置关键字高亮
    下载highlight-words插件在settings.json文件中添加以下代码路径:(文件>首选项>设置>打开设置(json)图标在右上角)"highlightwords.colors":[{"light":"#b3d9ff","dark":"cyan"},{"light":"#e6ffb3&......
  • 【Haxe】(一)VSCode 搭建 Haxe 开发环境
    前言咱换工作啦!新工作这边需要用到的开发语言是Haxe,最近大概会写几篇笔记。Haxe的介绍就不写了,打算记录点有用的学习内容,先从搭建开发环境开始吧!当前适用版本:VSCode:CurrentLatestVersionHaxe版本:4.3.1文章最近更新日期:2023.05.30 环境配置先去Haxe官网下载语......
  • VS Code离线安装方法
    问题描述在VisualStudioCode插件市场下载的.vsix插件安装包在离线环境中双击安装不上。查看日志也没说具体原因:VSIXInstaller.NoApplicableSKUsException:一个或多个扩展适用于VisualStudioCode。请尝试在VisualStudioCode中安装它们。解决方案方案一:VisualStudi......
  • vscode 自定义代码字体颜色,局部变量、全局变量、函数、宏、属性
    vscode自定义代码字体与颜色风格在setting.json中修改即可:在这里插入图片描述"editor.semanticTokenColorCustomizations":{       "enabled":true,//enableforallthemes       "rules":{           "*.static":{             ......
  • Python异步编程之web框架 异步vs同步 文件IO任务压测对比
    测试基本信息主题:比较异步框架和同步框架在文件IO操作的性能差异python版本:python3.8压测工具:locustweb框架:同步:flask异步:aiohttp、starlette异步文件模块:aiofiles、anyio.Path请求并发量:模拟10个用户服务器配置:Intel(R)i7-12700F客户端配置:Intel(R)i7-87003......
  • Codeforces Round 875 (Div. 2) A-D
    A.TwinPermutations题意:给出一个由[1,2,...,n]组成的数组a,构造另一个由[1,2,...,n]组成的数组b,使得a[1]+b[1]<=a[2]+b[2]<=...<=a[n]+b[n]Solution可以想到只要让他们全为n+1就行了,这样是一定有解的voidsolve(){ intn;cin>>n; for(inti=1;i<=n;i++) { cin>>a[i]; ......
  • vs 控制台输出
    void__cdeclOutputDebugPrintf(constchar*format,...){va_listvlArgs;char*strBuffer=(char*)GlobalAlloc(GPTR,4096);va_start(vlArgs,format);//_vsnprintf(strBuffer,4096-1,format,vlArgs);intsize=strlen(strBuffer)-1;......
  • #yyds干货盘点# LeetCode程序员面试金典:填充每个节点的下一个右侧节点指针 II
    题目:给定一个二叉树:structNode{ intval; Node*left; Node*right; Node*next;}填充它的每个next指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将next指针设置为NULL。初始状态下,所有 next指针都被设置为NULL。 示例1:输入:root=[1,2,3......