ファイルサーバーにはまだ使用中のため、AD内の対応するグループと置き換える必要があるLinuxグループがたくさんあります。 ADと/etc/groupsのグループは同じ名前を持っているので、ここではchgrpがあまり役に立たないようです。
私の質問は:Linuxグループの代わりにADのグループを指すようにファイルサーバー上の特定のファイルのグループ所有権を変更する最善の方法は何ですか?
グループ名の代わりにGIDに変えることはできないかと思いましたが、それは災いになりそうです。
ベストアンサー1
chgrp
数値GIDだけでなく、シンボルグループ名も処理できます。あなたの名前が名前グループと正確に一致するかどうかを100%確実にする必要があります。問題を解決する方法によっては、Linux番号がAD番号とまったく異なる範囲にあることを確認したい場合があります。ほとんどのAD管理者は明らかな理由でこれを行いますが、確実に確認してください。その後、chgrp
古いLinux GID番号のすべてのグループ所有権を一度に1グループずつ新しいAD GID番号に再マップできます。しかし、決定的に、若いLinux GID番号とAD GID番号が重複しています。
私はお勧めしますいいえスクリプトで実際の操作を実行します。代わりにchgrp
(長い)コマンド文字列のみを出力するスクリプトを作成してください。これにより、スクリプトに問題が発生しても破損は発生しません。スクリプトをデバッグし、生成されたコマンドを再確認してchgrp
100%正しいことを確認します。見つかったエラーを修正してください。すべてが大丈夫に見える場合は、sリストをchgrp
シェルにパイプします。
UNIX(またはLinux)と同様に、タスクを実行する方法はいくつかあります。各グループを繰り返し、各グループのファイル階層を介して検索を実行できます。グループが多くなく、階層に多くのファイルがない場合は問題ありません。しかし、古いと新しい数字のGIDが必要です。欲しくない重なる。
より効率的なアプローチは、階層を一度だけ検索し、すべてのファイルを一度に1つずつ処理することです。これのもう1つの利点は、名前が100%一致する限り、数字が重なっても問題にならないことです。これを行うには、まず古い数字のLinux GIDを古いシンボルのLinux名(新しいシンボルAD名でもある)にマップするテーブルを作成します。次に、それをバックアップ/etc/group
して編集して、無効にしたいLinuxグループ名を削除します。
これで、GID - >名前マッピングリストを含むファイルと数値GIDを持つが定義されたグループ名を持たない階層のファイルの束があります。
次のことは、ADグループの列挙が正しく機能していることを確認することです(wbinfo
通常はパス)。次の簡単なテスト:
# wbinfo --group-info 'test AD group'
test AD group:x:1597:
# touch /tmp/foo
# chgrp 'test AD group' /tmp/foo
# ls -l /tmp/foo
-rw-r--r-- 1 root test AD group 0 Jun 13 11:06 /tmp/foo
それだけで十分です。私が提供している場合は、存在すること'test AD group'
がわかっているADグループ名を使用する必要があります。グループ名にスペースが含まれている場合は、引用符を使用してください。
次の作業は、階層内の各ファイルを繰り返し、statを使用してそのファイルを見つけることです。数値GID、これはもちろん、廃止予定のLinux GIDです。この数字GIDのシンボルグループ名(例:新しいシンボルAD名chgrp
)ファイルを変更するコマンドを作成します。 ADグループにはスペースが含まれることが多いため、グループ名の前後に引用符を使用する必要があります。これにより、スクリプトは古いGIDを使用し、古い名前を見つけてコマンドを実行してグループをリセットし、古いLinuxグループが新しいADグループとまったく同じGIDを持っているかどうかはもはやfoobar
重要ではありません。farkle
foobar
chgrp
名前でになるfoobar
。
以下は、名前マッピングのGIDを作成する方法に関する提案です。完全にテストされておらず、完全に最適化されていません。これは、問題をより小さく管理しやすい段階に分割する方法を考えるようにするためです。テストまたは最終スクリプトを実行する前に、必ずデータを完全にバックアップしてください。
移行するグループはcups
cas
nagios
次のとおりです。domain users
# getent group cups cas nagios "domain users" | awk -F: '{print $3 " " $1}'
193 cups
1001 cas
445 nagios
715 domain users
次のファイルに保存してください。numeric-gid-map.txt
次に、数値GIDを受け入れ、そのファイルから一致する名前を返す関数をビルドします。
map_gid_to_name() {
grep "^$1 " numeric-gid-map.txt | sed -e "s/[^ ]* //"
}
別の非常に単純な関数はグループ名とファイル名を受け入れ、次のコマンドを出力しますchgrp
。
do_chgrp() {
printf 'chgrp "%s" "%s"\n' "$1" "$2"
}
これらすべてを単一のファイル名を使用できる関数と組み合わせて、stat
数値GIDを照会し、そのグループ名を見つけてchgrp
stdoutにコマンドを作成します。
do_one_file() {
gid=$(stat -f%g "$1")
gname="$(map_gid_to_name $gid)"
do_chgrp "$gname" "$1"
}
残りの唯一のステップは、階層を繰り返し、ファイルを1つずつ関数に渡すことです。
chgrp_one_file.sh:
#!/usr/bin/env bash
map_gid_to_name() {
grep "^$1 " numeric-gid-map.txt | sed -e "s/[^ ]* //"
}
do_chgrp() {
printf 'chgrp "%s" "%s"\n' "$1" "$2"
}
do_one_file() {
gid=$(stat -f%g "$1")
gname="$(map_gid_to_name $gid)"
do_chgrp "$gname" "$1"
}
do_one_file "$1"
chmod
755なので実行可能です。
find /your/path -print0 | xargs -0 -n1 -Ixx ./chgrp_one_file.sh "xx"
もう一度言いますが、これはテストまたは最適化されたふりをしません。これは可能なアプローチの1つに過ぎず、それを改善し、ニーズに合わせて変更する方法の開始点を提供します。