Registrando comandos remotos do ssh em 'bash_history'

5

O SSH permite que um usuário remoto emita algum comando sem fazer login interativamente no servidor, como a última linha do ssh usage indica:

usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport] [-Q protocol_feature]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-R [bind_address:]port:host:hostport] [-S ctl_path]
           [-W host:port] [-w local_tun[:remote_tun]]
           [user@]hostname [command]

Quando o ssh é invocado com um comando remoto, o arquivo .bash_history não é atualizado (ou seja, o comando remoto não é adicionado a .bash_history ). Eu consegui "simular" esse efeito adicionando o seguinte comando a /etc/ssh/sshd_config :

ForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "$SSH_ORIGINAL_COMMAND\n" >> .bash_history; bash -c "$SSH_ORIGINAL_COMMAND"; fi

O comando acima verifica se a variável de ambiente $SSH_ORIGINAL_COMMAND está vazia:

  • Se sim, nenhum comando remoto é emitido e simplesmente executamos bash .
  • Caso contrário, $SSH_ORIGINAL_COMMAND é adicionado a .bash_history e o comando remoto dentro de $SSH_ORIGINAL_COMMAND é executado.

Funciona como esperado, mas eu preciso de um pouco mais: quero que o timestamp atual seja adicionado a .bash_history também. Para esse fim, adicionei o seguinte comando a /etc/ssh/sshd_config :

ForceCommand if [[ -z $SSH_ORIGINAL_COMMAND ]]; then bash; else printf "#'date +%s'\n$SSH_ORIGINAL_COMMAND\n" >> .bash_history; bash -c "$SSH_ORIGINAL_COMMAND"; fi

Mas quando tento ssh para o servidor, recebo o seguinte erro:

bash: -c: line 0: unexpected EOF while looking for matching '"'
bash: -c: line 1: syntax error: unexpected end of file
Connection to 127.0.0.1 closed.

Se eu remover # antes de date +%s , ele funcionará corretamente. Mas preciso que # seja impresso antes do registro de data e hora, pois é o formato correto para o arquivo .bash_history .

    
por M.S. Dousti 02.04.2014 / 00:37

1 resposta

2

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 para echo -e . Observe que o \ precisa ser citado, então use "" , '' ou \43 .

  • Nos casos em que você não precisa de echo ou printf , é possível obter bash (também funciona em zsh ) para fazer a substituição usando $'string' . Por exemplo: para fazer touch foo#bar , você pode escrever touch $'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 para foo⎺r enquanto $'foo\u0023bar' fornece o esperado foo#bar .

  • Evite usar # (literal ou de outra forma) ao colocar toda a funcionalidade em um script e depois colocar ForceCommand /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
    
por 04.04.2014 / 11:06

Tags