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 "$@"