2021-05-21
< view all postsCSDW平台自带的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:新建一个连接,作如下的设置:

注意把端口号替换成上面得到的端口号。之后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的左侧会多出一个连接栏。点其中的齿轮图标,如下图:

会让我们选择SSH配置文件的路径,第一次使用的话这个文件是不存在的,直接点弹出的地址的第一个,vscode会在相应位置自动创建一个默认的配置文件。
之后将配置文件作改为:
Host cdsw (随便起一个名字就可以)
HostName localhost
Port 1234 (替换成上面得到的实际的端口)
User cdsw
然后点窗口的图标建立一个连接:

第一次连接会让我们选择远端的服务器系统,选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配置文件:

在文件里面添加如下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权限的文件时,会发现 su 和 sudo 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。