实现以下功能:

  1. 多用户SSH访问:允许多个用户通过SSH远程登录服务器。每个用户使用自己的凭证登录,支持安全认证(如密码或密钥)。

  2. 每个用户独立的home目录(互相隔离):这是Linux系统的默认行为,每个用户都有自己的/home/username目录,其他用户默认无权限访问(权限为700)。可以通过用户组或ACL进一步强化隔离。

  3. 管理员创建Docker容器,每个用户有独立的Docker容器,支持远程SSH连接:管理员(root或sudo用户)创建和管理Docker容器。为每个用户分配一个独立的容器,并在容器内运行SSH服务器,用户可以通过SSH连接到自己的容器(而非主机)。这实现隔离:每个用户的环境独立,避免互相干扰。需要暴露容器的SSH端口到主机,并管理端口映射以避免冲突。容器内可以预装必要的工具。

  4. 用户在Windows下访问文件夹(通过Samba):Samba允许Windows客户端通过SMB协议访问服务器上的共享文件夹。每个用户可以有自己的共享目录,权限控制基于用户组。既然所有机器在同一局域网(LAN),无需公网配置,只需LAN IP访问。

配置流程

1.准备工作

更新系统并安装所需包:

sudo apt update && sudo apt upgrade -y
sudo apt install openssh-server xrdp samba docker.io -y
  • openssh-server:提供SSH服务,默认端口22。

  • xrdp:提供RDP服务,默认端口3389(Windows远程桌面客户端连接)。

  • samba:提供文件共享。

  • docker.io:Ubuntu的Docker包

启动并启用服务:

sudo systemctl enable --now ssh
sudo systemctl enable --now xrdp
sudo systemctl enable --now smbd
sudo systemctl enable --now docker

检查状态:sudo systemctl status ssh xrdp smbd docker。

添加当前用户到Docker组

sudo usermod -aG docker $USER

关闭终端重新打开

防火墙配置(如果启用ufw):

sudo ufw allow ssh  # 22端口
sudo ufw allow 3389/tcp  # XRDP
sudo ufw allow samba  # 139/445端口
sudo ufw reload

2.SSH配置

配置多用户SSH访问和独立Home目录

创建用户:

为每个用户创建账号,每个有独立/home/username

sudo adduser user1  # 创建user1,设置密码
sudo adduser user2  # 同上

配置SSH

编辑/etc/ssh/sshd_config

PermitRootLogin no  # 禁用root SSH
PasswordAuthentication yes  # 允许密码(或no,只用密钥)

重启SSH:

sudo systemctl restart ssh

从其他机器测试SSH:

ssh user1@192.168.1.100

192.168.1.100是ubuntu服务器

3.配置Samba(Windows访问文件夹)

创建共享目录:

为每个用户创建共享文件夹。

sudo mkdir -p /shared/user1 /shared/user2
sudo chown user1:user1 /shared/user1
sudo chown user2:user2 /shared/user2
sudo chmod 755 /shared  # 公共访问,但子目录隔离

添加Samba用户

# 为user1添加Samba密码,按提示输入密码
sudo smbpasswd -a user1

# 为user2添加Samba密码
sudo smbpasswd -a user2

# 确认用户已添加(可选)
sudo pdbedit -L
# 输出应包含:user1:1001: 、user2:1002:(数字是用户UID)

编辑 Samba 配置文件(适配 /shared 目录)

/etc/samba/smb.conf

保留[global]基础配置,在文件末尾添加针对 user1/user2 的共享配置(替换或补充原有内容):

[global]
   workgroup = WORKGROUP  # Windows默认工作组,无需修改
   security = user        # 基于用户认证,核心配置
   map to guest = bad user
   usershare allow guests = no
   create mask = 0644     # 用户创建文件的默认权限
   directory mask = 0755  # 用户创建目录的默认权限
   force create mode = 0644
   force directory mode = 0755

# user1专属共享(映射你创建的/shared/user1)
[user1_share]
   comment = user1 Private Shared Folder
   path = /shared/user1   # 指向你已创建的目录
   valid users = user1    # 仅允许user1访问,核心隔离配置
   browseable = no        # 不在网络邻居列表显示,增强隐私
   writable = yes         # 允许user1读写该目录
   guest ok = no          # 禁止匿名访问
   create mask = 0600     # 确保文件仅user1可读写
   directory mask = 0700  # 确保目录仅user1可操作

# user2专属共享(映射你创建的/shared/user2)
[user2_share]
   comment = user2 Private Shared Folder
   path = /shared/user2
   valid users = user2
   browseable = no
   writable = yes
   guest ok = no
   create mask = 0600
   directory mask = 0700

验证配置语法并重启 Samba 服务

# 检查配置文件语法是否正确(关键!有错误会导致服务启动失败)
sudo testparm

# 若输出“Load smb config files from /etc/samba/smb.conf”且无报错,说明配置正常
# 重启Samba服务生效
sudo systemctl restart smbd nmbd

# 确认服务状态(显示active(running)即正常)
sudo systemctl status smbd

防火墙放行(若启用了 ufw)

# 放行Samba相关端口
sudo ufw allow samba
# 重新加载防火墙规则
sudo ufw reload

Windows 客户端访问验证

  • 打开 Windows 文件资源管理器,在地址栏输入:\\你的Ubuntu服务器IP\user1_share(比如\\192.168.1.100\user1_share);

  • 弹出认证窗口,输入用户名user1和你设置的 Samba 密码;

  • 成功进入后,只能看到/shared/user1目录下的文件,尝试访问\\服务器IP\user2_share会提示权限拒绝(验证隔离性);

  • 同理,用 user2 账号登录只能访问 user2_share。

Docker 配置 ROS1 开发环境(多用户隔离版)

拉取 ROS1 Noetic 基础镜像

# 拉取官方ROS1 Noetic完整镜像(包含开发工具)
docker pull osrf/ros:noetic-desktop-full

构建带 SSH 的 ROS1 镜像

创建Dockerfile(放在管理员目录,如/home/admin/ros1-docker/):

# 基于官方ROS1 Noetic镜像
FROM osrf/ros:noetic-desktop-full

# 避免交互提示
ENV DEBIAN_FRONTEND=noninteractive

# 安装SSH服务(适配用户远程访问)
RUN apt update && apt install -y openssh-server sudo && \
    # 创建SSH运行目录
    mkdir -p /var/run/sshd && \
    # 创建普通用户(以lxj01为例,每个用户容器单独创建)
    useradd -m -s /bin/bash lxj01 && \
    # 设置用户密码(统一设为ros123,也可让用户自行修改)
    echo 'lxj01:ros123' | chpasswd && \
    # 给用户sudo权限(容器内开发需要)
    usermod -aG sudo lxj01 && \
    # 允许root SSH登录(可选,管理员维护用)
    echo 'root:ros123' | chpasswd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    # 清理缓存
    apt clean && rm -rf /var/lib/apt/lists/*

# 初始化ROS环境(自动加载)
RUN echo "source /opt/ros/noetic/setup.bash" >> /home/lxj01/.bashrc && \
    echo "source /opt/ros/noetic/setup.bash" >> /root/.bashrc

# 暴露SSH端口
EXPOSE 22

# 启动SSH服务+ROS环境(后台运行)
CMD ["/usr/sbin/sshd", "-D"]

构建镜像(管理员执行)

cd /home/admin/ros1-docker
docker build -t ros1-noetic-ssh:v1 .

为每个用户创建独立的 ROS1 容器

管理员为 user1、user2 分别创建容器,通过端口映射隔离(复用你之前的端口规则):

# 为user1创建ROS1容器(映射主机2221端口→容器22)
docker run -d --name user1-ros1 -p 2221:22 \
  --privileged=true \  # 赋予容器硬件访问权限(ROS操作外设需要)
  -v /shared/user1/ros_ws:/home/user1/ros_ws \  # 挂载用户共享目录到容器(持久化代码)
  ros1-noetic-ssh:v1

# 为user2创建ROS1容器(映射主机2222端口→容器22)
# 注意:需修改Dockerfile中的用户名为user2,或构建时指定,这里简化为直接创建
docker run -d --name user2-ros1 -p 2222:22 \
  --privileged=true \
  -v /shared/user2/ros_ws:/home/user2/ros_ws \
  ros1-noetic-ssh:v1

用户远程访问自己的 ROS1 容器

用户在 Windows/Linux 客户端通过 SSH 连接容器,即可使用 ROS1 环境:

# user1连接自己的ROS1容器(替换为你的Ubuntu服务器IP)
ssh user1@192.168.1.100 -p 2221
# 密码:ros123

# 登录后验证ROS1环境
roscore  # 启动ROS核心,无报错则环境正常

多用户镜像复用(可选)

# 为user2创建容器时动态创建用户(无需修改Dockerfile)
docker run -d --name user2-ros1 -p 2222:22 \
  --privileged=true \
  -v /shared/user2/ros_ws:/home/user2/ros_ws \
  osrf/ros:noetic-desktop-full \
  /bin/bash -c "apt update && apt install -y openssh-server sudo && \
                useradd -m -s /bin/bash user2 && echo 'user2:ros123' | chpasswd && \
                usermod -aG sudo user2 && mkdir -p /var/run/sshd && \
                echo 'source /opt/ros/noetic/setup.bash' >> /home/user2/.bashrc && \
                /usr/sbin/sshd -D"

容器支持 ROS 图形化界面(可选)

如果用户需要在容器中运行 RViz、Gazebo 等图形化工具,需在创建容器时添加参数:

docker run -d --name lxj01-ros1 -p 2221:22 \
  --privileged=true \
  -v /shared/lxj01/ros_ws:/home/lxj01/ros_ws \
  -v /tmp/.X11-unix:/tmp/.X11-unix \  # 共享X11套接字
  -e DISPLAY=$DISPLAY \  # 传递显示环境变量
  --net=host \  # 共享主机网络(ROS节点通信更方便)
  ros1-noetic-ssh:v1