Erro de sintaxe com variável contendo aspas

3

Eu tenho um monte de máquinas Linux por trás de 2 gateways. Para se conectar ao set one eu faço

ssh -o ProxyCommand="ssh gateway1 nc %h %p" machines_behind_1
ssh -o ProxyCommand="ssh gateway2 nc --proxy %h %p --proxy-type socks4" machines_behind_2

Para simplificar esse processo, pensei em criar uma variável de ambiente para manter o comando proxy e simplesmente usá-lo. Então eu fiz

export PGWA='-o ProxyCommand="ssh gateway1 nc %h %p"'
export PGWB='-o ProxyCommand="ssh gateway2 nc --proxy %h %p --proxy-type socks4"'

Então, dependendo da máquina que eu quero conectar, eu faria

ssh $PGWA machine_behind_1
ssh $PGWB machine_behind_2 

Mas eu recebo este erro -

/bin/bash: -c: line 0: unexpected EOF while looking for matching '"'
/bin/bash: -c: line 1: syntax error: unexpected end of file

Alguma ideia do porquê?

Eu não posso usar nenhum truque ssh_config, porque eu não sei o nome do host antes do tempo. Eu poderia criar uma nova VM por trás do gateway1 e precisaria usar o primeiro comando de proxy.

A única coisa que posso pensar é criar um novo alias, uma função ou um script de shell que basicamente faz ssh -o foo $@ e use isso. Mas então, eu preciso lembrar de criar um script de alias / shell ou função para scp também, que também eu uso regularmente. Eu preferiria ser capaz de fazer isso automaticamente.

Eu meio que esperava poder fazer algo como ssh gw1-host e fazer alguma manipulação dentro do arquivo de configuração para convertê-lo em ssh -o foo host através do primeiro gateway, mas esse tipo de manipulação de regex não é permitido dentro do ssh_config.

De qualquer forma eu posso conseguir o que eu quero sem ssh / scp alias / script / function?

EDIT: Eu cometi um erro com a citação quando copiei e colei a variável de ambiente na troca de pilha aqui.

    
por Hari Sundararajan 08.05.2016 / 23:33

1 resposta

5

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.

    
por 09.05.2016 / 00:52