1

Even if the mycode.sh has non-0 exit code this command returns 0 as ssh connection was successful. How to get the actual return code of the .sh on remote server?

/home/mycode.sh '20'${ODATE} 1 | ssh -L 5432:localhost:5432 myuser@myremotehost cat
tooptoop4
  • 234
  • 3
  • 15
  • 45

2 Answers2

1

This is not related to SSH, but to how bash handles the exit status in pipelines. From the bash manual page:

The return status of a pipeline is the exit status of the last command, unless the pipefail option is enabled. If pipefail is enabled, the pipeline's return status is the value of the last (rightmost) command to exit with a non-zero status, or zero if all commands exit successfully. If the reserved word ! precedes a pipeline, the exit status of that pipeline is the logical negation of the exit status as described above. The shell waits for all commands in the pipeline to terminate before returning a value.

If you want to check that there was an error in the pipeline due to any of the commands involved, just set the pipefail option:

set -o pipefail
your_pipeline_here
echo $? # Prints non-zero if something went wrong

It is not possible to actually send the exit status to the next command in the pipeline (in your case, ssh) without additional steps. If you really want to do that, the command will have to be split like this:

res="$(/home/mycode.sh '20'${ODATE} 1)"
if (( $? == 0 )); then
    echo -n "$res" | ssh -L 5432:localhost:5432 myuser@myremotehost cat
else
    # You can do anything with the exit status here - even pass it on as an argument to the remote command
    echo "mycode.sh failed" >&2
fi

You may want to save the output of mycode.sh to a temporary file instead of the $res variable if it's too large.

svsd
  • 1,831
  • 9
  • 14
1

/home/mycode.sh is located onto the local host. the ssh command is running cat on the remote server.

All text printed to the standard output of the /home/mycode.sh is redirected to the cat standard input.

The man ssh reads:

EXIT STATUS

 ssh exits with the exit status of the remote command or with 255 if an error occurred.

Conclusion: the ssh exists with the EXIT STATUS of the cat or 255 if an error occurred.

if /home/mycode.sh script prints commands to the standard input, they can be run on the remote server when the cat is not present:

/home/mycode.sh '20'${ODATE} 1 | ssh -L 5432:localhost:5432 myuser@myremotehost

In my test, the EXIT STATUS of the last command executed on the remote server is returned by ssh:

printf "%s\n" "uname -r" date "ls this_file_does_not_exist" |\
  ssh -L 5432:localhost:5432 myuser@myremotehost ;\
  printf "EXIT STATUS of the last command, executed remotely with ssh is %d\n" $?

4.4.0-119-generic
Wed Aug 29 02:55:04 EDT 2018
ls: cannot access 'this_file_does_not_exist': No such file or directory
EXIT STATUS of the last command, executed remotely with ssh is 2
Community
  • 1
  • 1
Jay jargot
  • 2,745
  • 1
  • 11
  • 14