Question

I'm writing a "tool" - a couple of bash scripts - that automate the installation and configuration on each server in a cluster.

The "tool" runs from a primary server. It tars and distributes it's self (via SCP) to every other server and untars the copies via "batch" SSH.

During set-up the tool issues remote commands such as the following from the primary server: echo './run_audit.sh' | ssh host4 'bash -s'. The approach works in many cases, except when there's interactive behavior since standard input is already in use.

Is there a way to run remote bash scripts interactively over SSH?

As a starting point, consider the following case: echo 'read -p "enter name:" name; echo "your name is $name"' | ssh host4 'bash -s'

In the case above the prompt never happens, how do I work around that?

Thanks in advance.

Was it helpful?

Solution

Run the command directly, like so:

ssh -t host4 bash ./run_audit.sh

For an encore, modify the shell script so it reads options from the command line or a configuration file instead of from stdin (or in preference to stdin).

I second Dennis Williamson's suggestion to look into puppet/etc instead.

OTHER TIPS

Sounds like you might want to look into expect.

Do not pipe commands via stdin to ssh, but copy shell script to remote machine:

scp ./run_audit.sh host4:

and then:

ssh host4 run_audit.sh

For cluster deployments I'm using Fabric... it runs on top of SSH protocol, no daemons needed. It's easy as writing fabfile.py:

from fabric.api import run

def host_type():
    run('uname -s')

and then:

$ fab -H localhost,linuxbox host_type
[localhost] run: uname -s
[localhost] out: Darwin
[linuxbox] run: uname -s
[linuxbox] out: Linux

Done.
Disconnecting from localhost... done.
Disconnecting from linuxbox... done.

Of course it can do more... including interactive commands, and relays on ~/.ssh directory files for SSH. More at fabfile.org. For sure you will forget bash for such tasks. ;-)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top