ユーザーの作成後にホームディレクトリを作成する


68

私はいくつかのユーザーを作成しました:

$ useradd john

また-m、ホームディレクトリを作成し、各ユーザーにスケルトンファイルをコピーするパラメーターを指定するのを忘れていました。今、私はそれをしたい、と私はすべてのユーザーを再作成したくない(もっと簡単な方法がなければならない)。だから、ユーザーディレクトリを作成してスケルトンファイルをコピーする方法はありますか?

ディレクトリを作成し、対応するユーザーにディレクトリを作成し、すべてのスケルトンファイルをコピーして、対応するユーザーにチャネルを作成することを考えました。しかし、useradd -mそのようなコマンドがあれば、ユーザーを再度作成するのではなく、ディレクトリを作成する方が良いでしょう。


これは、多数のユーザーのリストで発生しましたか?
デビッドリックマン

この問題を抱えているユーザーは約10人でした。
cd1

Rahulがあなたの質問に最高の答えを持っていると感じずにはいられません。たぶん、あなたはあなたの受け入れられた答えを再訪すべきですか?

回答:


17

これは馬鹿げたアイデアのように聞こえるかもしれませんが、ユーザーが実際に何もしていない場合は、次のことができます。

cat /etc/passwd | cut -f 1 -d : >/tmp/users.list

次に、/ tmp / users.listを編集して、必要なユーザーのみを含めます。それから:


for i in `cat /tmp/users.list`
do
    userdel $i
    useradd -m $i
done

ただし、多くのRedhatベースのディストリビューションでは、最初のログイン時に新しいホームディレクトリが作成されます。ただし、ディレクトリのある場所が/ etc / passwdで指定されている場合に限ります。

それをテストするには、「su-」を実行し、「正しいこと」を行うかどうかを確認します。そうでない場合、上記のスクリプトは非常にうまく機能すると思います。


1
はい、動作しましたが、新しいUIDとGIDを作成しました(しかし、それは問題ではありませんでした)。しかし、/ etc / shadowからパスワードをバックアップするのを忘れたため、ユーザーはパスワードを再度設定する必要があります= /
cd1

最近作成した場合、次のことができるかもしれません。cat / etc / passwd | egrep '^ \:[0-9] {4} \:' | cut -f 1 -d:> /tmp/users.list有効なユーザーのUIDのみを取得し、システムユーザーは取得しません。
デビッドリックマン

パスワードについてはどうですか、同じままですか?怖くない!
数学

for i in $(awk -F: '{print $1 }' /etc/passwd)
ラーフルパティル

なぜgrepを使用するか、猫とパイプを使用してカットしますか?cut -f 1 -d:</ etc / passwd> passwtmp
c4f4t0r

97

また、使用することができます mkhomedir_helper

Usage: /sbin/mkhomedir_helper <username> [<umask> [<skeldir>]]

13
これは、10行のスクリプトなしで実際に質問に答える唯一の答えです。
ブレンダンバード14年

ここでは、これとpamの回答が最高です、ありがとう。回避できる場合は、これらのファイルを手で台無しにしないでください。
h4unt3r 14年

1
DKA @ DEV-04:/ $ / sbinに/ mkhomedir_helper DKA DKA DEV-04 @:/ $のCD bashの場合:cd:/ホーム/ DKA:そのようなファイルやディレクトリ
ディミトリKopriwa

@DimitriKopriwaあなたはそれをルートとして試しましたsudo /sbin/mkhomedir_helper dkaか?/homeディレクトリが属するrootユーザー、およびので、私は1つが、そのサブディレクトリを作成するにはrootでなければならないであろうと想像します。
ジョナサン

15

usersディレクトリを手動で作成する必要があります。これには3つの手順が必要です。

  1. に準拠してディレクトリを作成します/etc/passwd。通常、すでに/ home / loginエントリがあります。
  2. / etc / skelから初期ファイルをコピーします
  3. 最後に、適切な権限を設定します。

    • mkdir /home/YOU
    • cd /home/YOU
    • cp -r /etc/skel/. .
    • chown -R YOU.YOURGROUP .
    • chmod -R go=u,go-w .
    • chmod go= .

ところで:-museradd のオプションもいつも見逃しています。少なくともDebianベースのシステムにはadduserコマンドが必要です。useraddよりもお勧めします。-mオプションを逃しdeluserた場合、適切なオプションを使用してユーザーを再作成することも検討する価値があります。

編集:-rディレクトリもコピーするために追加されました。


それをしました:usernameh = myusername; mkdir / home / $ usernameh; cp / etc / skel / * /etc/skel/.* / home / $ usernameh; chown -R $ usernameh:$ usernameh / home / $ usernameh; chmod -R 755 / home / $ usernameh;
アキ

個人的には、755 chmodが好きではありません。ユーザーが他のユーザーの家を覗き見ることができるからです。各ユーザーは他のユーザーに明示的にアクセスを許可する必要があると思います。以下のようpublic_htmlなニーズに少なくともxビットセット、私が推薦するchmod 0711各家庭で、public_htmlそしてデフォルトと同様のディレクトリ。
数学

また、skelにはcp -rを使用します。そうしないと、ディレクトリ(.ssh)がコピーされません。
アキ

私のシステム(ARM上のArch Linux)はcp -r /etc/skel/.*/ etc /に再帰的に戻り、ここからすべてのデータをコピーします(/etc/skel/.*は/ etc / skel /。と一致します。ソリューションsuperuser.com/a/61619/22153が動作しています。cp -rは/ etc / skelの/ホーム/ユーザー(/ホーム/ユーザーがコマンドを実行する前に存在していなければなりません)
zpon

シェルのグロビングは(ドット)で拡大する*と思います.。だから、..一致しています。私は正しいですか?このような動作のため、多くのシェルはデフォルトでこれを無効にします。どのシェルを使用しますか?
数学

14
mkdir -p /home/john
chown john:john /home/john
usermod -d /home/john john

それは私が信じているトリックを行う必要があります


2
それは言う:usermod: no changes。ディレクトリは作成されません。-mオプションでも機能しません。
cd1

1
わかった。なぜそれが機能しなかったのかを見つけました。useraddは、特に指定しない限り、/ HOMEに$ HOME_DIRを置くだけでした。代わりに/ home / $ USERに自動的に配置されるようになりました。安価な方法は、usermod -d / home / john2 -m johnを実行してから、usermod -d / home / john -mを実行することです。
デビッドリックマン

それが機能しないことを決して気にしないでください。
デビッドリックマン

1
少なくともあなたは何か新しいことを学びました。
デビッドリックマン

1
それらの新しいファイルのために/ etc / skel / + chown recursiveの内容をコピーするのを忘れました。ここではディレクトリが登録されているが作成されていないため、usermodは機能しません。usermodは何もしません。
アキ

9

pam_mkhomedirのようなものを使用して、今後これがユーザーの問題になるのを防ぐことができます。pam_mkhomedirは、ログイン時にユーザーのホームディレクトリが存在しない場合に自動的に作成し、/ etc / skel(または指定した任意のskelディレクトリ)からファイルを取り込むPAMモジュールです。

これは、ユーザーリポジトリを将来LDAPなどのディレクトリサービスに切り替えた場合にもこの問題を解決し続けるため、スケーラブルなアプローチです。


4

私の場合、ホームボリュームは破損しており、多くのデータは関係ないため、ゼロから再構築することにしましたが、ユーザーのログイン情報を保持したいので、このスクリプトを使用してホームディレクトリを手動で再作成しました。

#!/bin/bash
cat /etc/passwd | while IFS=: read n x i g c d r
do
  # my system has uid started at 1000, but has nfsnobody at 65534:
  if [[ "$i" -ge 1000 && "$i" -le 65000 && ! -x "$d" ]]
  then
    cp -av /etc/skel "$d"
    chown -R "$i:$g" "$d"
    # may needed in SELinux system:
    restorecon -R "$d"
    # add your chmod as your need:
    chmod -R o-rw "$d"
  fi
done

2

/etc/login.defs含むように編集する場合

CREATE_HOME yes

その後、システムにそうしないように指示しない限り、将来のユーザーのためにホームディレクトリが自動的に作成されます。

別のオプションは、ログインにPAMを使用し、pam_mkhomedirモジュールを使用して、最初のログイン時にhomedirを自動的に作成することです。


0

をした後の私の最初のステップuseraddは、su - <user>です。

ホームディレクトリの作成、スケルトンのコピーなど-少なくともCentOS 4のボックスでは、最も頻繁に行います。


0

ユーザーjohnでログインし、シェルから書き込みます。

xdg-user-dirs-update

それでおしまい!sudoまたはsuを使用しないでください。いくつかのディレクトリを作成するのにルートアクセスは必要ありません。ルートアカウントから、次を使用できます。

sudo -u john xdg-user-dirs-update

この方法では、コマンドをjohnとして実行します。複数のユーザーで間違えた場合に便利です。


-1

これはまさにmkhomedir_helper $USERNAMEコマンドが行うことです。


1
2年前にすでに説明した別の回答を繰り返しても、価値はありません。
カスペルド

-2

/ etc / passwdを編集するだけです。最後から2番目のフィールドは、ユーザーのホームディレクトリです。

greeblesnort:x:1000:1000:greeblesnort,,,:/home/greeblesnort:/bin/bash

ユーザーはすでに作成されています。ホームディレクトリは、スイッチを忘れたため作成されませんでした。
デビッドリックマン

ユーザーのホームディレクトリを変更するつもりはありませんでした。ディレクトリを作成し、ユーザーが追加された後に適切な権限でスケルトンファイルをコピーするつもりでした。
cd1

-2
usermod -d /home/john john

または

usermod --home /home/john john

読んで

man usermod

;)


2
質問はそれよりも複雑です-すでにより良い答えがあります。
エサヨキネン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.