Reputation: 1176
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.
Upvotes: 5
Views: 7748
Reputation: 47052
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.
Upvotes: 9
Reputation: 18574
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. ;-)
Upvotes: 0