Quando você escreve $PGWA
sem aspas, isso divide o valor de PGWA
no whitespace¹. Caracteres de citação não têm nenhum significado especial, então você acaba com as palavras -o
, ProxyCommand="ssh
, gateway1
, nc
, %h
e %p"
.
Veja Por que meu shell script sufoca em espaço em branco ou outros caracteres especiais? para mais explicações.
Uma expansão variável fora das aspas duplas é quase sempre um erro. É sempre um erro, a menos que você saiba por que precisa deixar as aspas duplas.
O que você precisa fazer é passar dois argumentos para o comando SSH: -o
e ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4
.
No zsh, você pode definir apenas PGWA
para uma matriz:
PGWA=(-o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4')
ssh $PGWA …
Em outros shells, como bash e ksh, isso requer mais digitação, devido a suas características de design que as expansões de variáveis não nomeadas são divididas e devido à sua sintaxe explícita para matrizes:
PGWA=(-o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4')
ssh "${PGWA[@]}" …
Um método que funcionaria em qualquer shell sh-like e não exigiria muita digitação seria definir funções.
pgwa () {
typeset c="$1"; shift
"$c" -o 'ProxyCommand=ssh gateway2 nc --proxy %h %p --proxy-type socks4' "$@"
}
pgwa ssh …
Mas acho que a melhor solução seria colocar todas essas definições em .ssh/config
, onde elas pertencem. Dessa forma, você não precisaria de nenhum truque de shell e as configurações funcionariam em outros programas (rsync, sshfs, programas de transferência de arquivos GUI, etc.). Se você adicionar uma nova VM atrás do gateway1, adicione uma entrada a .ssh/config
ou use ssh -o HostName=new-vm something-behind-gateway1 …
¹ Mais outras coisas que não importam aqui.