能否在SSH终端中使用“code”命令,打开带有SSH扩展的本地机器上的Visual Studio Code?

26

我喜欢 VS Code 的一点是,当我在 WSL 中使用终端时,可以运行 code file.txt 命令,在本地使用 WSL 远程扩展打开该文件。

那么,使用 SSH 是否也可以实现类似的功能呢?也就是说,如果我通过 SSH 登录到远程主机,能否设置一些东西,使得运行 code file.txt 命令会在我的本地机器上打开 VS Code,并通过远程 SSH 扩展连接并打开该文件呢?


可能不完全符合您的需求,但是有一个Visual Studio Code扩展可以让您在本地的Visual Studio Code中编辑远程服务器上的文件。https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh - Jonathan Wang
2
这个回答解决了你的问题吗?Vscode (code.exe) 命令行参数通过 SSH 立即打开远程工作区文件夹 - Jacob Stern
6个回答

20
我找到了一个更好、更简单的答案,感谢this post
只需创建一个名为code的新脚本文件,并将文件放在任何一个$PATH下的文件夹中即可。(使用echo $PATH查看可以使用的文件夹)
#! /usr/bin/env zsh

local max_retry=10

for i in {1..$max_retry}
do
    local script=$(echo ~/.vscode-server/bin/*/bin/remote-cli/code(*oc[$i]N))
    if [[ -z ${script} ]]
    then
        echo "VSCode remote script not found"
        exit 1
    fi
    local socket=$(echo /run/user/$UID/vscode-ipc-*.sock(=oc[$i]N))
    if [[ -z ${socket} ]]
    then
        echo "VSCode IPC socket not found"
        exit 1
    fi
    export VSCODE_IPC_HOOK_CLI=${socket}
    ${script} $@ > /dev/null 2>&1
    if [ "$?" -eq "0" ]; then
        exit 0
    fi
done

echo "Failed to find valid VS Code window"

Bash版本

#! /bin/bash
                                                                             
max_retry=10                                                                 
                                                                             
for i in $(seq 1 $max_retry)                                                 
do                                                                           
    recent_folder=$(ls ~/.vscode-server/bin/ -t | head -n$i | tail -1)       
    script=$(echo ~/.vscode-server/bin/$recent_folder/bin/remote-cli/code)   
    if [[ -z ${script} ]]                                                    
    then                                                                     
        echo "VSCode remote script not found"                                
        exit 1                                                               
    fi                                                                       
    socket=$(ls /run/user/$UID/vscode-ipc-* -t | head -n$i | tail -1)        
    if [[ -z ${socket} ]]                                                    
    then                                                                     
        echo "VSCode IPC socket not found"                                   
        exit 1                                                               
    fi                                                                       
    export VSCODE_IPC_HOOK_CLI=${socket}                                     
    ${script} $@ 2>/dev/null                                                             
    if [ "$?" -eq "0" ]; then                                                
        exit 0                                                               
    fi                                                                       
done                                                                         
                                                                             
echo "Failed to find valid VS Code window"

更新

上述脚本在最近的更新中无法正常工作。我不得不将第一行更改为

local script=$(echo ~/.vscode-server/bin/*/bin/remote-cli/code(*oc[1]N))

更新2

如果最近打开的 SSH 窗口被关闭,原始脚本可能会失败,但如果有另一个已经连接的 SSH 窗口仍然打开。我已经改进了脚本,使其能够在最近的 N 个窗口(默认为10个)上重试命令。


3
非常有用! - ivallesp
我一直收到这个错误信息 - '/home/averma5/.vscode-server/bin/*/bin/remote-cli/code(*oc[1]N))':不是一个有效的标识符。 - user5319825
我在/run/user/$UID/下找不到任何与vscode相关的内容。我有什么遗漏吗? - Wei Qiu
2
在Ubuntu Linux 20.04上,vscode-ipc-*似乎停留在/tmp下。我需要将“/run/user/$UID”更改为“/tmp”。编辑:这很奇怪。在另一台机器上,vscode-ipc-*确实出现在“/run/user/$UID”下。 - Wei Qiu
1
对于WSL2 Ubuntu来说,套接字路径是/mnt/wslg/runtime-dir/vscode-ipc-*实现示例 - Francisco Gomes
显示剩余5条评论

8
您无需做任何事情。VSCode会根据您的shell自动将路径/PATH设置为环境变量中的code。请参见此响应。您可能正在覆盖您的路径/PATH,就像我一样。我意外地在~/.cshrc~/.bashrc中覆盖了pathPATH,并遇到了相同的问题。解决后,我可以在命令行上运行codewhich code 返回命令的位置。
在我弄清楚之前,我使用了下面提到的两种方法。对我来说,这两种方法都在bash中运行良好;您可以根据需要修改它们以适合您的shell。但是请确实修复您的路径/PATH,而不是使用这些方法。
  1. code的位置添加到~/.bashrc中的PATH中

    export PATH=${VSCODE_GIT_ASKPASS_NODE%/*}/bin:$PATH

或者

  1. ~/.bashrc中设置code的别名

    alias code="${VSCODE_GIT_ASKPASS_NODE%/*}/bin/code"


有关pathPATH的更多信息,请参见此处此处

2
在我的机器上,alias 将会是 alias code="${VSCODE_GIT_ASKPASS_NODE%/*}/bin/remove-cli/code" - HuihuangZhang
如果你想使用当前环境变量的值,那么这必须是一个函数,否则它会在别名创建时展开。 - Sandip Bhattacharya

2

是的,有点像。

从VSCode终端运行以下命令:

env | grep VSCODE_IPC_HOOK_CLI

然后复制并粘贴带有“export”关键字的那一行到您的ssh终端中。

之后,您应该能够从您的~/.vscode-server/bin/XXX/bin目录中运行代码。

VSCode终端

enter image description here

SSH终端

enter image description here

更新:

您可以通过使用.bashrc.profile来自动化此过程,将IPC代码放入临时文件中,并在进行ssh登录时进行源引用。

例如,这对我有效...

将以下内容追加到~/.bashrc文件中

#
if [ "$VSCODE_IPC_HOOK_CLI" != "" ]; then
cat >$HOME/.vscode_env.sh <<EOF
#
if [ "\$VSCODE_IPC_HOOK_CLI" = "" ]; then
export VSCODE_IPC_HOOK_CLI="$VSCODE_IPC_HOOK_CLI"
alias code="${VSCODE_GIT_ASKPASS_NODE%/*}/bin/code"
fi
EOF
fi

然后将此内容添加到您的~/.profile文件中

[ -f $HOME/.vscode_env.sh ] && . $HOME/.vscode_env.sh

(可能有更加优雅的方法。而且您仍然需要在远程VSCode会话中至少启动1个终端。)

VSCODE_IPC_HOOK_CLI会改变吗?我需要在bashrc中添加'env|grep'吗?我应该为这个.vscode-server代码设置别名吗? - Fred Guth

0

这对我有效

if [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
  local script=$(echo ~/.vscode-server/bin/*/bin/remote-cli/code(*oc[1]N))
  if [[ -z ${script} ]]
  then
      echo "VSCode remote script not found"
      exit 1
  fi
  local socket=$(echo /run/user/$UID/vscode-ipc-*.sock(=oc[1]N))
  if [[ -z ${socket} ]]
  then
      echo "VSCode IPC socket not found"
      exit 1
  fi
  export VSCODE_IPC_HOOK_CLI=${socket}
  alias code=${script}
fi

我一直收到以下错误信息 -'/home/averma5/.vscode-server/bin/*/bin/remote-cli/code(*oc[1]N))': 不是有效的标识符。 - user5319825

0

Lazy Ren的Bash脚本几乎对我有用。但是在重试策略中出现了错误。

以下内容对我有效:

#! /bin/bash
                                                                             
max_retry=10                                                                 
                                                                             
for i in $(seq 1 $max_retry)                                                 
do                                                                           
    recent_folder=$(ls ~/.vscode-server/bin/ -t | head -n$i | tail -1)       
    script=$(echo ~/.vscode-server/bin/$recent_folder/bin/remote-cli/code)   
    if [[ -z ${script} ]]                                                    
    then                                                                     
        echo "VSCode remote script not found"                                
        exit 1                                                               
    fi                                                                       
    socket=$(ls /run/user/$UID/vscode-ipc-* -t | head -n$i | tail -1)        
    if [[ -z ${socket} ]]                                                    
    then                                                                     
        echo "VSCode IPC socket not found"                                   
        exit 1                                                               
    fi                                                                       
    export VSCODE_IPC_HOOK_CLI=${socket}                                     
    ${script} $@ 2>/dev/null                                                             
    if [ "$?" -eq "0" ]; then                                                
        exit 0                                                               
    fi                                                                       
done                                                                         
                                                                             
echo "Failed to find valid VS Code window"

在第7行和第14行,当i大于1时,recent_folder和socket变成了一个列表,而脚本的其余部分则无法正常工作。
为了解决这个问题,我在第7行添加了| tail -1|head -n$i | tail -1的组合应该给出“第i”行,这正是我们想要的。

请允许我使用固定脚本来编辑我的帖子,以供未来的观看者。谢谢修正! - Lazy Ren

0
使用以下命令在远程终端上打开文件夹或文件。 注意:必须已经在远程主机上安装了vscode-server(如果您已经连接到它,那么应该已经安装)。同时,必须指定文件或文件夹的绝对路径。使用-n在新窗口中启动,-r重用同一窗口。
code --folder-uri <absolute-path>
code --file-uri <absolute-path-file-name>

例子:

code -r --folder-uri /home/myscripts/src           
code -n --file-uri /home/myscripts/src/math/sample.py

这很酷。正是我所需要的。 - Koby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接