9

I want to run a command on a ssh-server, but this command is determined by a script on my local machine. How do I do that?

An example for clarity:
I want to write a script here (foo.sh) that takes an argument. If I run ./foo.sh 0 it should somehow send a shutdown signal to the server machine, but if I run ./foo.sh 1 it should send a restart signal.

I know how to manually login via ssh, and I've already set ssh-keys to skip passwords, but I don't know how to automate the procedure with a script.

Malabarba
  • 10,546

3 Answers3

12

You can pass a command (or list of commands, separated by ; or &&) to a SSH connection like this:

ssh user@server-address "./foo 1"

If you have a local script that outputs 0 or 1, you can simplify things further:

ssh user@server-address "./foo $(/path/to/your/local/script)"

The code in $(...) executes before anything else and its output is put into the line dynamically. It's called command substitution.

Pablo Bianchi
  • 17,371
Oli
  • 299,380
7

As Oli commented, you can tell SSH to send commands. You could modify your script so that if your command line arg is 1 it sends ssh user@server "shutdown -h now". Keep in mind that you'll have to be superuser on the other machine to shut it down.

EDIT: Instead of using root, as is suggested in the comments put user into the sudoers file as being able to shut down the machine without a password.

2

You can use runoverssh:

sudo apt install runoverssh
runoverssh -n -s localscript.sh user host

-n will use SSH default authentication (your keys)
-s runs a local script remotely

nowat
  • 21