2

I'm trying to automate a server update process. What this should do is check for git diff files and list them, to later be copied from one place to the other.

Here's my script on my local machine:

update_frontend.sh

#!/bin/sh
ssh [login details] -t -t 'bash -s' < ~/Scripts/update_frontend_cmd.sh

update_frontend_cmd.sh

SOURCE=/var/www/git_front/mydir_front
TARGET=/var/www/front
dothis=

cd "$SOURCE"
for i in $(git diff --name-only origin/master master)
    do
    x=`echo $i | sed 's/mydir\///'`
        dothis=`echo "
$dothis
cp './mydir/$x' '$TARGET/$x'"`
    done

git pull
eval $dothis

Problem is, after any first input from me (be it login for git pull, or if I remove it, any other command I try to execute) causes the shell to hang. I just get a blank line an infinite waiting. Any idea what's causing this?

4
  • 2
    For starters, add set -x to the top of your script to trace its execution and to see where it stops.You shouldn't use single quotes around variables like $x because then they will be literally expanded to $x not the value of x.
    – user13742
    Commented Jun 10, 2013 at 15:02
  • The script runs entirely - when it's done I'm thrown to the shell, and then any input causes a hang. Entering the shell manually with ssh doesn't cause the hang. As for the single quotes, notice it's part of a multiline string that starts a bit higher, which is in double quotes. The string output is fine when I test it.
    – casraf
    Commented Jun 10, 2013 at 15:05
  • What exactly do you mean by "any first input from me"? Commented Jun 10, 2013 at 16:14
  • I mean as a shell would expect keyboard input, I input any command and as soon as I hit enter that's it. But it doesn't execute.
    – casraf
    Commented Jun 11, 2013 at 7:09

3 Answers 3

2

After your update_frontend_cmd.sh has been processed, you are at the end of the input. ssh does not simple switch back to keyboard input from that.

What you could consider is running a screen session on the remote machine and execute commands in there. Then reconnect once you are done.

A more simple possibility is pushing the script to the server (scp, or better pushing via git) and executing it locally.

1
  • Ended up copying the script to the remote machine.
    – casraf
    Commented Jun 11, 2013 at 7:17
0

Just omit the -t options from ssh invocation, and the session will terminate once EOF is reached on stdin.

1
  • But then I couldn't pass the script properly, I've tried before.
    – casraf
    Commented Jun 11, 2013 at 13:30
0

This works for me:

( echo 'echo yes'; echo 'exit') | ssh me@localhost -t -t 'bash -s'

Try replacing the echo 'echo yes' with your cat.

Meow.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .