2017-03-14 10 views
0

私は、ssh経由でリモートサーバーにユーザーを追加するスクリプトを持つタスクを実行しようとしています。バッチスクリプトエラー - 予期しないファイルの末尾

はここに私のコードです:ここでadduser.txtファイルが

#!/bin/bash 
#======================================================================================================== 
# This script allows for account creation on a server       | 
# It also performs error handling to ensure that the user doesn't currently exist on the system. | 
# Also provides feedback from the input to verify the entries are correct.    | 
#======================================================================================================== 
while true; do 
    echo -n "Enter username: " 
    read -r username 
    /bin/egrep -i "^${username}:" /etc/passwd 
    if [ $? -eq 0 ]; then 
     echo "User $username already exists. Please check the username and try again." 
    else 
     echo "User $username does not exist. Proceed with account creation." 
     break 
    fi 
done 

adduser "$username" 
if [ $? -gt 0 ]; then 
    echo "Error encountered." 
    exit 1 
fi 

echo -n "Enter password: " 
read -r -s password 
echo "$username:$password" | chpasswd 
echo "Password was succesfully set for $username." 
if [ $? -gt 0 ]; then 
    echo "Error encountered. There was a problem with your entry. Please re-run the script and try again." 
    exit 1 
fi 

usermod -a -G wheel "$username" 
echo "User was succesfully added to the group wheel." 
if [ $? -gt 0 ]; then 
    echo "Error encountered." 
    exit 1 
fi 
echo "Successfully added $username to the system." 

の内容は

@echo off 
setlocal enabledelayedexpansion 

set username=%1 
set password=%2 
for /F "tokens=*" %%a in (Linuxhosts.txt) do (
    ssh -i svcaccount_id_rsa [email protected]%%a 'bash -s' < adduser.txt 
) 

、私はCMDプロンプトを通じて、コードの最初のセットを実行しようとすると、次のエラーが表示されます。

bash: line 41: syntax error: unexpected end of file

私には分かりません。 hello.txtと呼ばれる別のファイルでテストしたところ、うまく動いていたので、テキストファイルなので見えない場所に間隔の問題があるのだろうかと疑問に思っています。

+0

ファイルの末尾に改行を置くとどうなりますか? –

+0

残念ながら、同じ問題が引き続き発生しています。 – ladycoder2098

+0

私はbashスクリプトの行数を数え続けますが、私は40文字しか出ません。 – Squashman

答えて

1

ファイルadduser.txtは、DOS/Windows形式であり、改行文字が改行文字で終わっていて、改行が続くことがわかりました。 Unix(bashを含む)は、行終了記号として単なる改行を想定しているので、改行文字を行のテキストの一部として扱います。この場合、bashは17行目の "done"を有効なキーワードではなく、whileループを終了しない "done [carriage return]"と見なし、 "done"キーワードを探し続けます。ファイルがなくなるまで

(コメントでこれを示唆ためSquashmanの功績によるものです。)あなたはこの問題WindowsからUNIXにファイルを転送する多くを持っている可能性が高いです

。残念ながら、問題を解決するために使用できるツールは、使用しているOSによってかなり異なります。

私はここにいくつかの他の問題があります。 1つは、スクリプトのreadコマンドが、bashがコマンドを読み取っているのと同じソースから読み込もうとしていることです。これはadduser.txtファイルです。したがって、たとえばread -r username実際には、バッチスクリプトを実行しているユーザからではなく、スクリプトファイルから後の行を読むことになります。これはあなたがそれをやっているやり方を解決するのが非常に難しいでしょう。実際には、スクリプトファイルをUNIXシステムにコピーして別々に実行する方がはるかに良いと思います。 Socowiはコメントで指摘したように

また、$?は次のようにセクションになるよう、を実行最後のコマンドの終了ステータスを取得します。

echo "$username:$password" | chpasswd 
echo "Password was succesfully set for $username." 
if [ $? -gt 0 ]; then 
    ... 

if条件はの終了ステータスをチェックしていますコマンドecho "Password was succesfully set for $username."ではなく、chpasswdコマンドを使用します。後でusermodコマンドにも同じ問題が発生します。これを行うには良い方法は、あなたがif条件として直接の成功のために確認したいコマンドを使用することです:

if echo "$username:$password" | chpasswd; then 
    echo "Password was succesfully set for $username." 
else 
    echo "Error encountered. There was a problem with your entry. Please re-run the script and try again." 
    exit 1 
fi 

私はあなたが終了ステータスをチェックしている場所の全てにこれと同じ形式を使用したいです: egrep,useradd,chpasswdおよびusermodのコマンドがある。

[更新]キャリッジリターンの問題を解決するには、最初にファイルをtr -d "\r"にパイプして、クイックアンドダーティCRリムーバーとすることができます(ただし、バッチ処理とbashの両方のコマンド処理で、引用符で囲んだりエスケープしたりして\rにする必要があります。次に、ユーザー名とパスワードをスクリプトの引数として引数として渡します。そこではないであろうから、代わりにreadコマンド(ともifにそのwhileループを変更するのでusername="$1"; password="$2"を使用するようにadduser.txtを変更...

ssh -i svcaccount_id_rsa [email protected]%%a 'tr -d "\r" | bash -s "username" "password"' < adduser.txt 

:したがって、あなたのバッチスクリプトは、このようなものを使用します別のユーザー名でもう一度試してみることもできます)。

+0

時間をかけてこのことを書いていただきありがとうございます。通常、私はそう言うでしょう、スクリプトをボックスに入れて、それをボックスから実行するのが最も理にかなっています。 しかし、これを回避しようとしています。たとえば、コードの葉を書いた人が何らかの理由でそれを更新する必要があるとしましょう。それが約40の異なるボックスに相当するすべてのサーバー上にある場合です。つまり、40回更新する必要があります。だから、代わりにセントラルリポジトリを使用することにしました。これは、サーバー上のウィンドウベースの共有になります。 – ladycoder2098

+0

@ ladycoder2098問題を回避するための提案がいくつか追加されました。 –

+0

私は更新されたコードを試しましたが、私にはまだエラーが出ています。しかし、私はそれを少し編集して、それがうまくいくかどうかを調べるつもりです。 – ladycoder2098

関連する問題