配置你的Python环境

这是本书中最无趣的部分,但也是最关键的部分,我们将在其中介绍如何设置编写和测试Python的环境。我们将学习如何设置一个Kali Linux虚拟机(VM),为Python 3创建一个虚拟环境,并安装一个良好的集成开发环境(IDE),以便您拥有开发代码所需的一切。在这一章结束时,你应该就准备好处理书中其余部分的练习和代码示例。

在开始之前,如果您没有VMware Player、VirtualBox或Hyper-V等虚拟化管理程序客户端(PS:虚拟机),请下载并安装一个。我们还建议您准备好一台Windows 10虚拟机。你可以在这里得到一个评估版Windows 10 VM虚拟机: [https:/ /developer.microsoft.com/en-us/windows/downloads/virtual-machines/](https:/ /developer.microsoft.com/en-us/
windows/downloads/virtual-machines/)。

安装Kali Linux

Kali是BackTrack Linux发行版的继承者,是由Offensive Security设计的一个渗透测试操作系统。它附带了许多预安装的工具,并且是基于Debian Linux的,因此您可以安装各种各样的附加工具和库。

您将使用Kali作为您的客户端虚拟机。也就是说,您将下载一个Kali虚拟机,并使用您选择的虚拟机管理程序在主机上运行它。您可以从https://www.kali.org/downloads/下载Kali VM,并将其安装在自己选择的虚拟机管理程序中。请遵循Kali文档中的说明:[https://www.kali.org/docs/installation/](https:/ /www.kali.org/docs/installation/)。

完成安装步骤后,您应该会拥有了完整的Kali桌面环境,如图1-1所示。

image-20210708195924680

Figure 1-1 : The Kali Linux desktop(笔者注:这个是笔者自己的Kali虚拟机,笔者手里的是该书的PDF黑白版本,所以换了自己的图片更好看一点:))

因为自创建Kali映像以来可能有重要的更新,所以让我们更新机器到最新版本。在Kali shell(Applications-Accessories-Terminal)中,执行以下命令:

1
2
3
4
5
tim@kali:~$ sudo apt update
tim@kali:~$ apt list --upgradable
tim@kali:~$ sudo apt upgrade
tim@kali:~$ sudo apt dist-upgrade
tim@kali:~$ sudo apt autoremove

设置Python 3

我们要做的第一件事是确保安装了正确的Python版本。(本书中的项目使用的是Python 3.6或更高版本。)从Kali shell中调用Python看一下:

1
tim@kali:~$ python

这是我们(原作者)的Kali机器上的样子:

1
2
3
4
Python 2.7.17 (default, Oct 19 2019, 23:36:22) 
[GCC 9.2.1 20191008] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

这不是我们想要的。在撰写本文时,当前Kali中安装的Python默认版本是Python 2.7.18。但这并不算是问题;你应该也安装了Python 3:

1
2
3
4
5
tim@kali:~$ python3
Python 3.7.5 (default, Oct 27 2019, 15:43:29)
[GCC 9.2.1 20191022] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

这里列出的Python版本是3.7.5。如果你的版本低于3.6,请使用以下方法升级你的版本:

1
$ sudo apt-get upgrade python3

我们将在一个虚拟环境中使用Python 3,这个虚拟环境是一个自包含的目录树,其中包含Python安装和您安装的任何额外的软件包。虚拟环境是Python开发人员最基本的工具之一。使用虚拟环境,您可以分离具有不同需求的项目。例如,您可以为涉及包检查的项目使用一个虚拟环境,并为用于二进制分析的项目使用另一个虚拟环境。

通过有着这些独立的环境,您可以让项目保持简约而整洁。这确保了每个环境可以有自己的依赖项和模块集,而不会破坏任何其他项目。

现在让我们创建一个虚拟环境。首先,我们需要安装 python3-venv 包:

1
2
3
tim@kali:~$ sudo apt-get install python3-venv
[sudo] password for tim:
...

现在我们可以创建一个虚拟环境了。让我们新建一个目录并创建环境:

1
2
3
4
5
tim@kali:~$ mkdir bhp
tim@kali:~$ cd bhp
tim@kali:~/bhp$ python3 -m venv venv3
tim@kali:~/bhp$ source venv3/bin/activate
(venv3) tim@kali:~/bhp$ python

这些命令将在当前目录中创建一个新目录bhp*。我们通过调用 *venv 包、使用-m*参数和您希望新环境具有的名称创建了一个新的虚拟环境。我们的虚拟环境名字叫 *venv3 ,但你可以用任何你喜欢的名字。环境中的脚本、包和Python可执行文件将安置于该目录中。接下来,我们通过运行 activate 脚本来激活环境。请注意,一旦激活了环境,命令提示符就会改变。环境的名称附加在通常的提示符(在我们的例子中是venv3)之前。稍后,当您准备退出环境时,使用命令 deactivate

现在您已经设置了Python并激活了一个虚拟环境。因为我们设置了使用Python 3的环境,所以当你调用Python时,你不再需要指定 python3 ——只要 python 就可以了,因为这是我们安装到虚拟环境中的。换句话说,在激活之后,每个Python命令都是相对于您的虚拟环境。请注意,使用不同版本的Python可能会破坏本书中的一些代码示例。

我们可以使用 pip 可执行程序将Python包安装到虚拟环境中。这很像apt包管理器,因为它允许您直接将Python库安装到虚拟环境中,而无需手动下载、解包和安装它们。

你可以用 pip 搜索包并将它们安装到你的虚拟环境中:

1
(venv3) tim@kali:~/bhp: pip search hashcrack

让我们做一个快速测试并安装 lxml 模块,我们将在第5章中使用它来构建一个web scraper。在终端中输入以下内容:

1
(venv3) tim@kali:~/bhp: pip install lxml

您应该在终端中看到输出,表明正在下载和安装库。然后输入到一个Python shell,验证它是否已经正确安装:

1
2
3
4
5
6
7
(venv3) tim@kali:~/bhp$ python
Python 3.7.5 (default, Oct 27 2019, 15:43:29)
[GCC 9.2.1 20191022] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from lxml import etree
>>> exit()
(venv3) tim@kali:~/bhp$

如果出现错误或版本为Python 2,请确保遵循了上述所有步骤,并拥有最新版本的Kali。

请记住,对于本书中的大多数示例,您可以在各种环境中开发代码,包括macOS、Linux和Windows。您可能还希望为不同的项目或章节设置不同的虚拟环境。有些章节是特定于Windows的,我们将确保会在该章的开头提到。

现在我们已经建立了黑客虚拟机和一个Python 3虚拟环境,让我们安装一个用于开发的Python IDE。

安装IDE

集成开发环境(IDE)提供了一组用于编码的工具。通常,它包括一个代码编辑器(具有语法高亮显示和自动检测功能)和一个调试器。IDE的目的是简化程序的编码和调试。在Python中,有时你不必使用IDE;对于小型测试程序,您可以使用任何文本编辑器(如vim、nano、Notepad或emacs)。但是对于更大、更复杂的项目,IDE能为您提供巨大的帮助,无论是通过显示已定义但未使用的变量、查找拼写错误的变量名,还是查找缺少导入的包。

在最近的一项Python开发人员调查中,最受欢迎的两个IDE是PyCharm(它有商业版和免费版)和Visual Studio Code(免费)。Justin是WingIDE(商业版和免费版)的粉丝,而Tim使用的是Visual Studio Code (VS Code)。这三个IDE都可以在Windows、macOS或Linux上使用。

你可以从 https://www.jetbrains.com/pycharm/download/ 安装PyCharm或从 https://wingware.com/downloads/ 安装WingIDE。你可以从Kali命令行安装VS Code:

1
tim@kali#: apt-get install code

或者,要获得最新版本的VS Code,从 https://code.visualstudio.com/download/ 下载并安装apt-get:

1
tim@kali#: apt-get install -f ./code_1.39.2-1571154070_amd64.deb

文件名的一部分的版本号可能与这里显示的不同,所以请确保您命令行中使用的文件名与您下载的文件名匹配。

编码风格

无论您使用什么来编写程序,遵循代码格式指南都是一个好主意。代码风格指南提供了一些建议,以提高Python代码的可读性和一致性。它可以让你以后阅读时更容易理解你自己的代码,或者如果你决定分享它给他人阅读。Python社区有一个这样的指导原则,称为PEP 8。你可以在这里阅读PEP 8的完整指南:https://www.python.org/dev/peps/PEP-0008/

本书中的示例通常遵循PEP 8,但有一些区别。您将看到本书中的代码遵循如下模式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[1]
from lxml import etree
from subprocess import Popen
[2]
import argparse
import os
[3]
def get_ip(machine_name):
pass
[4]
class Scanner:
def __init__(self):
pass
[5]
if __name__ == '__main__':
scan = Scanner()
print('hello')

在程序的顶部,我们导入需要的包。第一个导入块[1]的形式是from XXX import YYY类型。每个导入行按字母顺序排列。

同样的道理也适用于第[2]部分模块导入——它们也是按字母顺序排列的。这种顺序可以让您在不读取每一行导入内容的情况下查看是否已经导入了一个包,并确保您不会导入一个包两次。这样做的目的是为了保持代码的整洁,减少在重新阅读代码时需要考虑的问题。

接下来是[3]的函数,然后是[4]的类定义(如果有的话)。有些程序员从不使用类,而只使用函数。这些没有固定的规则,但是如果您发现试图使用全局变量来维护,或者将相同的数据结构传递给多个函数,这时如果您将程序重构而使用一个类,它将更容易理解。

最后,底部[5]的主块为您提供了以两种方式使用代码的方案。首先,您可以从命令行使用它。在这种情况下,模块的内部名称是__main__,并且main模块可以执行。例如,如果包含该代码的文件名为 scan.py ,你可以从命令行调用它,如下所示:

1
python scan.py

这将加载 scan.py 中的函数和类并执行主块。您将在控制台上看到输出hello。

其次,您可以将代码导入另一个程序而不会有任何副作用。例如,您可以这样导入代码

1
import scan

因为它的内部名称是Python模块的名称 scan ,而不是__main__,所以你可以访问该模块定义的所有函数和类,但是main模块不会被执行。

您还会注意到,我们避免使用泛型名称的变量。你越善于命名你的变量,就越容易理解这个程序。

现在您应该有一个虚拟机、Python 3、一个虚拟环境和一个IDE。现在让我们开始一些真正的有趣的事!