场景,一般ssh禁止root远程登录、且关闭密码登录。
然后用一个拥有sudo su的权限a用户登录再sudo su做root权限操作。
而vscode 远程编辑对于这种场景暂时没有提供直接的支持,github上各自施展手脚。
我分享一下自己方案:
1,vscode客户端设置中找到Remote.SSH: Show Login Terminal
启用,方便连接时看到连接详情;
2,因为code-server下载极慢,我在阿里上,几乎没速度,所以,在vscode客户端配置中要勾选Remote.SSH: Local Server Download
,然后能通过代理下载到本机,再push到ssh server上 ;
3, 客户机的cat ~/.ssh/config
配置一下ssh服务器ssh连接信息(确保vscode客户端的ssh配置用的是这个,而不是自定义的其它ssh config文件),比如
Host code-server.xxx.com
HostName code-server.xxx.com
Port 22
IdentityFile .ssh/id_rsa
User a
4, ssh 服务器创建用户a,并给它sudo权限:用visudo -f /etc/sudoers.d/a
输入a ALL=(ALL) NOPASSWD: ALL
关闭保存;
5, 修改a ssh登录的shell,用vipw
找到类似a:x:1000:1000::/home/a:/home/a/autoSudoSuForSshLogin.sh
,它原来shell一般是bash的绝对路径,autoSudoSuForSshLogin文件内容如下,并用chmod +x autoSudoSuForSshLogin 改它为可运行
# 要把输入去掉,要不scp会提示 ,导致无法上传,ssh login倒不影响
# scp: Received message too long 1635087471
# scp: Ensure the remote shell produces no output for non-interactive sessions.
# echo 'auto sudo su';
# echo ''
# 可以添加一句,用于记录ssh 刚才有什么命令,好跟踪解决错误
echo "$@" >>/home/a/login.txt
# 关键在这句上面只是在登录时提示我们,它不是普通的登录shell
# 这个要换成接收像scp会传过来的参数,如-c /usr/lib/openssh/sftp-server
# 至于是用 $* 还是$@ ,还是要考虑更多,暂时我没尝试更加复杂的参数,这里就不展开了。
# 这样, ssh login与scp都能正常了,且vscode客户端也能快速安装完成
# 试了编辑root创建的文件,保存不再弹出无权限了。
sudo -i -u root /usr/bin/bash $*
6, 尝试登录是不是能执行上面shell,ssh code-server.xxx.com
,成功话,会看到 auto sudo su
和属于root的权限了。
7,回到vscode客户端,按它官方流程连接code-server.xxx.com
,就能看到登录窗口把code-server放到root下,而不是/home/a/下。 如图
好了,核心步骤就这样。