Um # em sshd_config é interpretado como o início de um comentário e tudo que o segue é ignorado. Embora (de acordo com sshd_config(5) ) "" possa ser usado para citar argumentos contendo espaços, eles não citam # .
Isso também explica o erro que você recebe. sshd apenas passa o seguinte para bash :
if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "
O segundo " não pode ser encontrado porque a linha de comando termina logo após o primeiro.
Para evitar esse comportamento, o literal # não deve ser usado:
-
Como
printfé usado aqui mesmo, usar seus recursos para usar caracteres com escape de contrabarra é útil.#pode ser escrito como\x23(hexadecimal),(octal),\u23(Unicode, hexadecimal até 4 dígitos hexadecimais) ou mesmo\U23(Unicode, hexadecimal até 8 dígitos hexadecimais). O mesmo funciona paraecho -e. Observe que o\precisa ser citado, então use"",''ou\43. -
Nos casos em que você não precisa de
echoouprintf, é possível obterbash(também funciona emzsh) para fazer a substituição usando$'string'. Por exemplo: para fazertouch foo#bar, você pode escrevertouch $'foo\x23bar'. Se o valor tiver menos do que a quantidade máxima de dígitos permitidos (3 para octal, 2 para hexadecimal e 4 ou 8 respectivamente para Unicode) você deve usar zeros à esquerda para evitar interpretações erradas. Por exemplo:$'foo\u23bar'avalia parafoo⎺renquanto$'foo\u0023bar'fornece o esperadofoo#bar. -
Evite usar
#(literal ou de outra forma) ao colocar toda a funcionalidade em um script e depois colocarForceCommand /path/to/scriptem sua configuração.
A segunda opção também permite que você renove printf usando a opção de formatação de date mais extensivamente. Em vez de
printf "\x23'date +%s'\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history
Você pode escrever
date $'+\x23%s'"${SSH_ORIGINAL_COMMAND//%/%%}" >> .bash_history