2016-05-04 5 views
-1

次のコードは、bashスクリプトを使用してユーザープロファイルを作成するためのコードです(私は完全な初心者です)。私のコードの問題。読み込み-pを使用して入力を取るときに、変数に「not valid identifier」というエラーが表示されます。また、「構文エラー:予期しないファイルの終了」というエラーが表示されているため、ファイルの終了に問題があります。* BASH * "無効な識別子"と "構文エラー:EOF"

read -p "Please enter a username : " username 
read -p "Please enter a password : " password 
egrep "^$username" /etc/passwd >/dev/null 
if [ $? == 0 ]; then 
    echo "$username already exists!" 
    exit 1 
else 
    pass=$(perl -e 'print crypt($ARGV[0], "password")' $password) 
    useradd -m -p $pass $password 
    [ $? == 0 ] && echo "User had been succesfully created and added to system group" || echo "Failed to create and add user to system group" 
    exit 2 
fi 

ありがとうございます!

+2

は-e'設定 '使用してみてください。また、 '#!/ bin/bash'はこれがbashとして正しく動作しているので、疑問もありません。ときどき他のインタプリタが奇妙な副作用を持つことがあります –

+0

代わりにechoとreadを使用して、[ここ](http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_08_02.html)の例を試してみてください。これはread -pを使ったものかもしれません。または、useraddを使用してユーザーを配置しようとするとエラーが表示されますか? – Caperneoignis

+0

echoとreadを使用してもエラーが発生します。 – XWelsch

答えて

0

いくつかの注意事項:

  1. egrep
  2. コメント(およびmanページ)の出力を抑制するhashbang
  3. 使用-qフラグを追加することを忘れないでくださいcryptとパスワードを暗号化することはないかもしれないことを示唆していますそのような明るい考え。代わりに、ユーザー

-pフラグに関して持つuseraddのmanページのパスワードを追加するためのシステムpasswdを使用します。

Note: This option is not recommended because the password (or encrypted password) will be visible by users listing the processes.

You should make sure the password respects the system's password policy.

私はあなたの主な問題は、ユーザー名と暗号化されていないパスワードを渡していたと思いuseraddコマンドに、次のような作品:

#!/bin/bash 
read -r -p "Please enter a username : " username 
egrep -q "^$username" /etc/passwd 
if [[ $? -eq 0 ]]; then 
    printf "\n%s already exists!\n" "$username" 
    exit 1 
else 
    useradd -m "$username" && passwd "$username" 
    if [ $? == 0 ]; then 
     printf "\nUser had been succesfully created and added to system group\n" 
    else 
     printf "\nFailed to create and add user to system group\n" 
     exit 2 
    fi 
fi 
+1

非常に限定された値の "Works"のみ。スペースやダッシュで始まるパスワード、またはローカルのPAM設定がperlの 'crypt()'とは異なるハッシュアルゴリズムを使用するシステムでパスワードを試してください。 –

+0

...また、 'foo && bar || baz'は三項演算子ではなく、一つとして使うべきではありません。その意味は** fooならば**と同じではありません。その後バー。それ以外はbaz。 fi'。 'bar'が失敗するとどうなるかを見てください。たとえば、stdoutが閉じられている場合など、' printf'でも起こります。 (あなたの最初の文字は 'printg'とタイプされているので、ここで*常に*起こります) –

+0

また、ユーザ名に正規表現文字が含まれているとどうなるかを見てください。例えば'それらは1文字のワイルドカードとして扱われるので、他のユーザの名前は 'egrep'にマッチすることができます。 –

関連する問題