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
echo
ouprintf
, é 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⎺r
enquanto$'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/script
em 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