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?