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"
fiDiscussion
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 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access