Loop breaks through ssh in script

hello all,

i have an AIX6.1 machine and INFORMIX 11.7 database server.
i have a script to create users on 3 machines and also i need to grant this user access to a specific database. the script works and it does what i want it to do but the loop doesnt work. for example if i insert 10 lines in my input file to create 10 different users it only executes the first line. i suspect that this should have something to do with ssh cause i really cannot find any other explanation.
here is the script:

while read SEMGROUP SEMBANKDIR COOPUSER DBNAME;
do
 echo " $a Creating user for server machine1 $b "
 if `sudo mkuser pgrp=$SEMGROUP groups="$SEMGROUP" su='false' home=/$SEMBANKDIR/login/$COOPUSER pwdwarntime='3' histexpire='8' maxage='4' minlen='8' minalpha='2' minother='2' maxrepeats='2' gecos=$COOPUSER umask='002' $COOPUSER`
 then
    echo $COOPUSER:$COOPUSER |sudo chpasswd
    cd /$SEMBANKDIR/login/
    sudo chmod -R 771 $COOPUSER
    echo " $a User $COOPUSER created successfully on machine1 $b "
 else
    echo " $a Problem in creating user $COOPUSER on machine1 $b "
 fi

echo "------------------------------------------------------------------"

 echo " $a Creating user for server machine2 $b "
 if `sudo ssh machine2 sudo mkuser pgrp="$SEMGROUP" groups="$SEMGROUP,bank" su='false' login='false' rlogin='false' home=/sem/login/deltausers pwdwarntime='3' histexpire='8' maxage='4' minlen='8' minalpha='2' minother='2' maxrepeats='2' gecos=$COOPUSER umask='002' $COOPUSER`
 then
    sudo ssh machine2 echo $COOPUSER:$COOPUSER |sudo chpasswd
    cd /sem/login/informix/
    $INFORMIXDIR/bin/dbaccess $DBNAME@tcp_semids << q
grant connect to '$COOPUSER';
grant dbpermissions to '$COOPUSER';
grant DEFAULT ROLE dbpermissions to '$COOPUSER';
q
    cd -
    echo " $a User $COOPUSER created successfully on machine2 $b "
 else
    echo " $a Problem in creating user $COOPUSER on machine2 $b "
 fi

echo "---------------------------------------------------------------------"

 echo " $a Creating user for server machine3 $b "
 if `sudo ssh machine3 sudo mkuser pgrp=$SEMGROUP groups="$SEMGROUP" su='false' home=/$SEMBANKDIR/login/$COOPUSER pwdwarntime='3' histexpire='8' maxage='4' minlen='8' minalpha='2' minother='2' maxrepeats='2' gecos=$COOPUSER umask='002' $COOPUSER`
 then
    sudo ssh machine3 echo $COOPUSER:$COOPUSER |sudo chpasswd
    sudo ssh machine3 sudo chmod -R 771 /$SEMBANKDIR/login/$COOPUSER
    echo " $a User $COOPUSER created successfully on machine3 $b "
 else
    echo " $a Problem in creating user $COOPUSER on machine3 $b "
 fi

done

i cannot figure out why the loop is not executed.
any ideas?

thank you

It's the usual problem that ssh reads from stdin - the while-loop's input.
The usual measure: add -n option to ssh!
--
I wonder what the backticks in the if clause are good for - can't you simply omit them?
The risk of the backticks: an arbitrary message on stdout is run as a command.

thank you i will try the -n option to see if it works.
i use the backticks because this way i tell the script if the command inside the backticks executes successfully then proceed. else if the command fails it doesnt get into the if statement.

That's nonsense. The exit status of the command between if and then is always tested - you don't need backticks for that.

i didnt know that.
by the way i tested the script with -n and the loop works!
thanks

No, no and again: no.

First, the "if"-statement:

The if-statement is defined as:

if command ; then commandA ; else commandB ; fi

command can be any command, simple or complex. In either way its return code is used to determine if the then-branch or the else-branch is executed. If the return code ("$?") is 0 (zero), the then-branch is executed, otherwise the else-branch.

The probably most often-used command in this position is /usr/bin/ test or its counterpart /usr/bin/ [ . Both work the same way (the difference being that "[" requires "]" as the last argument): if the tests specified as arguments add up to a boolean TRUE it returns 0, for a boolean FALSE it returns 1.

Still, the same way as you use test you can use any other command. For instance:

if grep -q EXPR /some/file ; then

will execute the then-branch if EXPR is found in /some/file and the else-branch if not, because grep will return 0 if it finds what is searched for and 1 if it doesn't.

Second: the backticks.

Even if you need process substitution (which isn't the case, see above), you should NOT use backticks - not the last 20 years or so. Even ksh88 already had "$(...)" instead of "`...`", which is not only nestable, but also the POSIX-compatible way to enclose a process. Backticks are supported only for one reason: backwards compatibility. There is absolutely no reason to use them any more, because they offer absolutely no advantage over "$(...)", only drawbacks.

I hope this helps.

bakunin