Getting Input from Another Machine
Problem
Your script needs to get input from another machine, perhaps to check if a file exists or a process is running.
Solution
Use SSH with public keys and command substitution. To do this, set up SSH so that you do not need a password, as described in Using SSH Without a Password. Next, tailor the command that SSH runs to output exactly what your script needs as input. Then simply use command substitution.
#!/usr/bin/env bash # cookbook filename: command_substitution REMOTE_HOST='host.example.com' # Required REMOTE_FILE='/etc/passwd' # Required SSH_USER='user@' # Optional, set to '' to not use #SSH_ID='-i ~/.ssh/foo.id' # Optional, set to '' to not use SSH_ID='' result=$( ssh $SSH_ID $SSH_USER$REMOTE_HOST \ "[ -r $REMOTE_FILE ] && echo 1 || echo 0" ) || { echo "SSH command failed!" >&2; exit 1; } if [ $result = 1 ]; then echo "$REMOTE_FILE present on $REMOTE_HOST" else echo "$REMOTE_FILE not present on $REMOTE_HOST" fi
Discussion
We do a few interesting things here. First, notice how both $SSH_USER
and
$SSH_ID
work. They have an effect when they have a value, but when they
are empty they interpolate to the empty set and are ignored. This allows
us to abstract the values in the code, which lends itself to putting
those values in a configuration file, putting the code into a function,
or both.
# Interpolated line of the variables have values: ssh -i ~/.ssh/foo.id user@host.example.com [...] # No values: ssh host.example.com [...]
Next, we set up the command ...
Get bash Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.