Home > Software engineering >  Saving a remote variable locally with heredoc through ssh
Saving a remote variable locally with heredoc through ssh

Time:12-19

I am trying to run a local function remotely on a machine and retrieve the values of multiple variables of this function in a local function.

The first line of the heredoc section enables me to run the function remotely by defining it on the remote machine.

With the local machine named localmach and the remote machine named remotemach

#! /bin/bash

arr=()

scanHost()
{
  arr =("$(hostname)")
  tmpResult=$(hostname)
}

scanHost

ssh user@remotemach "bash -s --" <<EOF
$(typeset -f scanHost)
tmpResult=$tmpResult
scanHost
EOF

echo "Local array -> ${arr[@]}"
echo "Local echo  -> $tmpResult"

The snippet above returns

Local array -> localmach
Local echo  -> localmach

But what I need is

Local array -> localmach remotemach
Local echo  -> remotemach

In words, I need the value of the remote tmpResult AND the array arr stored locally.

Addendum : Here I make the command hostname as an example, but in reality I am "scanning" a remote host and generate a JSON string that I store in the tmpResult variable. If I encounter problems during the scan, I append a string explaining the issue in arr. This way in my final json I can list all the problems encountered during the scan of multiple hosts.

CodePudding user response:

You need to collect the result of ssh command :

#! /bin/bash

scanHost()
{
  tmpResult=$(hostname)
}

scanHost

tmpResult=$(ssh user@remotemach "bash -s" <<EOF
$(typeset -f scanHost)
scanHost
echo "\$tmpResult"
EOF
)

echo "Local echo -> $tmpResult"

New Version

#! /bin/bash

arr=()

scanHost()
{
  arr =("$(hostname)")
  tmpResult=$(hostname)
}

scanHost

eval "$(ssh user@remotemach "bash -s" <<EOF
$(typeset -f scanHost)
$(declare -p arr)
scanHost
declare -p arr
declare -p tmpResult
EOF
)"

echo "Local array -> ${arr[@]}"
echo "Local echo  -> $tmpResult"

Use eval with caution due to side effects.

  • Related