2017年5月

为什么 SSH(安全终端)的端口号是 22 呢,这不是一个巧合,这其中有个我(Tatu Ylonen,SSH 协议的设计者)未曾诉说的故事。

将 SSH 协议端口号设为 22 的故事

1995 年春我编写了 SSH 协议的最初版本,那时候 telnetFTP 正被广泛使用。

当时我设计 SSH 协议想着是为了替代 telnet(端口 23)和 ftp(端口21)两个协议的,而端口 22 是空闲的。我想当然地就选择了夹在 telnetftp 的端口中间的数字。我觉得端口号虽然是个小事但似乎又存在着某种信念。但我到底要怎么拿到那个端口号呢?我未曾拥有过任何一个端口号,但我却认识几个拥有端口号的人!

在那时取得端口号的事情其实说来挺简单的。毕竟当时的因特网(Internet)并不是很大,是因特网爆炸的早期。端口号分配的活儿是 IANA(Internet Assigned Numbers Authority,互联网数字分配机构)干的。在那时这机构可相当于是因特网先驱 Jon PostelJoyce K. Reynolds 一般的存在。Jon 参与编写了多项主要的协议标准,例如 IP(RFC 791)、ICMP(RFC 792)和 TCP(RFC 793)等一些你应该早有耳闻的协议。

我可以说是敬畏 Jon 先生的,他参与编写了几乎所有主要的因特网标准文档(Internet RFC)!

1995 年 7 月,就在我发布 ssh-1.0 前,我发送了一封邮件给 IANA:

From ylo Mon Jul 10 11:45:48 +0300 1995
From: Tatu Ylonen mailto:[email protected]
To: Internet Assigned Numbers Authority mailto:[email protected]
Subject: 请求取得一个端口号
Organization: 芬兰赫尔辛基理工大学

亲爱的机构成员:

我写了个可以在不安全的网络环境中安全地从一台机器登录到另一台机器的程序。它主要是对现有的 telnet 协议以及 rlogin 协议的功能性提升和安全性改进。说的具体些,就是可以防御 IP、DNS 或路由等欺骗行为。我打算将我的软件免费地发布在因特网上,以得到广泛地使用。

我希望为该软件注册一个特权端口号,要是这个端口号在 1 到 255 之间就更好了,这样它就可以用在名字服务器的 WKS 字段中了。

我在附件中附上了协议标准的草案。这个软件已经在本地运行了几个月了,我已准备在获得端口号后就发布。如果端口号分配一事安排的及时,我希望这周就将要发布的软件准备好。我目前在 beta 版测试时使用的端口号是 22,如果要是能够分配到这个端口,我就不用做什么更改了(目前这个端口在列表中还是空闲的)。

软件中服务的名称叫 ssh(系 Secure Shell 的缩写)。

您最真诚的,

Tatu Ylonen mailto:[email protected]

(LCTT 译注:DNS 协议中的 WKS 记录类型意即“众所周知的业务描述”,是类似于 A、MX 这样的 DNS 记录类型,用于描述某个 IP 所提供的服务,目前鲜见使用。参见: https://docs.oracle.com/cd/E19683-01/806-4077/dnsintro-154/index.html 。)

第二天,我就收到了 Joyce 发来的邮件:

Date: Mon, 10 Jul 1995 15:35:33 -0700
From: [email protected]
To: [email protected]
Subject: 回复:请求取得一个端口号
Cc: [email protected]

Tatu,

我们将端口号 22 分配给 ssh 服务了,你目前是该服务的主要联系人。

Joyce

这就搞定了!SSH 的端口正式使用 22!!!

1995 年 7 月 12 日上午 2 点 21 分,我给我在赫尔辛基理工大学的测试者们宣布了 SSH 的最后 beta 版本。当日下午 5 点 23 分,我给测试者们宣布了 ssh-1.0.0 版本。1995 年 7 月 12 日,下午 5 点 51 分,我将一份 SSH(安全终端)的宣告发给了 [email protected] 的邮件列表,此外我还将其发给了一些新闻组、邮件列表和一些在因特网上讨论相关话题的人们。

如何更改 SSH 服务的端口号

SSH 服务器是默认运行在 22 号端口上的。然而,由于某些原因需要,它也可以运行在别的端口上。比如为了方便测试使用,又比如在同一个宿主机上运行多个不同的配置。当然,极少情况下,不使用 root 权限运行它也可以,比如某些必须运行在非特权的端口的情况(端口号大于等于 1024)。

端口号可以在配置文件 /etc/ssh/sshd\_config 中将 Port 22 更改。也可以使用 -p <port> 选项运行 sshd。SSH 客户端和 sftp 程序也可以使用 -p <port> 选项。

配置 SSH 协议穿越防火墙

SSH 是少数通常被许可穿越防火墙的协议之一。通常的做法是不限制出站的 SSH 连接,尤其常见于一些较小的或者比较技术型的组织中,而入站的 SSH 连接通常会限制到一台或者是少数几台服务器上。

出站的 SSH 连接

在防火墙中配置出站的 SSH 连接十分简单。如果完全限制了外发连接,那么只需要创建一个允许 TCP 端口 22 可以外发的规则即可。如果你想限制目标地址,你可以限制该规则仅允许访问你的组织放在云端的外部服务器或保护该云端的跳板服务器即可。

反向通道是有风险的

其实不限制出站的 SSH 连接虽然是可以的,但是是存在风险的,SSH 协议是支持 通道访问 的。最初的想法是在外部服务器搭建一个 SSH 服务监听来自各处的连接,将进入的连接转发到组织,并让这个连接可以访问某个内部服务器。

在某些场景下这当然非常的方便。开发者和系统管理员经常使用它打开一个通道以便于他们可以远程访问,比如在家里或者在旅行中使用笔记本电脑等场景。

然而通常来讲这些做法是违背安全策略的,跳过了防火墙管理员和安全团队保护的控制无疑是违背安全策略的,比如这些: PCIHIPAANIST SP 800-53 等。它可以被黑客和外国情报机构用来在组织内留下后门。

CryptoAuditor 是一款可以控制通道穿过防火墙或者一组云端服务器入口的产品。该款产品可以配合 通用 SSH 密钥管理器(Universal SSH Key Manager) 来获得对 主机密钥(host keys)的访问,以在启用防火墙并阻挡未授权转发的场景中解密 SSH 会话。

入站的 SSH 访问

对于入站访问而言,这里有几点需要说一下:

  • 配置防火墙,并转发所有去往 22 端口的连接只能流向到一个特定的内部网络 IP 地址或者一个 DMZ) 主机。在该 IP 上运行 CryptoAuditor 或者跳板机来控制和审查所有访问该组织的连接。
  • 在防火墙上使用不同的端口访问不同的服务器。
  • 只允许使用 IPsec 协议这样的 VPN(虚拟专用网)登录后连接 SSH 服务。

通过 iptables 服务限制 SSH 访问

iptables 是一款内建在 Linux 内核的宿主防火墙。通常配置用于保护服务器以防止被访问那些未明确开启的端口。

如果服务器上启用了 iptables,使用下面的命令将可以允许进入的 SSH 访问,当然命令需要以 root 身份运行。

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

如果你想将上述命令创建的规则持久地保存,在某些系统版本中,可使用如下命令:

service iptables save

防火墙开启 SSH 端口可以让我挖隧道去银行


via: https://www.ssh.com/ssh/port

作者:Tatu Ylonen 译者:kenxx 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Big Data Marriage

Big Data Marriage

这幅漫画是作者假借大数据来吐槽自己的老婆太唠叨了。

也是一个非常有意思的比喻,作为男性可能都有所体会,在没有结婚的时候,甚至是说,单身的时候,自己的生活过的清净而惬意。一旦你结了婚,你的妻子为了生活而忙碌,便开始关注生活中的点点滴滴,会给你说大量的话,传递大量的信息,这何尝不是一种“大数据”呢?

via: https://turnoff.us/geek/bigdata-marriage/

作者:Daniel Stori 译者&点评:Bestony 校对:wxy 合成:GHLandy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你正在寻找一种管理运行容器的 Linux 服务器的简单方法,那么你应该看看 Cockpit。

如果你管理着一台 Linux 服务器,那么你可能正在寻找一个可靠的管理工具。为了这个你可能已经看了 WebmincPanel 这类软件。但是,如果你正在寻找一种简单的方法来管理还包括了 Docker 的 Linux 服务器,那么有一个工具可以用于这个需求:Cockpit

为什么使用 Cockpit?因为它可以处理这些管理任务:

  • 连接并管理多台机器
  • 通过 Docker 管理容器
  • 与 Kubernetes 或 Openshift 集群进行交互
  • 修改网络设置
  • 管理用户帐号
  • 通过基于 Web 的 shell 访问
  • 通过图表查看系统性能信息
  • 查看系统服务和日志文件

Cockpit 可以安装在 Debian、Red Hat、CentOS、Arch Linux 和 Ubuntu 之上。在这里,我将使用一台已经安装了 Docker 的 Ubuntu 16.04 服务器来安装系统。

在上面的功能列表中,其中最突出的是容器管理。为什么?因为它使安装和管理容器变得非常简单。事实上,你可能很难找到更好的容器管理解决方案。

因此,让我们来安装这个方案并看看它的使用是多么简单。

安装

正如我前面提到的,我将在一台运行着 Docker 的 Ubuntu 16.04 实例上安装 Cockpit。安装步骤很简单。你要做的第一件事是登录你的 Ubuntu 服务器。接下来,你必须使用下面的命令添加必要的仓库:

sudo add-apt-repository ppa:cockpit-project/cockpit

出现提示时,按下键盘上的回车键,等待提示返回。一旦返回到 bash 提示符,使用下面的命令来更新 apt:

sudo apt-get get update

使用下面的命令安装 Cockpit:

sudo apt-get -y install cockpit cockpit-docker

安装完成后,需要启动 Cockpit 服务并使它开机自动启动。要做到这个,使用下面的两个命令:

sudo systemctl start cockpit
sudo systemctl enable cockpit

安装就到这里了。

登录到 Cockpit

要访问 Cockpit 的 web 界面,打开浏览器(与 Cockpit 服务器在同一个网络内),输入 http://IP_OF_SERVER:9090,你就会看到登录页面(图 1)。

图 1:Cockpit 登录页面。

在 Ubuntu 中使用 Cockpit 有个警告。Cockpit 中的很多任务需要管理员权限。如果你使用普通用户登录,则无法使用 Docker 等一些工具。 要解决这个问题,你可以在 Ubuntu 上启用 root 用户。但这并不总是一个好主意。通过启用 root 帐户,你将绕过已经建立多年的安全系统。但是,在本文的用途中,我将使用以下两个命令启用 root 用户:

sudo passwd root
sudo passwd -u root 

注意,请确保给 root 帐户一个强壮的密码。

你想恢复这个修改的话,你只需输入下面的命令:

sudo passwd -l root

在其他发行版(如 CentOS 和 Red Hat)中,你可以使用用户名 root 及其密码登录 Cockpit,而无需像上面那样需要额外的步骤。

如果你对启用 root 用户感到担心,则可以在服务器的终端窗口拉取镜像(使用命令 docker pull IMAGE_NAME, 这里的 IMAGE_NAME 是你要拉取的镜像)。这会将镜像添加到你的 docker 服务器中,然后可以通过普通用户进行管理。唯一需要注意的是,普通用户必须使用以下命令将自己添加到 Docker 组:

sudo usermod -aG docker USER

其中,USER 是实际添加到组的用户名。在你完成后,重新登出并登入,接着使用下面的命令重启 Docker:

sudo service docker restart

现在常规用户可以启动并停止 Docker 镜像/容器而无需启用 root 用户了。唯一一点是用户不能通过 Cockpit 界面添加新的镜像。

使用 Cockpit

一旦你登录后,你可以看到 Cockpit 的主界面(图 2)。

图 2:Cockpit 主界面。

你可以通过每个栏目来检查服务器的状态等,但是我们想要直接进入容器。单击 “Containers” 那栏以显示当前运行的以及可用的镜像(图3)。

图 3:使用 Cockpit 管理容器难以置信地简单。

要启动一个镜像,只要找到镜像并点击关联的启动按钮。在弹出的窗口中(图 4),你可以在点击运行之前查看所有镜像的信息(并根据需要调整)。

图 4: 使用 Cockpit 运行 Docker 镜像。

镜像运行后,你可以点击它查看状态,并可以停止、重启、删除实例。你也可以点击修改资源限制并接着调整内存限制还有(或者)CPU 优先级。

添加新的镜像

假设你以 root 用户身份登录。如果是这样,那么你可以在 Cockpit GUI 的帮助下添加新的镜像。在“ Container” 栏目下,点击获取新的镜像按钮,然后在新的窗口中搜索要添加的镜像。假设你要添加 CentOS 的最新官方版本。在搜索栏中输入 centos,在得到搜索结果后,选择官方列表,然后单击下载(图5)。

图 5:使用 Cockpit 添加最新的官方构建 CentOS 镜像到 Docker 中。

镜像下载完后,那它就在 Docker 中可用了,并可以通过 Cockpit 运行。

如获取它那样简单

管理 Docker 并不容易。是的,在 Ubuntu 上运行 Cockpit 会有一个警告,但如果这是你唯一的选择,那么也有办法让它工作。在 Cockpit 的帮助下,你不仅可以轻松管理 Docker 镜像,也可以在任何可以访问 Linux 服务器的 web 浏览器上这样做。请享受这个新发现的让 Docker 易用的方法。


via: https://www.linux.com/learn/intro-to-linux/2017/3/make-container-management-easy-cockpit

作者:JACK WALLEN 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

你是否在为小型企业或家庭办公室寻找电话系统?

你是否在为小型企业或家庭办公室寻找电话系统?我一直对可扩展 VoIP(Voice over IP)解决方案感兴趣,后来我在树莓派上找到 Asterisk 的一个实现。

我的好奇心被激起了,我决心尝试一下,所以我从 Asterisk 官网下载了它(RasPBX),然后使用我的树莓派 3 构建服务器。

准备开始

首先,我将下载的镜像刻录到 MicroSD 卡上。建议的最小值是 4 GB。将镜像传输到 MicroSD 卡并插到树莓派上的相应插槽中后,我将网线连接到树莓派和家庭路由器上的以太网端口中。

更多关于树莓派的内容:

接下来,我在 Linux 上打开一个终端,并输入 ssh [email protected],这是我的服务器的 IP 地址。我被提示以 root 用户身份登录到 RasPBX 上。默认密码是 raspberry。 (出于安全考虑,如果你打算再多试试,请务必更改默认密码。)

当我登录到了 RasPBX 上的 shell 后,接下来我需要准备配置了。根据网站上提供的文档,我在 shell 下输入 regen-hostkeys 来创建新的主机密钥。然后输入 configure-timezone 来配置服务器的时区。我通过在提示符下输入 dpkg-reconfigure locales 来配置区域设置。我也安装了 Fail2Ban 来保障服务器的安全性。

现在我准备测试我的配置。

测试

我从 RasPBX 的 shell 中登出,然后打开浏览器并输入我的服务器的 IP 地址。将服务器 IP 地址加载到浏览器中,我看到了一个可爱的登录页面。

FreePBX 提供了一个非常好的基于 Web 的开源图形用户界面,我用它来控制和配置 Asterisk(可在 GitHub 上找到)。(FreePBX 是 GPL 许可的)。我用它来完成其余的配置。FreePBX 的默认登录账号为用户名:admin; 密码:admin

 title=

登录之后,我进入位于显示屏左上方的 应用菜单 Application Menu 。点击菜单链接并选择了第二个选项,即 “应用” Applications ,接着选择了第四个选项, “分机” Extensions 。从那里我选择创建一个 New Chan\_Sip 分机。

我使用密码配置了一个 sip 分机用户。密码是自动生成的,也可以选择创建自己的密码。

现在我有了一个完整的分机,我急于尝试我的新的 VoIP 服务器。我下载并安装了 Yate 客户端,这是在构建服务器的过程中发现的。安装 Yate) 之后,我想测试与服务器的连接。我发现我可以使用 Yate 连接到服务器并输入 *43 进行回声测试。当我听到客户端指示时,我感到很激动。

我决定创建另外一个 sip 分机,这样我就可以测试系统的语音信箱功能。 在完成后,我使用 Yate 客户端来呼叫这个分机,并留下了简短的语音留言。然后再次使用 Yate 呼叫该分机并输入 *97 来检索语音留言。然后我想看看我是否可以使用我的新服务器来呼叫外线。返回到菜单,选择 “连接” Connectivity 选项,并添加了 Google Voice 号码。

 title=

接着我返回到 “连接” 菜单,并将 Google Voice 添加到出站路由中。

 title=

完成一个呼叫

回到 Yate 客户端,我呼叫了一个外线并成功完成了这个呼叫。

我相信这个特定的 VoIP 解决方案可以轻松地为一个小型办公室工作。根据 RasPBX 网站的常见问题部分,典型的树莓派系统可以在树莓派 1 上支持多达 10 个并发呼叫。

Asterisk 有很多细微差别的功能,FreePBX 则可以很容易地利用它们。

关于树莓派上的 Asterisk 的更多信息,请参考他们的博客。你可以在他们的网站上找到有关 FreePBX 源代码的其他信息。

(题图:Pixabay,CC0)


作者简介:

Don Watkins - 教育家、教育技术专家、企业家、开源倡导者。教育心理学硕士、教育领导硕士、Linux 系统管理员、CCNA、使用 Virtual Box 虚拟化。关注我 @Don\_Watkins。


via: https://opensource.com/article/17/4/asterisk-raspberry-pi-3

作者:Don Watkins 译者:geekpi 校对:jasminepeng

本文由 LCTT 原创编译,Linux中国 荣誉推出

你是不是经常在终端敲错命令,其实这都是因为该死的终端不配合,不能领会你的意思。

每当这个时候,甚至当你一再敲错的时候,你的内心肯定是崩溃的,一定在默念“……”。

而现在,是让你的终端觉悟的时候了!

有位名为 @liamosaur 的哥们就忍不住对自己的终端发出了愤怒的吼声,并付诸实践:

受此启发, 一位名为 Vladimir Iakovlev 程序员对这个该死的终端发出了致命一击!他以及他的 90 位愤怒的小伙伴们打造出了一个名为 “thefuck” 的神器!

当你的终端没有按你想象的输入命令时,请 fuck 它!

当你的终端没有按你想象的以 sudo 执行命令时,请 fuck 它!

当你的的终端不知道填上显而易见的参数时,请 fuck 它!

当你输入错误的命令时:

➜ puthon
No command 'puthon' found, did you mean:
 Command 'python' from package 'python-minimal' (main)
 Command 'python' from package 'python3' (main)
zsh: command not found: puthon

➜ fuck
python [enter/↑/↓/ctrl+c]
Python 3.4.2 (default, Oct  8 2014, 13:08:17)
...

当你忘记输入参数时:

➜ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

➜ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

当你输入错误的参数时:

➜ git brnch
git: 'brnch' is not a git command. See 'git --help'.

Did you mean this?
    branch

➜ fuck
git branch [enter/↑/↓/ctrl+c]
* master

当你忘记输入 sudo 时:

➜ apt-get install vim
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you root?

➜ fuck
sudo apt-get install vim [enter/↑/↓/ctrl+c]
[sudo] password for nvbn:
Reading package lists... Done
...

如果生活是如此的不如意,你可以不断的“教诲”它:

➜ aptget install vim
No command 'aptget' found, did you mean:
 Command 'apt-get' from package 'apt' (main)
zsh: command not found: aptget
➜ fuck
aot-get install vim [enter/ctrl-c]
E: Could not open lock file /var/lib/dpkg/lock - open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg), are you root?

还需要权限?再来!

➜ fuck
sudo apt-get install vim [enter/ctrl-c]
[sudo] password for nvbn:
Reading package lists... Done
Building dependency tree... 0%
... ...

虐我千百遍 我待如初恋

好了,我想你肯定也想拥有这样的神器,请如此这般……

我要这个神器!

环境需求

首先,你需要这些:

  • python (2.7+ or 3.3+)
  • pip
  • python-dev

安装

然后,在不同的操作系统上(没错,有 Python 的地方就行):

在 Ubuntu 上可以通过 apt 安装:

sudo apt update
sudo apt install python3-dev python3-pip
pip3 install --user thefuck

OS X 上使用 Homebrew 来安装:

brew install thefuck

其它的系统上,只要你有 pip 就行:

pip install --user thefuck

更多的 Linux 发行版,可以看这里

设置别名

上述安装的软件包名字是:“thefuck”——别问我为啥不能直接叫 “fuck”。所以,你可以设置个别名:

Bash

将下述行加入到 .bashrc.bash_profile (用于 OSX):

eval "$(thefuck --alias)"

ZSH

将下述行加入到 .zshrc:

eval "$(thefuck --alias)"

其它的 shell ,包括 powershell,可以参考这里

当然,我觉得我更喜欢给它起个别名叫 “kao”。:D

要让别名立刻生效,你需要用 source 命令,如:

source ~/.bashrc 
或 
source ~/.zshrc

它是怎么让我念头通达的?

thefuck 这个软件包包含了上百个匹配规则,专门用来修改你的那些错误,贴心地将它们修改成应该的样子!

具体有哪些规则,你可以看看这里,或者试试就知道了。

当然,如果你经常犯一些独特的错误,你也可以建立自己的规则,而且不妨提交拉取请求给这个项目,找到和你一样独特的小伙伴们。

还等什么?赶快去啊!

(本文中的例子和图片来自该项目。)

(LCTT 译注:本文标题 “The root of all eval” 影射著名歌曲“The root of all evil”(万恶之源))

唉,eval 这个函数让我爱恨交织,而且多半是后者居多。

$ perl -E'my $program = q[say "OH HAI"]; eval $program'
OH HAI

eval 函数在 Perl 6 中被重命名为 EVAL 时,我感到有点震惊(这要追溯到 2013 年,在这里讨论规范之后)。我一直没有从内心接受这样这样的做法。虽然这是个很好的意见,但是在这个意见上我似乎或多或少是孤独的。

理由是“这个函数真的很奇怪,所以我们应该用大写标记”。就像我们用 BEGIN 和其他 phaser 一样。使用 BEGIN 和其他 phaser,鼓励使用大写,这点我是同意的。phaser 能将程序“脱离正常控制流”。 但是 eval 函数并不能。(LCTT 译注: 在 Perl 6 当中,phaser 是在一个特定的执行阶段中调用的代码块。)

其他大写的地方像是 .WHAT 这样的东西,它看起来像属性,但是会在编译时将代码变成完全不同的东西。因为这发生在常规情况之外,因此大写甚至是被鼓励的。

eval 归根到底是另一个函数。是的,这是一个潜在存在大量副作用的函数。但是那么多的标准函数都有大量的副作用。(举几个例子:shelldieexit)你没看到有人呼吁将它们大写。

我猜有人会争论说 eval 是非常特别的,因为它以正常函数所没有的方式钩到编译器和运行时里面。(这也是 TimToady 在将该函数重命名的提交中的提交消息中解释的。)这是一个来自实现细节的争论,然而这并不令人满意。这也同样适用与刚才提到的那些小写函数。

雪上加霜的是,更名后 EVAL 也更难于使用:

$ perl6 -e'my $program = q[say "OH HAI"]; EVAL $program'
===SORRY!=== Error while compiling -e
EVAL is a very dangerous function!!! (use the MONKEY-SEE-NO-EVAL pragma to override this error,
but only if you're VERY sure your data contains no injection attacks)
at -e:1
------> program = q[say "OH HAI"]; EVAL $program⏏<EOL>

$ perl6 -e'use MONKEY-SEE-NO-EVAL; my $program = q[say "OH HAI"]; EVAL $program'
OH HAI

首先,注入攻击是一个真实的问题,并不是一个笑话。我们应该互相教育对方和新手。

其次,这个错误消息("EVAL is a very dangerous function!!!")完全是恐吓多于帮助。我觉得当我们向人们解释代码注入的危险时,我们需要冷静并且切合实际,而不是用三个感叹号。这个错误信息对已经知道什么是注入攻击的人来说是有意义的,对于那些不了解这种风险的人员,它没有提供任何提示或线索。

(Perl 6 社区并不是唯一对 eval 歇斯底里的,昨天我偶然发现了一个 StackOverflow 主题,关于如何将一个有类型名称的字符串转换为 JavaScript 中的相应构造函数,一些人不幸地提出了用 eval,而其他人立即集结起来指出这是多么不负责任,就像膝跳反射那样——“因为 eval 是坏的”)。

第三,“MOKNEY-SEE-NO-EVAL”。拜托,我们能不能不要这样……汗,启用一个核弹级的函数时,就像是猴子般的随机引用和轻率的尝试,我奇怪地发现启用 EVAL 函数的是一个称为 NO-EVAL 的东西。这并不符合“ 最少惊喜 Least Surprise ”原则。

不管怎样,有一天,我意识到我可以同时解决全大写名字问题和该指令的必要问题:

$ perl6 -e'my &eval = &EVAL; my $program = q[say "OH HAI"]; eval $program'
OH HAI

我很高兴我能想到这点子并记录下来。显然我们把它改回了旧名字,这个非常危险的功能(!!!)就又好了。 耶!


via: http://strangelyconsistent.org/blog/the-root-of-all-eval

作者:Carl Mäsak 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出