Como o tr '[a-z]' '[n-za-m]' funciona?

7

Eu encontrei um endereço de e-mail ofuscado que pode ser descriptografado usando este comando:

echo "[email protected]" | tr '[a-z]' '[n-za-m]'

Como isso produz um endereço de e-mail válido? O que esse comando está fazendo?

    
por LanceBaynes 30.08.2011 / 18:56

2 respostas

14
A página man do

tr explica isso muito bem; é um filtro que converte caracteres de um conjunto para outro. O primeiro conjunto especificado é [a-z] , que é uma forma abreviada de digitar [abcdefghijklmnopqrstuvwxyz] . O segundo é [n-za-m] , que se transforma em [nopqrstuvwxyzabcdefghijklm] . tr lê cada caractere de stdin e, se aparecer no primeiro conjunto, ele o substitui pelo caractere na mesma posição no segundo conjunto (isso significa que [ e ] estão sendo substituídos por si mesmos, portanto, incluir eles eram inúteis, mas muitas pessoas fazem isso por engano porque expressões regulares os usam para representar classes de caracteres, então eles acham que tr os requer).

Então, um exemplo mais simples:

$ echo abc | tr ab xy
xyc

a se transformou em x , b se transformou em y e c não foi alterado porque não estava no primeiro conjunto. Todos os usuários fizeram neste caso o mesmo endereço de e-mail através do mesmo filtro (já que é simétrico - a mapeia para n e n de volta para a , etc.) para obter a versão rotacionada ; você a executa novamente troca todos os caracteres de volta aos originais

Sidenote: Essa troca em particular, onde cada letra é substituída por uma das 13 letras distintas no alfabeto, é chamada ROT13 (rodar 13); era popular em grupos de notícias como uma forma de ocultar coisas que as pessoas podem não querer ver

    
por 30.08.2011 / 19:07
6

tr transliterados caracteres: para algum caractere x na entrada, ele gera um caractere y.

tr recebe dois argumentos de linha de comando, os caracteres "de" e os caracteres "para".

No seu exemplo acima, os "caracteres" são dados como '[a-z]' . Os "to characters" são dados como '[n-za-m]' . As aspas simples mantêm o shell que interpreta a linha de comando de fazer qualquer coisa para os dois argumentos. tr trata os argumentos com colchetes quadrados como intervalos. Portanto, '[a-z]' means "all lower case characters from 'a' to 'z', inclusive". The second argument is a bit more complicated, '[n-za-m]' significa "caracteres minúsculos de 'n' a 'z' inclusive, e caracteres minúsculos de 'a' a 'm', inclusive '.

tr translitera todos os caracteres de entrada 'a' para 'n', 'b' para 'm', 'c' para 'o', etc, até 'n' caracteres emitidos como 'z'. Os caracteres 'o' na entrada obtêm a saída como 'a', 'p' em 'b', 'q' em 'c' e assim por diante. Os caracteres 'z' na entrada obtêm a saída como 'l'.

Essencialmente, seu comando faz uma Cifra César em sua entrada, um caractere minúsculo de cada vez. Alguém tinha que codificar "[email protected]" para obter a string que você tem echo de saída.

    
por 30.08.2011 / 19:12

Tags