ユーザーが/etc/passwdにあることを確認し、存在する場合はプレフィックスを使用して新しいユーザーを作成します。

ユーザーが/etc/passwdにあることを確認し、存在する場合はプレフィックスを使用して新しいユーザーを作成します。

ここに閉じ込められており、解決策が見つかりませんでした。

ユーザーが /etc/passwd にあることを確認し、そうである場合は、プレフィックス new_the_existed_one を使用して新しいユーザーを作成します。

#!/bin/bash

myuser="/home/yakyak/Desktop/Exercises/newusers.txt"

sed '/^[ \t]*$/d' $myuser | while read -r line
do
        name="$line"
        # adduser --disabled-login --gecos "" $name
        # check if user exist
        isthere=$(cut -d: -f1 /etc/passwd | grep "$name")

        # if user was added then make insert record into log file
        if [[ "$isthere" == "$name" ]]
        then
            echo "User already exist, creating new user.."
            adduser --disabled-login 
        # adduser --disabled-login --gecos " " $name
        fi   
done

ベストアンサー1

#!/bin/bash

NAME_REGEX='^[a-z][-a-z0-9]*$'   # default value for adduser.conf
. /etc/adduser.conf              # "source" it in case local config is different

myuser='/home/yakyak/Desktop/Exercises/newusers.txt'

grep "$NAME_REGEX" "$myuser" | while read -r name; do
  while getent passwd "$name" > /dev/null; do
    name="new_$name"
  done

  # check if $name is > 32 characters
  if [ "${#name}" -gt 32 ] ; then
    echo "username '$name' is too long" > /dev/stderr
  else
    adduser --disabled-login --gecos '' "$name"
  fi
done

sedファイルから空白行を削除するために使用されませんが、無効なユーザー名を除外するためにnewusers.txt使用されます。grepいいえというシェル変数に保存されているパターンと一致します$NAME_REGEXadduser「有効」を定義するには、それと同じ変数名(および正規表現パターン)を使用します。表示man adduser.confと検索NAME_REGEX

$ nameがpasswdデータベースに存在しなくなるまで、$ nameの前に "new_"が追加され続けます。 「user」が存在する場合は「new_user」を試みます。 「new_user」が存在する場合は、「new_new_user」を試みます。それから「new_new_new_user」があります。など。

スクリプトはgetent passwd終了コードを使用しますが、興味だけです。出力は削除されます(/dev/nullにリダイレクトされます)。 getentが0(true)で終了すると、ユーザーが存在するため、もう一度やり直してください。

getentfalseを返すと(つまり、$name存在しない)名前が長すぎるかどうかを確認します。その場合は、エラーメッセージを印刷します。そうでない場合は、実行してくださいadduser

ところで、getentで見られると予想される実際の終了コードは、0ユーザーがすでに存在する場合と2ユーザーが存在しない場合です。場合によっては、getentは別の終了コードを返すことがあります(参考文献を参照)、これはman getentgetentの使用方法(データベース検索やユーザー名の提供など)では不可能です。passwd


少し良いバージョンは、ユーザー名に数字のサフィックスを使用することです。たとえば、ゼロで埋められた3桁の幅の数値フォーマット文字列(たとえば、等)printfと一緒に使用されます。 0で埋めたくない場合は、代わりに0を使用してください。この変数は、処理された各ユーザー名に対して外部whileループでゼロにリセットされます。%03i001002%icount

#!/bin/bash

NAME_REGEX='^[a-z][-a-z0-9]*$'   # default value for adduser.conf
. /etc/adduser.conf              # "source" it in case local config is different

myuser='/home/yakyak/Desktop/Exercises/newusers.txt'

grep "$NAME_REGEX" "$myuser" | while read -r user; do
  name="$user"
  count=0

  while getent passwd "$name" > /dev/null; do
    let count+=1
    name="$(printf "%s%03i" "$user" "$count")"
  done

  # check if $user is > 32 characters
  if [ "${#name}" -gt 32 ] ; then
    echo "username '$name' is too long" > /dev/stderr
  else
    adduser --disabled-login --gecos '' "$name"
  fi
done

このバージョンでは、ユーザー名に2つの変数を使用します。つまり、$usernewusers.txt ファイルから読み取った名前と、$name使用したい現在のユーザー名についてです。 $ nameは最初に$ userからコピーされ、内部whileループは変数を増やして追加して$counttrueを$user返すことによって$ nameを更新しますgetent


結局のところ、上記のどれも特に良いスクリプトではありません。彼らがすることは最小限です。個人的には、私はbashではなくperlで書くことを好みます。シェルでのテキスト処理はPITAです。

おすすめ記事