[CentOS] Bash scripting - Remotely ran commands break while loop

Fri Feb 3 11:45:53 UTC 2012
Marc Deop <damnshock at gmail.com>

On Wednesday 01 February 2012 19:03:33 Peter Blajev wrote:
> On Wed, Feb 1, 2012 at 2:53 PM, Stephen Harris <lists at spuddy.org> wrote:
> 
> > On Wed, Feb 01, 2012 at 01:07:31PM -0800, Peter Blajev wrote:
> > > echo " server2
> > > server2" | \
> > > while read confLine; do
> > >      echo "--> $confLine"
> > >      ssh peter@$confLine ls
> > >      echo "--> END $confLine"
> > > done
> >
> > > The "for" loop in the script above will run twice but the "while" loop
> > > below it will run only once.
> >
> > > Any idea what would cause the ssh command to break the while loop?
> >
> > "ssh" is reading from stdin and passing the data over to the remote
> > machine.  You can test this with
> >  ssh peter@$confLine 'read x ; echo we got $x'
> >
> > To stop it doing this, use the "-n" flag
> >  ssh -n peter@$confLine ls
> 
> 
> This is it. Right on Stephen. Thank you very much. I can't believe I've
> gone so long without knowing it.
> 
> This works for me. I still don't have full understanding of it but I'll do
> some more reading.
> 
> Unfortunately I can't always use the (-n) option. If I wan't to send data
> through the pipe then the (-n) won't work. For example (on top of my head):
>   mysqldump dB | ssh peter at remoteServer "mysql dB"
> 
> In my script I ended up using "ssh -n" when I want to work on the output of
> remotely ran command and "ssh" without (-n) when I want to send data over
> ssh to a remote command.
> 
> This so far is not breaking the while loop and it seems to be working but
> it makes me nervous.
> 

Curious I found this very same problem some days ago and wrote about it in my blog hehe :)

All the options you have described in the thread will usually work but I suggest you to think about another option. Make the while read from another file descriptor as in:

while read <&3 line; do
    ......
done 3< file

And why this? because not only ssh reads from standard input but others like ffmpeg do as well(and probably more...)

Regards,

Marc Deop