收起左侧

FNOS 使用 VSCode Remote-SSH 连接失败的解决方法:修复用户目录问题

0
回复
19
查看
[ 复制链接 ]

1

主题

0

回帖

0

牛值

江湖小虾

前言

在使用 VSCode Remote-SSH 连接 FNOS 时,可能会遇到普通 SSH 可以登录,但 VSCode 一直连接失败、卡在安装 VSCode Server、无法创建远程目录等问题。

**这类问题的一个常见原因是:**FNOS 用户没有标准的、可写的用户目录

VSCode Remote-SSH 在连接远程主机时,会在远程用户的家目录下创建:

~/.vscode-server

**如果用户没有正确的 **$HOME 目录,或者该目录不可写,VSCode Server 就无法正常安装,从而导致 Remote-SSH 连接失败。

本文记录一种在 FNOS 上修复用户目录,并为 VSCode Remote-SSH 准备运行环境的方法。

一、本文示例环境说明

为了方便说明,本文使用以下示例信息:

FNOS 用户名:**
FNOS 主机名:**Nas
用户组:Users
目标用户目录:/vol2/1000/home/**

实际操作时,请根据自己的环境替换。

**如果你的 FNOS 用户名不是 ****,请将文中的:

**

替换成你自己的 FNOS 用户名。

**例如你的用户名是 **admin,则把:

/vol2/1000/home/**

改成:

/vol2/1000/home/admin

**如果你的 FNOS 主机名不是 ****Nas,请将文中的:

**Nas

替换成你自己的 FNOS 主机名或 FNOS 的局域网 IP。

例如:

192.168.1.100

**如果你的数据盘路径不是 **/vol2/1000,请将文中的:

/vol2/1000

替换成你自己的 FNOS 数据盘路径。

可以使用下面命令查看常见挂载路径:

df -h

二、问题现象

在 FNOS 上使用某个用户登录 SSH 后,发现用户目录存在异常。

执行:

getent passwd **

**其中 **** 需要替换成你自己的 FNOS 用户名。

示例输出:

**:x:1000:1001::/home/**:/bin/bash

可以看到该用户的家目录被设置为:

/home/**

但是在某些 FNOS 环境中,这个目录可能不存在,或者当前用户无法正常写入。

当 VSCode Remote-SSH 尝试连接时,它需要在远程用户目录下创建:

~/.vscode-server

如果用户目录不存在或不可写,就会导致连接失败。

三、确认用户和用户组信息

首先查看当前用户的 UID、GID 和所属用户组。

命令格式:

id 你的用户名

示例:

id **

示例输出:

uid=1000(**) gid=1001(Users) groups=1001(Users),1000(Administrators)

从输出中可以看到:

用户名:**
主用户组:Users

这里需要特别注意,很多 NAS 系统不会给用户创建同名用户组。

也就是说,虽然用户名是:

**

但用户组不一定也是:

**

如果直接执行:

sudo chown -R **:** /home/**

可能会出现:

chown: invalid group: ‘**:**’

**这是因为系统里没有名为 **** 的用户组。

**正确做法是根据 **id 用户名 的输出,找到用户的主用户组。

例如这里的主用户组是:

Users

那么后续就应该使用:

**:Users

**如果你的用户名是 **admin,主用户组是 Users,则应该使用:

admin:Users

**如果你的主用户组不是 **Users,请替换成你自己系统中实际显示的用户组名称。

四、选择新的用户目录位置

对于 FNOS 这类 NAS 系统,建议把用户目录放到数据盘,而不是系统分区。

本文示例目标用户目录为:

/vol2/1000/home/**

其中:

/vol2/1000

是数据盘路径,需要根据自己的 FNOS 实际情况修改。

**

是用户名,需要替换成你自己的 FNOS 用户名。

**如果你的用户名是 **admin,并且数据盘路径也是 /vol2/1000,那么目标用户目录可以写成:

/vol2/1000/home/admin

**如果你的数据盘路径是 **/vol1/1000,用户名是 admin,那么目标用户目录可以写成:

/vol1/1000/home/admin

可以通过下面命令查看自己的磁盘挂载路径:

df -h

五、创建新的用户目录

命令格式如下:

sudo mkdir -p /你的数据盘路径/home/你的用户名
sudo chown -R 你的用户名:你的用户组 /你的数据盘路径/home/你的用户名
sudo chmod 755 /你的数据盘路径/home/你的用户名

本文示例命令:

sudo mkdir -p /vol2/1000/home/**
sudo chown -R **:Users /vol2/1000/home/**
sudo chmod 755 /vol2/1000/home/**

请根据自己的环境替换:

** -> 你的 FNOS 用户名
Users -> 你的用户主组
/vol2/1000 -> 你的数据盘路径

**例如你的用户名是 **admin,用户组是 Users,数据盘路径是 /vol1/1000,则命令应改为:

sudo mkdir -p /vol1/1000/home/admin
sudo chown -R admin:Users /vol1/1000/home/admin
sudo chmod 755 /vol1/1000/home/admin

然后检查目录权限:

ls -ld /vol2/1000/home/**

同样需要把路径替换成你自己的目标用户目录。

示例输出:

drwxr-xr-x+ 2 ** Users 4096 Jun 10 16:39 /vol2/1000/home/**

这里需要重点确认两点:

** Users

表示目录所有者和用户组正确。

drwxr-xr-x

表示目录具备基本访问权限。

六、尝试修改用户 HOME 目录

**一般情况下,可以直接使用 **usermod 修改用户目录。

命令格式:

sudo usermod -d /你的数据盘路径/home/你的用户名 -s /bin/bash 你的用户名

本文示例:

sudo usermod -d /vol2/1000/home/** -s /bin/bash **

请将其中的:

/vol2/1000/home/**

替换成你的目标用户目录。

将:

**

替换成你的 FNOS 用户名。

例如:

sudo usermod -d /vol1/1000/home/admin -s /bin/bash admin

如果执行成功,可以直接跳到第九部分检查结果。

但是如果当前用户正在运行进程,可能会出现如下错误:

usermod: user ** is currently used by process 108973

**这表示该用户当前还有进程正在运行,系统暂时不允许通过 **usermod 修改用户信息。

七、查看当前用户正在运行的进程

切换到 root:

sudo -i

查看指定用户正在运行的进程。

命令格式:

pgrep -u 你的用户名 -a

本文示例:

pgrep -u ** -a

示例输出:

3961 /usr/local/bin/gitea web
108973 /lib/systemd/systemd --user
108974 (sd-pam)
108994 sshd: **@pts/0,pts/1
108995 -bash
108997 /usr/lib/openssh/sftp-server
108998 -bash
109033 top

如果这个用户下不仅有当前 SSH 会话,还有其他服务进程,例如:

/usr/local/bin/gitea web

就不建议直接执行:

pkill -u 用户名

因为这样会结束该用户下的所有进程,可能会影响正在运行的服务。

**更稳妥的方式是手动修改 **/etc/passwd 中的用户目录。

八、使用 vipw 安全修改 /etc/passwd

**推荐使用 **vipw 修改用户信息。

在 root 用户下执行:

vipw

找到类似这一行:

**:x:1000:1001::/home/**:/bin/bash

**这里的 **** 是示例用户名。

将其中的用户目录部分从:

/home/**

修改为你的新用户目录。

本文示例修改为:

/vol2/1000/home/**

修改后的完整行类似:

**:x:1000:1001::/vol2/1000/home/**:/bin/bash

**如果你的用户名是 **admin,目标目录是 /vol1/1000/home/admin,则应类似:

admin:x:1000:1001::/vol1/1000/home/admin:/bin/bash

保存并退出。

vipw 会对 /etc/passwd 进行安全编辑,避免多个进程同时修改用户数据库。

九、如果没有 vipw,可以手动编辑 /etc/passwd

**如果系统中没有 **vipw,也可以使用 nano 手动修改。

建议先备份:

cp /etc/passwd /etc/passwd.bak

然后编辑:

nano /etc/passwd

找到当前用户对应的一行。

示例:

**:x:1000:1001::/home/**:/bin/bash

把原来的家目录:

/home/**

改成新的目标目录。

示例:

**:x:1000:1001::/vol2/1000/home/**:/bin/bash

保存退出。

注意:只修改这一行中的家目录字段,不要随意修改 UID、GID、用户名和 shell 字段。

十、确认修改是否成功

执行:

getent passwd **

**其中 **** 替换成你自己的用户名。

如果输出类似:

**:x:1000:1001::/vol2/1000/home/**:/bin/bash

说明用户目录已经成功修改。

重点确认这一段已经变成你的新用户目录:

/vol2/1000/home/**

十一、重新登录 SSH

退出 root:

exit

再退出当前 SSH 会话:

exit

然后重新连接 FNOS。

如果使用主机名:

ssh **@**Nas

如果使用 IP:

ssh **@192.168.1.100

请将:

**

替换成你的 FNOS 用户名。

将:

**Nas

替换成你的 FNOS 主机名。

将:

192.168.1.100

替换成你的 FNOS 局域网 IP。

十二、检查新的 HOME 是否生效

重新登录后执行:

whoami
echo $HOME
pwd

理想输出类似:

**
/vol2/1000/home/**
/vol2/1000/home/**

**如果你的用户名是 **admin,目标目录是 /vol1/1000/home/admin,则理想输出应类似:

admin
/vol1/1000/home/admin
/vol1/1000/home/admin

**只要 **echo $HOME 显示为你设置的新用户目录,就说明新的 HOME 已经生效。

十三、测试 VSCode Server 目录是否可创建

**VSCode Remote-SSH 会在远程用户目录下创建 **.vscode-server,因此需要手动测试:

mkdir -p ~/.vscode-server
ls -ld ~/.vscode-server

如果没有报错,并且输出路径位于你的新用户目录下,例如:

/vol2/1000/home/**/.vscode-server

说明当前用户已经可以正常写入 VSCode Server 所需目录。

这一步非常关键。

只要下面命令可以正常执行:

mkdir -p ~/.vscode-server

且没有权限错误,VSCode Remote-SSH 的远程目录问题基本就解决了。

十四、Windows 端 SSH 配置建议

在 Windows 上打开 SSH 配置文件:

C:\Users\你的Windows用户名\.ssh\config

添加 FNOS 主机配置。

模板如下:

Host 自定义连接名
    HostName 你的FNOS_IP或主机名
    User 你的FNOS用户名
    Port 22
    ServerAliveInterval 30
    ServerAliveCountMax 3

示例:

Host **Nas
    HostName 192.168.1.100
    User **
    Port 22
    ServerAliveInterval 30
    ServerAliveCountMax 3

其中:

Host **Nas

是你在 VSCode 里看到的连接名称,可以自定义。

HostName 192.168.1.100

需要改成你的 FNOS IP 或主机名。

User **

需要改成你的 FNOS 用户名。

配置完成后,在 VSCode 中执行:

Remote-SSH: Connect to Host...

然后选择你刚才配置的连接名。

十五、VSCode Remote-SSH 设置建议

**如果之前连接失败过,可以在 VSCode 的 **settings.json 中添加以下配置:

{
  "remote.SSH.useLocalServer": false,
  "remote.SSH.remotePlatform": {
    "**Nas": "linux"
  },
  "remote.SSH.serverInstallPath": {
    "**Nas": "/vol2/1000/home/**/.vscode-server"
  }
}

这段配置中有两个地方需要改成你自己的内容。

第一处是连接名:

"**Nas": "linux"

**这里的 ****Nas 要和你 SSH config 里的 Host 名称保持一致。

例如你的 SSH config 是:

Host fnos

那么这里就应该写成:

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

第二处是 VSCode Server 安装路径:

"**Nas": "/vol2/1000/home/**/.vscode-server"

**这里也要把 ****Nas 改成你的 SSH config 连接名,把路径改成你的实际用户目录。

例如:

{
  "remote.SSH.useLocalServer": false,
  "remote.SSH.remotePlatform": {
    "fnos": "linux"
  },
  "remote.SSH.serverInstallPath": {
    "fnos": "/vol1/1000/home/admin/.vscode-server"
  }
}

配置说明:

"remote.SSH.useLocalServer": false

用于关闭本地服务模式,减少 Windows 环境下的兼容问题。

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

用于明确告诉 VSCode,远程主机是 Linux 系统。

"remote.SSH.serverInstallPath": {
  "fnos": "/vol1/1000/home/admin/.vscode-server"
}

用于指定 VSCode Server 安装目录,避免它写入错误路径。

十六、清理旧的 VSCode Server 目录

如果之前连接失败过,可以清理残留目录后重新连接:

rm -rf ~/.vscode-server
rm -rf ~/.vscode-remote

然后重新在 VSCode 中连接 FNOS。

**如果你的 **$HOME 已经正确指向新目录,那么这里的 ~ 就会自动对应你的新用户目录。

十七、完整命令汇总

下面是本次操作中最关键的命令模板。

查看用户信息:

id 你的用户名
getent passwd 你的用户名

创建新的用户目录:

sudo mkdir -p /你的数据盘路径/home/你的用户名
sudo chown -R 你的用户名:你的用户组 /你的数据盘路径/home/你的用户名
sudo chmod 755 /你的数据盘路径/home/你的用户名

查看目录权限:

ls -ld /你的数据盘路径/home/你的用户名

**尝试使用 **usermod 修改用户目录:

sudo usermod -d /你的数据盘路径/home/你的用户名 -s /bin/bash 你的用户名

如果提示用户正在被进程使用,切换 root:

sudo -i

查看该用户进程:

pgrep -u 你的用户名 -a

**使用 **vipw 修改用户目录:

vipw

**将 **/etc/passwd 中该用户的家目录字段从旧路径改成新路径。

例如从:

**:x:1000:1001::/home/**:/bin/bash

改为:

**:x:1000:1001::/vol2/1000/home/**:/bin/bash

检查修改结果:

getent passwd 你的用户名

重新登录后检查:

whoami
echo $HOME
pwd
mkdir -p ~/.vscode-server
ls -ld ~/.vscode-server

十八、总结

本次 VSCode Remote-SSH 连接 FNOS 失败的核心原因是:

远程用户没有正确、可写的 HOME 用户目录

解决思路是:

  1. 确认 FNOS 用户名和用户组;
  2. 在 FNOS 数据盘创建新的用户目录;
  3. 将目录所有者设置为当前用户和对应用户组;
  4. 修改用户的 HOME 路径;
  5. 重新登录 SSH;
  6. **确认 **$HOME 已经指向新目录;
  7. **测试 **.vscode-server 是否可以创建;
  8. 重新使用 VSCode Remote-SSH 连接。

对于 FNOS 这类 NAS 系统,建议将用户目录放在数据盘路径下,例如:

/vol2/1000/home/你的用户名

这样既可以避免占用系统分区,也能保证 VSCode Remote-SSH 有稳定的写入空间。

最终,只要下面命令能够成功执行:

mkdir -p ~/.vscode-server

并且没有权限错误,VSCode Remote-SSH 基本就具备正常连接的条件了。

收藏
送赞
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则