KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

NISユーザのホームディレクトリを変更するスクリプト

登録日 :2025/07/03 05:00
カテゴリ :Linux

既存のホームディレクトリを新しいホームディレクトリに作成する。対象者はファイルで読み込む。コピーするのは、隠しファイルのみ。

copy-home-from-list.sh

#!/bin/bash

#
# date: 2025.07.03
# ver : 1.0
# created by N. Tagawa
#

# ユーザ存在チェック&既存ホーム取得
# check nis user & get old home
get_old_home() {
  local user="$1"
  local old_home
  old_home=$(ypcat passwd | grep "^${user}:" | cut -d: -f6)
  if [ -z "$old_home" ]; then
    echo "User $user not found in NIS passwd map." >&2
    return 1
  fi
  echo "$old_home"
}

# 新ホーム作成&属性引き継ぎ
# Create New Home Directory & Inherit Attributes
create_new_home() {
  local old_home="$1"
  local new_home="$2"
  if [ ! -d "$new_home" ]; then
    mkdir -p "$new_home"
    local perm owner group
    perm=$(stat -c %a "$old_home")
    owner=$(stat -c %u "$old_home")
    group=$(stat -c %g "$old_home")
    chmod "$perm" "$new_home"
    chown "$owner":"$group" "$new_home"
  fi
}

# ドットファイルのみコピー
# Copy only hidden files (dotfiles)
copy_dotfiles() {
  local old_home="$1"
  local new_home="$2"
  shopt -s dotglob nullglob
  for file in "$old_home"/.*; do
    local basefile
    basefile=$(basename "$file")
    if [[ "$basefile" != "." && "$basefile" != ".." ]]; then
      if [ -f "$file" ]; then
        cp -p "$file" "$new_home/"
      fi
    fi
  done
  shopt -u dotglob nullglob
}

# ホームディレクトリ変更
# change home dir
change_home() {
  local new_home="$1"
  local user="$2"
  local current_home
  current_home=$(ypcat passwd | grep "^${user}:" | cut -d: -f6)
  if [ "$current_home" = "$new_home" ]; then
    echo "$user's home directory is already set to $new_home. Skipping."
    return 1
  fi
  usermod -d "$new_home" "$user"
}

# NISマップ更新
# update nis map
update_ypmap() {
  cd /var/yp && sudo make
}

# メイン処理
#
# main
#
main() {
  local DEST_HOME_BASE="/SThome"

  if [ $# -ne 1 ]; then
    echo "Usage: $0 userlist.txt"
    exit 1
  fi

  local userlist="$1"
  if [ ! -f "$userlist" ]; then
    echo "User list file not found: $userlist"
    exit 1
  fi

  while IFS= read -r user || [ -n "$user" ]; do
    # 空行やコメントはスキップ
    # blank or comment is skipped.
    [[ -z "$user" || "$user" =~ ^# ]] && continue

    echo "=== $user copy start ==="
    old_home=$(get_old_home "$user") || { echo "Skip $user"; continue; }
    #new_home="/SThome/${user}"
    new_home="${DEST_HOME_BASE}/${user}"

    if [ -d "$new_home" ]; then
      echo "$new_home already exists。$user is skipped."
      continue
    fi

    create_new_home "$old_home" "$new_home"
    copy_dotfiles "$old_home" "$new_home"
    #change_home "$new_home" "$user"
    echo "=== $user copy end ==="
  done < "$userlist"

  #update_ypmap

  echo "Finish to copy all users from userlist.txt"
}

#main "$@"
main "userlist.txt"

ユーザ名を指定して、ホームディレクトリを変更するスクリプト
change-home.sh

#!/bin/bash

#
# date: 2025.07.03
# ver : 1.0
# created by N. Tagawa
#

# change home
change_home() {
  local new_home="$1"
  local user="$2"
  local current_home
  current_home=$(ypcat passwd | grep "^${user}:" | cut -d: -f6)
  if [ "$current_home" = "$new_home" ]; then
    echo "$user's home directory is already set to $new_home. Skipping."
    return 1
  fi
  usermod -d "$new_home" "$user"
}

# update nis map
update_ypmap() {
  cd /var/yp && sudo make
}

#
# main
#
main() {
  local DEST_HOME_BASE="/SThome"

  if [ $# -ne 1 ]; then
    echo "Usage: $0 username"
    exit 1
  fi

  user="$1"
  echo "=== $user copy start ==="
  new_home="${DEST_HOME_BASE}/${user}"

  if [ ! -d "$new_home" ]; then
    echo "$new_home does not exist. Exiting."
    exit 1
  fi

  # 既存ホームディレクトリの取得
  current_home=$(ypcat passwd | grep "^${user}:" | cut -d: -f6)

  echo "Current home directory for $user: $current_home"
  echo "New home directory will be: $new_home"
  echo -n "Do you want to change the home directory? (y/N): "
  read answer
  case "$answer" in
    [yY]|[yY][eE][sS])
      change_home "$new_home" "$user"
      update_ypmap
      ;;
    *)
      echo "Home directory change for $user was cancelled."
      ;;
  esac

  echo "Finish to change home"
}
main "$@"