How can I execute local script on remote machine and include arguments?
I have written a script that runs fine when executed locally:
./sysMole -time Aug 18 18
The arguments "-time", "Aug", "18", and "18" are successfully passed on to the script.
Now, this script is designed to be executed on a remote machine but, from a local directory on the local machine. Example:
ssh [email protected] "bash -s" < /var/www/html/ops1/sysMole
That also works fine. But the problem arises when I try to include those aforementioned arguments (-time Aug 18 18), for example:
ssh [email protected] "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
After running that script I get the following error:
bash: cannot set terminal process group (-1): Invalid argument bash: no job control in this shell
Please tell me what I'm doing wrong, this greatly frustrating.
You were pretty close with your example. It works just fine when you use it with arguments such as these.
$ more ex.bash #!/bin/bash echo $1 $2
Example that works:
$ ssh serverA "bash -s" < ./ex.bash "hi" "bye" hi bye
But it fails for these types of arguments:
$ ssh serverA "bash -s" < ./ex.bash "--time" "bye" bash: --: invalid option ...
What's going on?
The problem you're encountering is that the argument,
--timein my example, is being interpreted as a switch to
bash -s. You can pacify
bashby terminating it from taking any of the remaining command line arguments for itself using the
$ ssh [email protected] "bash -s" -- < /var/www/html/ops1/sysMole -time Aug 18 18
$ ssh serverA "bash -s" -- < ./ex.bash "-time" "bye" -time bye
$ ssh serverA "bash -s" -- < ./ex.bash "--time" "bye" --time bye
$ ssh serverA "bash -s" -- < ./ex.bash --time "bye" --time bye
$ ssh < ./ex.bash serverA "bash -s -- --time bye" --time bye
NOTE: Just to make it clear that wherever the redirection appears on the command line makes no difference, because
sshcalls a remote shell with the concatenation of its arguments anyway, quoting doesn't make much difference, except when you need quoting on the remote shell like in example #4:
$ ssh < ./ex.bash serverA "bash -s -- '<--time bye>' '<end>'" <--time bye> <end>
you are an Genius! What do I have to do to get to your level? I have alot of work cut out. Thanks so much.
@AllenD - just keep asking questions, and try and participate on the site as much as you can. I always try and learn something new each day. Before your question I didn't know how to do this either. 8-). Thanks for your question!
note that the redirection can appear at any point in the command: for example `bash -s -- --time bye < ./ex.bash` or even `< ./ex.bash bash -s -- --time bye`. this is because the shell first takes out the redirection instruction (regardless of where it is in the command), then sets up the redirection, then executes the rest of the command line with the redirection in place.
@sim I'm trying to do this exact same thing, but from within a script, not from the command line. Any idea of how to do this? For some reason, enclosing your exact answer in backticks does not work at all. It instead runs the script specified locally, and the output is sent as a command to the bash over ssh
Sure already did, it's located here: http://unix.stackexchange.com/questions/187960/is-it-possible-to-send-a-heredoc-over-ssh-to-a-remote-host-from-inside-a-script
I knew "bash -s" but I didn't know how to stop bash from interpreting other switches which were not meant for bash. Useful tip.