tr '[az]' '[n-za-m]' 是如何工作的?

tr '[az]' '[n-za-m]' 是如何工作的?

我发现了一个模糊的电子邮件地址,可以使用以下命令解密:

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

如何输出有效的电子邮件地址?该命令在做什么?

答案1

tr的手册页解释得很好;它是一个将字符从一组转换为另一组的过滤器。指定的第一组是[a-z],这是打字的简写方式[abcdefghijklmnopqrstuvwxyz]。第二个是[n-za-m],变成[nopqrstuvwxyzabcdefghijklm]tr从标准输入中读取每个字符,如果它出现在第一组中,它将用第二组中相同位置的字符替换它(这意味着[]被替换为它们自己,所以包括它们是没有意义的,但很多人错误地这样做是因为正则表达式使用它们来表示字符类,因此他们认为tr需要它们)。

一个更简单的例子:

$ echo abc | tr ab xy
xyc

a变成xb变成y、 并c保持不变,因为它不在第一组中。在这种情况下,用户所做的就是通过相同的过滤器运行他们的电子邮件地址(因为它是对称的 -a映射到nn返回到a,等等)以获得旋转版本;你再次运行它会将所有字符交换回原来的状态


旁注:这种特殊的交换,其中每个字母都被字母表中距它 13 个字符替换,称为罗特13(旋转13);它在新闻组中很流行,作为隐藏人们可能不想看到的内容的一种方式

答案2

tr音译字符:对于输入中的某些字符 x,它输出字符 y。

tr采用两个命令行参数,“from”字符和“to”字符。

在上面的示例中,“来自字符”给出为'[a-z]'。 “至字符”给出为'[n-za-m]'。单引号阻止解释命令行的 shell 对两个参数执行任何操作。tr将方括号内的参数视为范围。因此'[a-z]' means "all lower case characters from 'a' to 'z', inclusive". The second argument is a bit more complicated,'[n-za-m]'` 表示“从 'n' 到 'z' 的小写字符(包括在内),以及从 'a' 到 'm' 的小写字符(包括在内)”。

tr将所有输入的“a”字符音译为“n”,将“b”音译为“m”,将“c”音译为“o”等,最多将“n”个字符输出为“z”。输入中的“o”字符输出为“a”、“p”到“b”、“q”到“c”等。输入中的“z”字符输出为“l”。

本质上,你的命令做了一个凯撒密码在其输入上,一次一个小写字符。必须有人加密“[电子邮件受保护]" 获取您echo输出的字符串。

相关内容