The main issue in your code is that $?
is expanded before ssh
is called. This is due to quoting. All expansions in a double-quoted string are expanded before the string is used. In addition to that, the double-quoted string that you are using with ssh
contains other double-quoted sections. These sections would be unquoted, just like the substring abc
is unquoted in "123"abc"456"
.
Instead of trying to execute a complicated command on the remote host, just let the ssh
command cat
the passwd
file, then grep
that:
if ssh -n "sandeep@$ipaddress" cat /etc/passwd | grep -q -F -e "$userid" then echo "User exists" else echo "User does not exist" fi >>"/tmp/userfind_$DATE.txt"
Also, consider reading from the user and server list using a while loop instead:
while IFS= read -r userid; do # ... done </home/sandeep/Project_finduser01/userslist
You may also redirect the outermost loop to your output file instead of redirecting every single echo
:
while ...; do while ...; do # stuff done <userlist done <serverlist >"/tmp/userfind_$DATE.txt"
If your user list is long, you may want to only get the passwd
from the remote host once, and then query that several times
while ...; do scp "sandeep@$ipaddress:/etc/passwd" passwd.tmp while ...; do if grep -q -F -e "$userid" passwd.tmp; then # exists fi done <userlist done <serverlist >"/tmp/userfind_$DATE.txt"
Even more efficiently would be to read the user list into an awk
array and then match the usernames from the passwd
file against them. That would get rid of the innermost loop entirely.
The username is found in a particular field in the passwd
file. With your approach, you would match both marc
and marco
if you searched for marc
. To match a bit more carefully, consider using a pattern such as "^$userid:"
instead of matching against the whole line (and drop the -F
that I introduced above if you're still using grep
to do this).
You may also avoid the parsing of the passwd
file completely with
getent passwd "$userid" >/dev/null
This returns a zero exit code (success) if the user exists and non-zero otherwise.
I.e.,
if ssh -n "sandeep@$ipaddress" getent passwd "$userid" >/dev/null then # exists else # does not exist fi
This would do one ssh
call against the remote host per user though. This could be made a bit more efficient by not closing the connection between each call (the below would keep the connection open for one minute):
if ssh -n -o ControlMaster=auto -o ControlPersist=1m "sandeep@$ipaddress" getent passwd "$userid" >/dev/null then # exists else # does not exist fi
"$?"
and the other things that you quote within the command you execute withssh
).cat /home/sandeepj/Project_finduser01/userslist
' + userid=raj.singh + echo -e '\n' + echo -n raj.singh + ssh -t [email protected] 'grep raj.singh /etc/passwd > /dev/null; if [ 0 = 0 ]; then echo -n ' : User 'exsits > /tmp/status else echo -n ' : User not 'exsits > /tmp/status fi'"
on thegrep
line, and you have an extra"
on the finalfi
line. Look at the syntax highlighting (colors) in your question. Please edit and fix it so you show the exact script you are running.