OpenSSH: Evitar globbing em SSH_ORIGINAL_COMMAND

2

Eu tenho a seguinte configuração onde eu uso um servidor OpenSSH para iniciar remotamente um determinado comando usando ssh .

Meu arquivo authorized_keys tem a seguinte entrada:

command="/path/to/script.sh $SSH_ORIGINAL_COMMAND",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa AAAA…qGDf my_special_key

Isso significa que, se alguém se conectar usando essa chave (por exemplo, usando ssh -i special_key_file user@server ), o script script.sh será executado no meu servidor. Agora também há o espaço reservado $SSH_ORIGINAL_COMMAND que é substituído por toda a linha de comando extra ao comando ssh , ou seja, ssh -i special_key_file user@server foobar significa que $1 terá foobar .

Para testar, posso fazer com que meu script.sh seja o seguinte:

#!/bin/sh
printf '<%s>\n' "$@"

Agora, para ssh -i special_key_file user@server 'foo bar' , assim como para ssh -i special_key_file user@server foo bar , recebo o seguinte resultado:

<foo>
<bar>

Por causa da divisão. E se isso não foi ruim o suficiente, por ssh -i special_key_file user@server '*' estou recebendo uma lista de arquivos:

<file1>
<file2>
…

Então, aparentemente toda a linha de comando extra é inserida no que está dentro de command= , que é então executado em um shell, com todas as etapas de divisão e globalização acontecendo. E aparentemente não posso usar " dentro da parte command="…" , por isso não posso colocar $SSH_ORIGINAL_COMMAND entre aspas duplas para evitar que isso aconteça. Existe outra solução para mim?

A BTW, conforme explicado neste rejeitou o RFE para introduzir $SSH_ESCAPED_ORIGINAL_COMMAND o protocolo ssh é responsável por todas as linhas de comando extras serem transferidas como uma string. Ainda assim, isso não é motivo para que um shell no lado do servidor faça toda a divisão, especialmente se ele também fizer a expansão glob (duvido que isso seja útil aqui). Ao contrário da pessoa que introduziu o RFE, não me preocupo com a divisão do meu caso de uso, apenas não quero expansão de glob.

Uma possível solução tem a ver com a alteração do ambiente de shell que o OpenSSH usa para essa tarefa?

    
por phk 20.11.2016 / 17:10

1 resposta

3

Use aspas:

cat bin/script.sh
#!/bin/sh
printf '<%s>\n' "$@"

command="/home/user/bin/script.sh \"${SSH_ORIGINAL_COMMAND}\"" ssh-rsa AA...

ssh -i .ssh/id_rsa.special hamilton '*'
<*>
ssh -i .ssh/id_rsa.special hamilton 'foo bar'
<foo bar>

Mas você também terá:

ssh -i .ssh/id_rsa.special hamilton '*' 'foo bar'
<* foo bar>

Não tenho certeza se é um problema para você ou não.

E eu estava confuso sobre:

And apparently I can't use " inside the command="…"

Eu pensei que é um tipo de limitação na sua tarefa, então excluí a minha resposta.
Fico feliz que minha resposta tenha ajudado você com sua tarefa!

    
por 20.11.2016 / 17:52