Prevent ssh from breaking up shell script parameters

Based on the answer from Peter Lyons, but also allow quotes inside arguments:

#!/bin/bash
QUOTE_ARGS=''
for ARG in "$@"
do
  ARG=$(printf "%q" "$ARG")
  QUOTE_ARGS="${QUOTE_ARGS} $ARG"
done

ssh [email protected]. "printf ${QUOTE_ARGS}"

This works for everything i've tested so far, except newlines:

$ /tmp/wrap_printf "[-%s-]" "hello'\$t\""
[-hello'$t"-]

#!/bin/sh
QUOTE_ARGS=''
for ARG in "$@"
do
  QUOTE_ARGS="${QUOTE_ARGS} '${ARG}'"
done
ssh [email protected]. "${QUOTE_ARGS}"

This works for spaces. It doesn't work if the argument has an embedded single quote.


Getting quoting right is pretty hard and doing it in bash (in a general and robust way) almost impossible.

Use Perl:

#!/usr/bin/perl
use Net::OpenSSH;
my $ssh = Net::OpenSSH->new('user@hostname');
$ssh->system('printf', @ARGV);

Tags:

Linux

Bash

Ssh