离线环境使用SSH登录CDSW远程开发

2021-05-21

< view all posts

CSDW平台自带的web终端并不是很好用,而CDSW提供了对SSH登陆的支持。我们可以通过SSH登陆,使用自己熟悉的终端程序去操作。这篇笔记记录一下在离线(隔离外网)的情况下远程登录CDSW的方法,顺便也补充登录普通开发服务器的方法,以及vscode的相应配置。

配置本机(local)的SSH key:

用管理员模式运行power shell,执行cd ~/.ssh ,pwd查看到完整的路径,例如C:\Users\username\.ssh,之后执行 ssh-keygen -t rsa -f C:\Users\username\.ssh\id_rsa(把username替换成实际的用户名)生成SSH key,过程中会让我们设置私钥的密码(passphrase)。

*或者直接执行 ssh-keygen -t rsa,然后回车,就直接创建到默认地址。

下载和配置CDSWctl:

在.ssh目录中,现在会多出id_rsa和id_rsa.pub两个文件,cat id_rsa.pub,复制这个文件的全部内容。

登陆CDSW平台,右上角用户名->account settings->remote editing。把刚刚复制的内容粘贴到SSH public key输入框中,点Add。

之后在这个页面的下载按钮中选择Windows版本的下载,解压。把解压的地址添加到path环境变量中。

*这里补充一段,连接一般的开发服务器,将SSH公钥添加到服务器的参考步骤

首先我们要将本地的SSH公钥拷贝到服务端,在服务端执行:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

之后把本地 ~/.ssh/id_rsa.pub 这个公钥文件的内容复制到authorized_keys这个文件里面。

连接时使用ssh -i指定使用的密钥文件,或者在SSH配置文件里面添加IdentityFile这一项,例如:

Host hostname
    HostName localhost
    User username
    IdentityFile ~/.ssh/id_rsa

创建SSH endpoint(Session):

执行 cdswctl login -n username -u http://url.of.cdsw.com/ ,登陆CDSW平台,其中username是CDSW平台的用户名,登陆时会提示输入密码。

在登陆后,用如下命令创建SSH endpoint(session):cdswctl ssh-endpoint -p projectname -c 1 -m 2 -g 0,其中projectname是项目名,-c 表示CPU核心个数,-m 表示内存大小(gb),-g 表示GPU个数。

SSH登陆:

在我们创建了SSH endpoint之后,shell里面会提示:

You can SSH to the session using

ssh -p xxxx cdsw@localhost

其中xxxx是本地用来转发的端口号。这时候我们就可以通过工具远程登陆到CDSW平台的Session了。如果使用power shell的话,新打开一个窗口之后输入上面的命令,输入配置SSH key时使用的密码即可。

当然我们也可以使用其它的终端工具,例如secureCRT:新建一个连接,作如下的设置:

屏幕截图 2021-05-21 135736

注意把端口号替换成上面得到的端口号。之后secureCRT会让我们选择SSH公钥文件,也就是最开始创建的 id_rsa.pub 这个文件,之后输入配置的密码,连接就成功了。(如果没有的话,可以自己手动配置,在Options->Global Options->SSH2当中的Public key栏)

另外,我们也可以用类似的方法将 PyCharm SSH连接到CDSW平台,可以参考我之前写的这篇笔记:PyCharm连接到远程python interpreter时的问题排查

(补充)使用vscode连接:

secureCRT的功能还是比较有限的,如果习惯使用vscode的话可以用vscode作为终端进行连接。

因为环境是离线的,首先在 marketplace.visualstudio.com/vscode 下载需要的插件,我们需要Remote SSH和Remote SSH: Edting Configuration Files这两个,在页面的右边有“download extension”的链接。因为我们在CDSW平台主要使用python编码,可以顺便也安装python和jupyter这两个插件。

下载好之后用 code --install-extension /path/xxx.vsix 安装插件。

在安装完成后,vscode的左侧会多出一个连接栏。点其中的齿轮图标,如下图:

屏幕截图 2021-05-26 094755

会让我们选择SSH配置文件的路径,第一次使用的话这个文件是不存在的,直接点弹出的地址的第一个,vscode会在相应位置自动创建一个默认的配置文件。

之后将配置文件作改为:

Host cdsw (随便起一个名字就可以)
    HostName localhost
    Port 1234 (替换成上面得到的实际的端口)
    User cdsw

然后点窗口的图标建立一个连接:

屏幕截图 2021-05-26 103231

第一次连接会让我们选择远端的服务器系统,选Linux,如果设置了密码还需要再输入密码(私钥的passphrase;如果连接的不是CDSW平台而是普通服务器的话,这里需要输入的是用户名对应的密码)。目前连接肯定是会报错的,因为服务器端的插件没有安装。如果是如下的报错,则可进入下一步:

[10:51:20.258] Got request to download on client for {"platform":"linux","arch":"x64","destFolder":"/home/cdsw/.vscode-server/bin/054a9295330880ed74ceaedda236253b4f39a335"}
[10:51:20.259] Downloading VS Code server locally...
[10:51:22.285] Resolver error: Error: Running the contributed command: '_workbench.downloadResource' failed.

复制上面的commit id(在上面的例子中是054a9295330880ed74ceaedda236253b4f39a335),到 https://update.code.visualstudio.com/commit:${commit_id}/server-linux-64/stable 这个地址下载服务端插件。

解压后将解压得到的全部内容复制到(不要外层的目录) ~/.vscode-server/bin/${commit_id},之后再创建一个名为0的文件: touch ~/.vscode-server/bin/${commit_id}/0

之后我们再进行连接。如果还是报错,出现如下信息的话:

[11:27:16.492] getPlatformForHost was canceled
[11:27:16.493] Resolver error: Error: Connecting was canceled

这是因为vscode本身的一个bug导致的(在选择远端的服务器系统的时候vscode自动取消了,导致getPlatformForHost失败),从菜单选择File--Preferences--Settings,点下图的按钮,打开vscode的json配置文件:

屏幕截图 2021-05-26 113928

在文件里面添加如下json内容:

{
    "remote.SSH.remotePlatform": {"csdw": "linux"}
}

里面的csdw是上面我们给host起的名字。之后应该就可以正常连接了。

此外,如果连接时不断重试,不断打印 Acquiring lock on ...... 的信息,或者出现类似:failed to create hard link ‘..........’: File exists 的报错,首先可以在vscode的json配置文件中添加:

"remote.SSH.useFlock": false

之后删除掉报错信息中提到的文件,名字一般是~/.vscode-server/bin/${commitid}/vscode-remote-link... ,以及同一个目录里同名的 .target 文件,再连接就可以了。(能成功连接之后最好再把remote.SSH.useFlock重新打开)

再补充一点,使用remote-ssh插件需要在服务器上在 /etc/ssh/sshd_config 文件中配置 AllowTcpForwarding yes 。而如果我们没有root权限,可用参考这个方法设置一个自定义的sshd server来解决

(补充)配置SSH Agent:

配置到这里,还有一个不方便的地方,就是每次连接的时候我们都要输入SSH passphrase。可以配置 SSH Agent来免去这个验证。

管理员权限打开一个powershell,首先执行 ssh-add -l 查看之前是否有配置过SSH agent。第一次使用的话会看到报错:Error connecting to agent: No such file or directory,说明没有配置过,需要通过如下方法配置:

Set-Service ssh-agent -StartupType Automatic

Start-Service ssh-agent

Get-Service ssh-agent

之后执行 ssh-add ,默认会添加 ~/.ssh 目录下所有的私钥,也可以指定私钥,如 ssh-add ~/.ssh/id_rsa ,输入passphrase,就可以将ssh配置添加到agent。

最后,我们在vscode里面打开控制台(Ctrl+`),再执行一次 ssh-add -l ,如果有输出key说明配置成功。

如果一切正常的话,这时候我们应该已经可以通过SSH key连接服务端并且不需要passphrase了。但是如果出现了以下报错:

[13:33:53.211] > warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)
[13:33:53.228] > cdsw@localhost: Permission denied (publickey).

这是由于windows自带的Open SSH版本过低,使用的签名算法被服务器拒绝了而导致的(相关issue)。最新版本的Windows应该是解决了这个问题,如果没法更新版本的话,有一个workaround是使用RSA以外的加密方法。例如用 ssh-keygen -t ecdsa -b 521 再创建一个key,重复一下前面的步骤,之后用这个key就可以连接了。

(补充)vscode远程配置文件

最后提一句,vscode在每一台远程机器上有独立的配置文件。F1或Ctrl+Shift+P打开命令栏之后输入:preferences: open remote settings,就可以打开远程机器上的JSON配置文件了。

(补充)vscode remote ssh sudo

当以普通用户的身份希望编辑root权限的文件时,会发现 susudo code 都是无效的。

这是因为目前vscode并没有实现提权打开文件这个功能,这是相关issue。目前比较好的方法只有为root用户也安装一个vscode。

以腾讯云为例,需要以下步骤:

(如果没有设置过)设置root密码:

sudo passwd root

ssh配置文件修改为允许root登录,打开 /etc/ssh/sshd_config ,修改以下项目为yes:

PermitRootLogin yes

重启ssh服务:

sudo service ssh restart

之后通过和上面类似的步骤,使用vscode远程登录一次root用户就会给root安装上vscode server。