Skip to content

用户管理

新服务器创建用户

导出用户信息

为了给新服务器创建用户,需要从已有服务器上导出 /etc/passwd/etc/shadow/etc/group。以及,若新机器提供 ssh 直连,那么还需要导出各用户的 ssh 公钥信息。

在 Debian Linux 上(如 Ubuntu),只有 1000~59999 的 uid 可以分配给普通用户。因此为了导出 /etc/passwd 中的普通用户部分,可以使用如下命令:

awk -F: ' ($3>=1000) && ($3<60000)' /etc/passwd > passwd.txt

但在 ada-709 服务器上,uid 为 1000 的账户 ada-709 是管理账号,无需在新服务器上创建;此外,ada-709 上 munge 这个软件使用了 1010 的 uid,非常奇怪,也要特殊处理。因此,如果要进行用户迁移,还需查看一下,导出的用户里面有没有奇怪的东西。可以通过运行 pwck -s/etc/passwd 文件排序,方便查看。

在 709 服务器上运行 /root/script/export_users.sh,将输出的目录 /root/script/move 移动到新服务器能访问的地方。

新建用户

如果该服务器允许用户直连,建议直接在 /etc/skel 中创建 .ssh/authorized_keys 文件 ,方便后续创建用户时家目录自带这个文件,并且如果是通过 useradd -m 命令创建的用户,家目录下文件权限不用自己修改。

通过脚本 /root/script/import_users.sh(从 ada709 上拷贝一份),将完成如下任务:

  1. 自动创建 /etc/skel/.ssh/authorized_keys
  2. 将 passwd shadow 和 group 信息追加到新服务器上
  3. 为用户创建家目录
  4. 复制对应的公钥给该用户(如果使用import_users_with_ssh.sh
  5. 将每个用户加入 docker 组,请确保在执行脚本前,已经安装docker,否则将需要自己手动将所有用户加入 docker 组

修改 ada-709 上创建新用户的脚本

ada-709 的公钥放到新服务器的 /root/.ssh/authorized_keys 中:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEg06LguxpXd7gJFYJWe8TFJuOy73EHLsM0kQM5hPdAU root@ada-709

然后修改 ada-709/root/script/ada-adduser.sh 脚本,如下示例的格式,在后面加上新服务器的命令,如果新服务器允许直连,则使用 $CMD_SSH,否则使用 $CMD

     # add user at other servers
     ssh ada-A100 "$CMD"
     ssh ada-server -p 3790 "$CMD"
     ssh ada-mix "$CMD_SSH"
     ssh ada-4090 "$CMD"

附录

export_users.sh

#!/bin/bash

cd "$(dirname $0)"
mkdir -p move
awk -F: ' ($3>1000) && ($3<60000) && ($6!="/nonexistent")' /etc/passwd > move/passwd.txt
awk -F: '{print $4}' move/passwd.txt | grep -f - /etc/group > move/group.txt
awk -F: '{print $1}' move/passwd.txt | grep -f - /etc/shadow > move/shadow.txt

# copy ssh publickey
mkdir -p move/ssh
for uname in $(awk -F: '{print $1}' move/passwd.txt); do
        cp /home/$uname/.ssh/authorized_keys move/ssh/$uname-ssh-key
done

import_users.sh

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage: $0 move_path" >&2
  exit 1
fi
MOVE_DIR=$1

# 创建 /etc/skel/.ssh/authorized_keys
mkdir -p /etc/skel/.ssh
touch /etc/skel/.ssh/authorized_keys
chmod 700 /etc/skel/.ssh
chmod 600 /etc/skel/.ssh/authorized_keys

# 拷贝用户信息
for name in passwd shadow group; do
  cat "$MOVE_DIR/$name.txt" >> /etc/$name
done

# 创建用户家目录
USER_NAMES=($(awk -F: '{print $1}' $MOVE_DIR/passwd.txt))
for user in "${USER_NAMES[@]}"; do
  home_dir="/home/$user"
  mkdir -p "$home_dir"
  rsync -a /etc/skel/ "$home_dir"
  chown -R "$user": "$home_dir"
done

# 将所有用户加入 docker 组
if [ $(getent group docker) ]; then
  gpasswd -M $(echo "${USER_NAMES[*]}" | sed 's/ /,/g') docker
fi

import_users_with_ssh.sh

#!/bin/bash

if [ $# -ne 1 ]; then
  echo "Usage: $0 move_path" >&2
  exit 1
fi
MOVE_DIR=$1

# 创建 /etc/skel/.ssh/authorized_keys
mkdir -p /etc/skel/.ssh
touch /etc/skel/.ssh/authorized_keys
chmod 700 /etc/skel/.ssh
chmod 600 /etc/skel/.ssh/authorized_keys

# 拷贝用户信息
for name in passwd shadow group; do
  cat "$MOVE_DIR/$name.txt" >> /etc/$name
done

# 创建用户家目录,以及拷贝公钥
USER_NAMES=($(awk -F: '{print $1}' $MOVE_DIR/passwd.txt))
for user in "${USER_NAMES[@]}"; do
  home_dir="/home/$user"
  mkdir -p "$home_dir"
  rsync -a /etc/skel/ "$home_dir"
  ssh_key_file="$MOVE_DIR/ssh/${user}-ssh-key"
  if [ -f "$ssh_key_file" ]; then
    cp "$MOVE_DIR/ssh/${user}-ssh-key" "$home_dir/.ssh/authorized_keys"
  fi
  chown -R "$user": "$home_dir"
done

# 将所有用户加入 docker 组
if [ $(getent group docker) ]; then
  gpasswd -M $(echo "${USER_NAMES[*]}" | sed 's/ /,/g') docker
fi