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?