.csvファイルからユーザー2を作成する

.csvファイルからユーザー2を作成する

私は自分の台本を作るために多くの努力をした学生です。一般的に言えば、提供された情報と規則によれば、爆発的なスクリプトキディーイングを実行し、他の人が実行するアクションに追加できます(例えば、自分が恥ずかしいことを知っています)。しかし、bash / pythonを使用しようとしたとき、私は何年もの間私の命を救うために最初から何かを作成するために必要な脳能力がないことが明らかになりました。だから私はここにいます。 4年前に同様のトピックに関する投稿があり、それが私が達成したいことへの正しい道をたどっているようです。しかし、私の人生では、私がどこに間違っているのかわからないようです。以下はjesse_bに感謝したいスクリプトです。使用する必要があるパラメータに触れましたが、残念ながらスクリプトを実行すると、スクリプトにあると思われる項目のマニュアルページが表示されます(たぶんuseradd?)。誰もが私を保護し、建設的なフィードバックを提供できる場合は非常に感謝します。

#! /usr/bin/bash

MY_INPUT='Newbies.csv'
declare -a A_SURNAME
declare -a A_FIRST
declare -a A_USERNAME
declare -a A_GROUP
declare -a A_SECGROUP
declare -a A_COMMENTS
while IFS=, read -r COL1 COL2 COL3 COL4 COL5 COL6 TRASH; do
    A_SURNAME+=("$COL1")
    A_FIRST+=("$COL2")
    A_USERNAME+=("$COL3")
    A_GROUP+=("$COL4")
    A_SECGROUP+=("$COL5")
    A_COMMENTS+=("$COL6")
done <"$MY_INPUT"

for index in "${!A_USERNAME[@]}"; do
    useradd -g "${A_GROUP[$index]}" -G "${A_SECGROUP[$index]}" -c "${A_COMMENTS[$index]}"

done

パラメータ例ここに画像の説明を入力してください。:姓、名前、ユーザー名、グループ、secgroup、説明:

Esche,Adlai,aesche,Accounting,Emp,5326,
West,Kaila,kwest,Accounting,Emp,0699,
July,Markos,mjuly,MArketing,Emp,7208,

注投稿リンク:.csvファイルからユーザーを作成する

ベストアンサー1

useradd行の末尾にユーザー名を追加するのを忘れただけでなく、状況を必要以上に複雑にしました。

複数の配列変数は必要ありません(CSVデータでより多くの操作を実行したい場合を除く)。後ろにforアカウントはすでに作成されています。それでも、既存のループ内でこれを行うことをお勧めします。またbash、実際にはテキスト処理に巧みな言語(例:awkまたは)の代わりに(テキスト処理に不都合な言語)を使用していますperl

perl1行で目的を達成する方法は次のとおりです。

$ perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
    system("echo","useradd","-g",$group,"-G",$secgroup,"-c",$comments,$username)' Newbies.csv

出力例:

useradd -g Accounting -G Emp -c 5326 aesche
useradd -g Accounting -G Emp -c 0699 kwest
useradd -g MArketing -G Emp -c 7208 mjuly

これはテスト実行で書かれており、内容だ​​けを印刷します。会議実際には、ユーザーアカウントを追加せずにこれを行います。コマンドが正しく生成されたことを確認したら、"echo"コマンドから削除します。system()useradd

Bashとは異なり、Perl関数を使用するときに変数を参照する必要はありません。system() 与えられたリストの各要素は、システムが実行されているプログラムに別々の別の引数として渡されます(この場合、プログラムは、またはecho)をuseradd削除した後のリスト"echo"(スペース文字が含まれていても)。ワイルドカードやその他のシェルメタ文字を渡さないと、シェルは使用されず、system()シェルのトークン化または拡張の影響を受けません。 Perlには、globを拡張したりファイル名でいっぱいになった配列を構築するための独自の組み込みメソッドがあるので、ワイルドカードの転送を避けるのは簡単です。

変数を引用する必要がある唯一のケースは、変数を文字列に結合することです。たとえば、次のコマンドを使用して、GECOSフィールドに名前と姓を追加できます。

$ perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
    system("echo","useradd","-g",$group,"-G",$secgroup,"-c","$first $surname - $comments",$username)' Newbies.csv 

それにもかかわらず、これを行う他の多くの方法があります。たとえば、.接続演算子を使用する場合です。

$first . " " . $surname . " - " . $comments

または以下を使用してくださいjoin()

join(" ",$first,$surname,"-",$comments)

出力例:

useradd -g Accounting -G Emp -c Adlai Esche - 5326 aesche
useradd -g Accounting -G Emp -c Kaila West - 0699 kwest
useradd -g MArketing -G Emp -c Markos July - 7208 mjuly

ここに示されている出力では明確ではありませんが、コメントは実際には次のように書かれています。一つuseraddオプションパラメータ-c。たとえばAdlai Esche - 5326、オプションの単一パラメータ-cいいえ4つの別々の引数、まさに空白文字を含む文字列です。

"echo",各パラメータが別々の行に印刷されるように変更すると、"printf","%s\n",これを確認できます。

$ perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
    system("printf","%s\n","useradd","-g",$group,"-G",$secgroup,"-c","$first $surname - $comments",$username)' Newbies.csv
useradd
-g
Accounting
-G
Emp
-c
Adlai Esche 5326
aesche
...

バージョンはawk非常に似ています。主な違いは、入力をawkフィールド区切り文字(FS変数、デフォルトは空白ですがコンマで設定できます-F,)に基づいて入力を列($ 1、$ 2、$ 3 ....)に自動的に分割することです。一方、awkのシステム機能には以下が必要です。文字列引数なので、shまたはbashの要件と同様に直接引用する必要があります。

Perlには入力を自動的に列に分割する同様のオプションがありますが(名前付き配列に分割)、-F意味のある変数名(代わりに)を使用して@Fコードを読み取るのが簡単です。$group$F[2]


バッシュバージョン:

#!/bin/bash

MY_INPUT='Newbies.csv'

while IFS=, read -r surname first username group secgroup comments; do 
    echo useradd -g "$group" -G "$secgroup" -c "$comments" "$username"
    #echo useradd -g "$group" -G "$secgroup" -c "$first $surname - $comments" "$username"
    #printf "%s\n" useradd -g "$group" -G "$secgroup" -c "$first $surname - $comments" "$username"
done < "$MY_INPUT"

繰り返しますが、これは練習で書かれています。echo実際にユーザーアカウントを作成するには削除してください。 GECOS フィールドに名前と姓を追加する方法を示す注意事項も含まれています。

出力はPerlバージョンと同じです。

useradd -g Accounting -G Emp -c Adlai Esche - 5326 aesche
useradd -g Accounting -G Emp -c Kaila West - 0699 kwest
useradd -g MArketing -G Emp -c Markos July - 7208 mjuly

または:

useradd -g Accounting -G Emp -c Adlai Esche - 5326 aesche
useradd -g Accounting -G Emp -c Kaila West - 0699 kwest
useradd -g MArketing -G Emp -c Markos July - 7208 mjuly

BashとPerlの組み合わせ:

#!/bin/bash

MY_INPUT='Newbies.csv'

perl -lne '($surname,$first,$username,$group,$secgroup,$comments) = split /\s*,\s*/;
    system("echo","useradd","-g",$group,"-G",$secgroup,"-c",$comments,$username)' "$MY_INPUT"

これは、テキスト処理にawkやPerl、またはほとんどすべて(bashを除く)を使用する方が良い理由の良い例を実際に提供しない非常に簡単な作業です。バラよりシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?

しかし、ここでもPerlのバージョンが高速です(作成するアカウントが何千ものものでなければそれほど重要ではありません)。そしてsplit /\s*,\s*/カンマで区切られたフィールドからすべての前後のスペースを削除します。 Perl ではマイナーな操作で、bash ではより多くのタスクを実行します。つまり、入力データを「整理」して、使用する目的に合わせて適切にサービスできるようにします。 Unixのユーザー名とグループ名はスペースで始めることはできません。

おすすめ記事