Drupal Entity API

D8 Entity可以通过Entity Validation API对多种方式(Form、REST)保存的Entity进行验证。

Entity是含有预定义方法的类

方法类型 方法示例
一般方法 $entity->id()
特定entity的特定方法 $node->getTitle()

注: 通常这些方法定义在interfaces中,目前还没有比较完备的D8 Traits文档
Classes, traits, and interfaces

处理器/调用 Handlers

entity处理器实际上是预定义了对entity进行处理的方法的类。

存储处理器 Storage handler – 支持载入、保存和删除entity等操作,包括对entity多次修订版本、多语言翻译版本和配置字段。

另外,除了存储处理器,还有其他的处理器例如许可控制处理器AccessControlHandler、视图处理器Viewing,列表处理器Listings,表单处理器Forms。

Entity的两种类型

  • Configuration Entity (由D8的Configuration系统使用,可以在安装时配置默认选项,注意Configuration Entity以文件的形式存在,而非存储在数据库表中,例如D8很多的模块下都有config目录,而该目录下的yml文件,一般都是Configuration Entity的配置文件。)
  • Content Entity (包含可配置的基础字段,并且可以根据需要添加其他额外字段,支持多版本和多语言。)

Entity类型

规范

模块的Entity的命名规范
例如:Transport模块定义了名称为Car的entity


/* Transport Car * Defines the Car entity class * * @ContentEntityType( * id = "transport_car", * label = @Translation("Transport Car"), * bundle_label = @Translation("Transport"), * handlers = { * "storage" = "Drupal\transport\CarStorage", * "storage_schema" = "Drupal\transport\CarStorageSchema", * "view_builder" = "Drupal\transport\CarViewBuilder", * "access" = "Drupal\transport\CarAccessControlHandler", * "views_data" = "Drupal\transport\CarViewsData", * "form" = { * "default" = "Drupal\transport\CarForm", * "delete" = "Drupal\transport\Form\CarDeleteForm", * }, * "route_provider" = { * "html" = "Drupal\transport\Entity\CarRouteProvider", * }, * "translation" = "Drupal\transport_car\CarTranslationHandler" * }, * base_table = "transport_car_data", * data_table = "transport_car_field_data", * translatable = TRUE, * list_cache_contexts = { "user.transport_car_grants:view" }, * entity_keys = { * "id" = "cid", * "bundle" = "transport type", * "label" = "title", * "langcode" = "langcode", * "uuid" = "uuid", * }, * field_ui_base_route = "entity.transport_car.edit_form", * common_reference_target = TRUE, * permission_granularity = "bundle", * links = { * "canonical" = "/transport/car/{transport_car}", * "delete-form" = "/transport/car/{transport_car}/delete", * "edit-form" = "/transport/car/{transport_car}/edit", * } * ) * * * transport/src/Entity/Car.php * Car Entity类定义文件 * */ namespace Drupal\trasnsport\Entity class Car extend ContentEntityBase { use EntityChangedTrait; public function carFunction1 () { //do something }; } # 位于modules/custom/transport/src/Entity/目录下

使用Gitlab

# Git global setup

git config --global user.name "your-user-name"
git config --global user.email "your-user-name@email.com"

# Create a new repository

git clone git@gitlab.com:your-user-name/repo-name.git
cd test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master

# Existing folder

cd existing_folder
git init
git remote add origin git@gitlab.com:your-user-name/repo-name.git
git add .
git commit -m "Initial commit"
git push -u origin master

# Existing Git repository

cd existing_repo
git remote add origin git@gitlab.com:your-user-name/repo-name.git
git push -u origin --all
git push -u origin --tags

为什么要安装Aria2

百度网盘限速,而Aria2是个十分强大的文件分片多线程下载工具,可以有效抵制限速。

为什么要采取编译安装

  1. Aria2的参数中-max-server-connection和-min-split-files很大程度上决定了网盘的下载速度。
  2. 默认参数中-max-server-connection(1,16),-min-split-files(1m,1g),下载服务器最大连接数16,肯定是不能满足高速下载要求的,而最小文件分片1M,尤其是当我们下载网盘上的小文件是,10M的文件按照最小1M的规格,要分成10片,Aria2最多只会分配10个线程去下载,即使是10M的小文件,也要耗用将近好几分钟的时间,效率党简直不能忍啊。
  3. 编译安装采取源代码的安装方式,允许我们修改Aria2核心的运行参数。在这里,我将-max-server-connection最高设置为256,-min-split-files最小设置为256k,大家可以根据自己电脑的性能来合理设置参数以提高下载速度。

具体安装过程

#下载源码
cd ~/Download/
git clone https://github.com/aria2/aria2.git
#修改源码
#aira2的基本配置选项大多都存储在文件OptionHandlerFactory.cc中
vi aria2/src/OptionHandlerFactory.cc
#定位到441行
#将服务器最大连接数16修改为256
    OptionHandler* op(new NumberOptionHandler(PREF_MAX_CONNECTION_PER_SERVER,
                                              TEXT_MAX_CONNECTION_PER_SERVER,
                                           // "1", 1, 16, 'x'));
                                              "1", 1, 256, 'x'));
#定位到第503行
#将最文件分片大小设置为256_k
#到此源代码需要修改的地方改完了
  OptionHandler* op(new UnitNumberOptionHandler(
//PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "1M", 1_m, 1_g, 'k'));
 PREF_MIN_SPLIT_SIZE, TEXT_MIN_SPLIT_SIZE, "1M", 256_k, 1_g, 'k'));

#安装编译依赖
#以下依赖仅限于macosx,linux参照官方文档
brew install libtool
brew install automake
brew install autoconf-archive

#编译安装
autoconf configure.ac
autoconf -i
./configure
make check
make
sudo make install
#如果你遇到 error: possibly undefined macro这说明编译缺乏依赖,需要安装相关依赖
#
#查看编译后的Aria2参数
aria2c --help
# 可以看到设置项的参数范围已经改变了
 -x, --max-connection-per-server=NUM The maximum number of connections to one
                              server for each download.

                              Possible Values: 1-256
                              Default: 1
                              Tags: #basic, #http, #ftp

 -k, --min-split-size=SIZE    aria2 does not split less than 2*SIZE byte range.
                              For example, let's consider downloading 20MiB
                              file. If SIZE is 10M, aria2 can split file into 2
                              range [0-10MiB) and [10MiB-20MiB) and download it
                              using 2 sources(if --split >= 2, of course).
                              If SIZE is 15M, since 2*15M > 20MiB, aria2 does
                              not split file and download it using 1 source.
                              You can append K or M(1K = 1024, 1M = 1024K).

                              Possible Values: 262144-1073741824
                              Default: 1M
                              Tags: #basic, #http, #ftp

#修改~/.aria2/aria2.conf配置文件使Aria2新设置生效
vi ~/.aria2/aria2.conf
#这里我只截取主要设置项
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=256
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=256k
#单文件最大线程数, 路由建议值: 5
split=256
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
...

到此结束。

PS.本文中的 shell 代指 bash

Shell 中的括号

小括号()

# 应用实例
# ()作为一个命令组
if ($i<5)
# "[" 意为test, "-lt" 意为less than 小于, "]"  意为关闭条件判断
if [ $i -lt 5 ]
# "-ne" 意为 不等于,] 后面的 "-a" 为逻辑操作符,等价于 "&&"
if [ $a -ne 1 ] -a [ $a != 2 ]
if [ $a -ne 1] && [ $a != 2 ]
if [[ $a != 1 && $a != 2 ]]

for i in $(seq 0 4);do echo $i;done
for i in `seq 0 4`;do echo $i;done
for ((i=0;i<5;i++));do echo $i;done
for i in {0..4};do echo $i;done



# 循环读取文件中的每一行并将该行作为参数,执行相关的命令
while read p; do
  echo "$p"
done < file.txt

  1. 单小括号 ()
    • 命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。
    • 命令替换。等同于cmd,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。
    • 用于初始化数组。如:array=(a b c d)。
  2. 双小括号 (( ))
    • 整数扩展。这种扩展计算是整数型的计算,不支持浮点型。((exp))结构扩展并计算一个算术表达式的值,如果表达式的结果为0,那么返回的退出状态码为1,或者 是”假”,而一个非零值的表达式所返回的退出状态码将为0,或者是”true”。若是逻辑判断,表达式exp为真则为1,假则为0。
    • 只要括号中的运算符、表达式符合C语言运算规则,都可用在$((exp))中,甚至是三目运算符。作不同进位(如二进制、八进制、十六进制)运算时,输出结果全都自动转化成了十进制。如:echo $((16#5f)) 结果为95 (16进位转十进制)
    • 单纯用 (( )) 也可重定义变量值,比如 a=5; ((a++)) 可将 $a 重定义为6。
    • 双括号中的变量可以不使用$符号前缀。括号内支持多个表达式用逗号分开。

中括号[]

  1. 单中括号 []
    • bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
    • Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号。如果实在想用,对于字符串比较可以使用转义形式,如果比较”ab”和”bc”:[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
    • 字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
    • 在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号或是索引。
  2. 双中括号[[ ]]
    • [[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
    • 支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
    • 使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
    • bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

关于单中括号 [] 和双中括号 [[]] 的区别,可以参照这里

大括号{}

$ ls {ex1,ex2}.sh
ex1.sh  ex2.sh
$ ls {ex{1..3},ex4}.sh
ex1.sh  ex2.sh  ex3.sh  ex4.sh
$ ls {ex[1-3],ex4}.sh
ex1.sh  ex2.sh  ex3.sh  ex4.sh
  1. 常规用法
    • 大括号拓展。

      (通配(globbing))将对大括号中的文件名做扩展。在大括号中,不允许有空白,除非这个空白被引用或转义。第一种:对大括号中的以逗号分割的文件列表进行拓展。如 touch {a,b}.txt 结果为a.txt b.txt。第二种:对大括号中以点点(..)分割的顺序文件列表起拓展作用,如:touch {a..d}.txt 结果为a.txt b.txt c.txt d.txt

    • 代码块,又被称为内部组,这个结构事实上创建了一个匿名函数。

      与小括号中的命令不同,大括号内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内变量。括号内的命令间用分号隔开,最后一个也必须有分号。{}的第一个命令和左括号之间必须要有一个空格。

  2. 几种特殊的替换结构

    • ${var:-string}和${var:=string}:若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string};对于${var:=string}的替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var: ${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
    • ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
    • ${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。
    • 补充扩展:在上面这五种替换结构中string不一定是常值的,可用另外一个变量的值或是一种命令的输出。
  3. 四种模式匹配替换结构
    • ${variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式
    • ${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
    • ${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式
    • ${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式
    • 这四种模式中都不会改变variable的值,其中,只有在pattern中使用了匹配符号时,%和%%,#和##才有区别。结构中的pattern支持通配符,表示零个或多个任意字符,?表示零个或一个任意字符,[…]表示匹配中括号里面的字符,[!…]表示不匹配中括号里面的字符
$ var=testcase
$ echo $var
testcase
$ echo ${var%s*e}
testca
$ echo $var
testcase
$ echo ${var%%s*e}
te
$ echo ${var#?e}
stcase
$ ${var##?e}
stcase
$ echo ${var##*e}

$ echo ${var##*s}
e
$ echo ${var##test}
case

Test 与 逻辑运算

判断一串命令的执行结果

# 判断文件夹知否为空
test `ls some-dir | wc -c` -eq 0 && echo "为空" || echo "非空"
# 以上命令等价于
test $(ls some-dir | wc -c) -eq 0 && echo "为空" || echo "非空"
[ $(ls some-dir | wc -c) -eq 0 ] && echo "为空" || echo "非空"
[[ $(ls some-dir | wc -c) -eq ]] && echo "为空" || echo "非空"
[[ $(ls some-dir | wc -c)=0 ]] && echo "为空" || echo "非空"
# 在实际的脚本中推荐使用含 双中括号 的第四种写法 "="等价判断两边不得含有空格,否则报错

为Composer/Git/Gulp/Brew/Npm/Pip/Drush添加自动补全

  1. 安装bash-completion

    Mac下是brew, Debian下面是Apt-get

  2. 从github的bash-it项目下载需要的自动补全bash脚本,放到/etc/bash-completion目录下

  3. vi /etc/bashrc 加入如下代码

function bash_completion_load(){

    local bash_completion=/etc/bash-completion

    if [[ -e $bash_completion ]] && [[ -d $bash_completion ]] && [[ $(ls $bash_completion | wc -c)!=0 ]]; then
        for completion_item in $(ls $bash_completion); do
            if [[ ${completion_item##*.}='bash' ]]; then
                chmod +x $bash_completion/$completion_item
                source $bash_completion/$completion_item
            fi
        done
    fi
}

bash_completion_load;

至于Debian Linux来说,直接把从github下载的补全脚本文件直接放到/etc/bash-completion.d/目录下就可以了。
需要添加执行权限

Drupal8 / Composer / Drush / Drupal Console 相关

修复features暴力卸载

修复由暴力卸载features模块生成的插件而导致的”The following module is missing from the file system…drupal…bootstrap…250…”错误。
drupal官网也有关于此问题的链接

  1. drush pmu module-name
  2. composer remove drupal/module-name
  3. drush sql-query “DELETE FROM key_value WHERE collection=’system.schema’ AND name=’module-name’;”
  4. drush cr
  5. 刷新 status report 页面,看错误是否还在。
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_catalogue';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_manufacturing_process';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_products';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_quick_details';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='b2bcms_standards';"
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='config_update';"
### 命令格式
drush sql-query "DELETE FROM key_value WHERE collection='system.schema' AND name='module_name';"

2017年07月25日20:43:25更新

实际上仅仅从上述数据库记录中依旧不能完全删除暴力卸载的残留。

Features包导入的配置项以自定义模块的方式安装到drupal中,除了在上述数据库中记录外,还会在core.extension配置项中留下记录。core.extension目测是以数据库记录的形式保存在数据库中,而不是yml明文配置文件的形式存储,对应网站后台的操作就是admin/modules, 这里记录用户安装卸载的模块的情况,所以需要从数据库中删除记录,而我找了一圈也没有找到具体这些模块记录是存储在哪一个表中,而系统的很多配置项大多是以序列化之后的形式存储在key_value表中,直接在数据库中修改序列化之后的数据是不现实的,而且这里也没有找到core.extension配置项。

除了直接动数据库这样的危险操作,还可以直接使用drush内置的config选项来灵活的修改系统选项。

#查看有哪些config相关的命令可以用
drush | grep config
 core-config (conf,    Edit drushrc, site alias, and Drupal settings.php files.
 config)
 core-quick-drupal     Download, install, serve and login to Drupal with minimal configuration and dependencies.
 site-install (si)     Install Drupal along with modules/themes/configuration using the specified install profile.
Config commands: (config)
 config-delete (cdel)  Delete a configuration object.
 config-edit (cedit)   Open a config file in a text editor. Edits are imported into active configuration after closing editor.
 config-export (cex)   Export configuration to a directory.
 config-get (cget)     Display a config value, or a whole configuration object.
 config-import (cim)   Import config from a config directory.
 config-list (cli)     List config names by prefix.
 config-pull (cpull)   Export and transfer config from one environment to another.
 config-set (cset)     Set config value directly. Does not perform a config import.

 #查看模块配置信息
 drush config-get core.extension

 #修改模块配置信息,删除无效模块
 drush config-edit core.extension
 #这里drush会呼叫vi编辑器,删除干扰的无效模块记录就可以了
 #保存修改后的记录,终端会提示core.extension配置项已更新
 #询问我们是否导入新的配置项,选择Y导入即可
            core.extension  update
Import the listed configuration changes? (y/n): y
#drush config-import可能需要config_update模块支持,如果提示你安装,安装该模块就可以了。

Drupal console generate:module命令不存在的问题

  1. MAC MAMP环境
  2. Drupal基于Github Composer-Drupal环境安装
  3. Composer基于Brew安装
  4. Drupal Console基于composer安装

使用Composer安装Drupal Console的办法

# 添加需要模块
composer require drupal/console:~1.0 --prefer-dist --optimize-autoloader
# 安装模块依赖组件
composer update drupal/console --with-dependencies

这里面有个问题,composer是基于项目的包管理工具,安装的包都是针对当前项目的,所以这里安装的drupalconsole(以下简称drupal)并没有默认安装在系统的/bin,/usr/bin/,/usr/share/bin等系统默认可以查找二进制命令的目录下,所以当你尝试运行drupal的时候,很可能会shell会报错,找不到drupal命令。

即使是使用 composer global require drupal/console:@stable 全局安装并且export PATH=”$HOME/.composer/vendor/bin:$PATH”添加路径支持,那么在drupal安装的根目录(对于composer-drupal安装方式来说,就是项目根目录下的web目录)下执行 drupal genernate:module 你还是会收到shell提示如下错误:

[Symfony\Component\Console\Exception\CommandNotFoundException]
Command “generate:module” is not defined.

原因是因为drupal[drupal-console]是PHP脚本文件,运行时会有很多依赖,而全局化安装,一些具体的特殊命令例如generate等,依赖没有安装到位,所以就造成了这样的问题。

解决办法

  1. 针对 composer 安装 drupalconsole的方式 (注意,这里不要使用composer全局安装drupalconsole,安装了也不能解决你的问题)。
    cat << EOF >> ~/.bash_profile
    # 利用composer项目文件结构的特点,添加alias,使用相对路径来执行 drupalconsole 命令
    alias drupal='../vendor/drupal/console/bin/drupal'
    EOF
    source ~/.bash_profile
    

    这里需要注意的是,drupalconsole命令需要在web目录内执行,否则由于路径的问题,这会提示你找不到命令。

  2. 如果你使用drupalconsole官网curl命令下载安装的方式,很可能就不会出现这种问题。这种办法我目前还没有验证过。

Vanish

最近忙着总结以往的工作经验,并将实践得出的结果运用于新项目Pegasus中,在Pegasus项目中技术选型的基础为LNMP+Drupal-8.X,由于D8是Heavily Based on OOP,因此在实际不出的时候就不得不考虑到性能的问题。

实际上决定D8响应速度的因素有很多,仅仅就服务端来说,将动态网站进行反向代理静态化是提高响应速度非常有效的解决办法。如果一台服务上有多个网站,而大多都是资源消耗比较高的网站的话,合理配置一台前端反向代理缓存服务器对于提高优化服务器的性能和提高网站的响应就十分重要了。

什么是Vanish

Varnish是一款高性能的、开源的Http反向代理服务器和缓存服务器。
Varnish基于多线程。
Varnish高速缓存于内存中。
Varnish具有更好的稳定性、更快的访问速度、更多的并发连接支持数,可以通过管理端口管理缓存等优势,在高并发状态下,Varnish消耗更多的CPU、I/O和内存资源。Varnish进程一旦挂起、崩溃或者重启,缓存的数据会从内存中释放,此时所有的请求都会转发到后端服务器上,给后端服务器造成很大压力。Varnish基于线程,可与充分应对高并发的使用场景。

Vanish配置示例

针对drupal的Varnish优化

备份用

Network(网络)
  • Scapy:一款强大的交互式数据报分析工具,可用作发送、嗅探、解析和伪造网络数据包。
  • pypcap、Pcapy和pylibpcap:配合libpcap一起使用的数据包捕获模块
  • libdnet:底层网络工具,含接口查询和以太网帧传输等功能
  • dpkt:可以快速简单地创建或解析数据包
  • Impacket:制作和解码网络数据包,支持NMB和SMB等高级协议
  • pynids:封装了libnids,可用于数据包嗅探、消除IP碎片、TCP流再封装和端口扫描检测
  • Dirtbags py-pcap:读取pcap文件
  • flowgrep:使用正则表达式检索数据包payload
  • Knock Subdomain Scan:使用字典(wordlist)对特定域名进行子域名枚举
  • Mallory:可扩展的TCP/UDP中间人代理,支持对非标准协议进行实时修改
  • Pytbull:灵活的IDS/IPS测试框架,包含300多种测试
Debugging and Reverse Engineering(调试和逆向工程分析)
  • Paimei:逆向分析框架,包含PyDBG、PIDA和pGRAPH
  • Immunity Debugger:用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析,拥有完整的图形用户界面,并提供了命令行调试器
  • mona.py:一款挖洞插件
  • IDAPython:IDA Pro插件,整合了Python编程语言,并支持在IDA Pro中运行脚本
  • PyEMU:支持脚本的完整IA-32模拟器,用于恶意软件分析
  • pefile:读取并操作PE文件
  • pydasm:提供了libdasmx86反汇编库的访问接口
  • PyDbgEng:封装了微软WindowsDebugging引擎
  • uhooker:拦截DLL内部的API调用,查看内存中可执行文件的任意地址
  • diStorm:针对AMD64的反汇编库,遵循BSD许可协议
  • python-ptrace:使用ptrace的调试器
  • vdb/vtrace:vtrace是一款通过Python调试API的跨平台工具,vdb是vtrace所使用的调试器
  • Androguard:可用于对Android应用进行逆向分析
Fuzzing(模糊测试)
  • Sulley: 集合了大量可扩展组件的模糊测试开发框架
  • Peach Fuzzing Platform: 基于生成和变异的模糊测试框架(可扩展性强)
  • antiparser: 模糊测试工具,提供了故障注入API
  • TAOF:包含ProxyFuzz,一款中间人网络模糊测试器
  • untidy:通用的XML模糊测试器
  • Powerfuzzer:高度自动化和完全可定制的Web模糊测试器
  • SMUDGE
  • Mistress:通过畸形数据测试文件格式和协议的工具,基于预定义模式
  • Fuzzbox:多媒体编解码模糊测试器
  • Forensic Fuzzing Tools:可生成模糊测试文件和模糊测试文件系统,文件系统中包含取证工具和测试系统
  • Windows IPC Fuzzing Tools:利用Windows进程间通信机制来对应用程序进行模糊测试的工具
  • WSBang:用于对Web服务进行自动化安全测试的Python工具
  • Construct:解析和构建数据结构的代码库
  • fuzzer.py (feliam):FelipeAndres Manzano 设计的一款简单的模糊测试工具
  • Fusil:编写模糊测试程序的代码库
Web
  • Requests:一个简单友好的HTTP库
  • HTTPie:有好的类cURL命令行HTTP客户端
  • ProxMon:处理代理日志,报告发现的问题
  • WSMap:寻找Web服务节点,扫描文件
  • Twill:通过命令行接口浏览Web,支持自动化Web测试
  • Ghost.py:Webkit Web客户端
  • Windmill:允许我们自动化测试和调试Web应用的Web测试工具
  • FunkLoad:该工具允许加载多功能的Web应用测试组件
  • spynner:支持Javascript/AJAX的可编程Web浏览模块
  • python-spidermonkey:桥接Mozilla SpiderMonkeyJavaScript引擎,允许对JavaScript脚本和函数进行测试和调用
  • mitmproxy:支持SSL的HTTP代理,可通过命令行接口实时拦截和编辑网络流量
  • pathod / pathoc:可向HTTP客户端和服务求提供畸形测试用例
Forensics(信息取证)
  • Volatility:从RAM样本中提取数据
  • LibForensics:开发数字取证应用的代码库
  • TrIDLib:通过代码签名识别文件类型
  • aft:Android取证工具-
Malware Analysis(恶意软件分析)
  • pyew:命令行十六进制编辑器和反汇编工具,主要用于分析恶意软件
  • Exefilter:过滤邮件、Web页面或文件中的文件格式,检测常见文件格式并能移除活动内容
  • pyClamAV:向Python软件中添加病毒检测功能
  • jsunpack-n:通用的JavaScript拆包工具,可枚举浏览器功能并检测漏洞,针对的是浏览器和浏览器插件漏洞
  • yara-python:识别和分类恶意软件样本
  • phoneyc:纯蜜罐系统
PDF
  • Didier Stevens’ PDF tools: 分析、识别和创建PDF文件,包括PDFiD、pdf-parser、make-pdf和mPDF
  • Opaf:开源PDF分析框架,可将PDF转换成可分析和修改的XML树
  • Origapy:封装了Origami Ruby模块,可对PDF文件进行安全审查
  • pyPDF:纯PDF工具,可提取、合并、加密和解密PDF内容
  • PDFMiner:从PDF文件中提取文字内容
  • python-poppler-qt4:绑定了Poppler PDF库,支持Qt4
杂项
  • InlineEgg:Python工具箱,可用于编写小型汇编程序
  • Exomind:开发开源智能模块的框架,以社交网络服务、搜索引擎和即时消息为中心
  • RevHosts:根据给定IP地址枚举出虚拟主机
  • simplejson:使用了 Google AJAX API的JSON解码/编码器
  • PyMangle:用于创建渗透测试工具所用字典(Wordlist)的命令行工具/代码库
  • Hachoir:查看和编辑代码流中的数据域
  • py-mangle:另一款用于创建渗透测试工具所用字典(Wordlist)的命令行工具/代码库
其他有用的库和工具
  • IPython:多功能增强型交互式Python Shell
  • Beautiful Soup:爬虫可能会用到的HTML解析器
  • Mayavi:3D科学数据虚拟化工具
  • RTGraph3D:创建3D动态图像
  • Twisted:事件驱动型网络引擎
  • Suds:用于Web服务的轻量级SOAP客户端
  • M2Crypto:最完整的OpenSSL封装器
  • NetworkX:图形库
  • Pandas:可提供高性能数据结构的数据分析工具
  • pyparsing:通用解析模块
  • lxml:采用Python编写的功能丰富且易于使用的XML和HTML工具
  • Whoosh:纯Python实现的全功能文本索引、搜索库
  • Pexpect:控制或实现其他程序的自动化,类似Don Libes Expect system
  • Sikuli:虚拟化技术,通过截图实现搜索和自动化GUI,可利用Jython进行脚本扩展
  • PyQt + PySide:Qt应用框架和GUI库所需模块

移除U盘

#使用 diskutil list 命令查看系统下已挂在的驱动器
your-user-name |=>$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 CAE7D100-6598-4C76-9720-6D58226B5857
                                 Unlocked Encrypted

#插入U盘再次运行 diskutil list 查看挂载驱动器列表
your-user-name |=>$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 CAE7D100-6598-4C76-9720-6D58226B5857
                                 Unlocked Encrypted
/dev/disk2 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *7.8 GB     disk2
   1:                 DOS_FAT_32 新加卷                  7.0 GB     disk2s1

#由两次运行的不同结果知道,U盘的设备名称为 /dev/disk2

#使用    diskutil unmountDisk 解除U盘的挂载以写入Kali镜像
diskutil unmountDisk /dev/disk2

#使用 dd 命令写入 Kali的镜像
sudo dd if=/Users/your-user-name/Downloads/kali-linux-2017.1-amd64.iso of=/dev/disk2 bs=1m

Git 配置全局代理

大多数时候国外的Git repository 都会被墙,而gitlab虽然没有被抢,但是上传和下载速度感人,很有必要配置代理项。

# 设置git代理
git config --global https.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
# 取消设置代理
git config --global --unset http.proxy
git config --global --unset https.proxy

以上的方式,其实我并不推荐,git其实可以按照项目来设置代理项
只需要在项目的.git/config配置文件中添加代理设置就可以了,没有必要完全设置为全局代理

cat << EOF >> .git/config
[http]
    proxy=http://127.0.0.1:1080
[https]
    proxy=https://127.0.0.1:1080
EOF

这样只会针对当前项目配置代理。

Git配置忽略OSX下的.DS_Store文件

#添加全局gitignore设置项
echo .DS_Store >> ~/.gitignore_global
#配置使设置生效
git config --global core.excludesfile ~/.gitignore_global
#如果你的commit中已经存在.DS_Store文件,使用如下命令从git记录中删除
cd your-project-root-directory
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
#如果你仅仅相对当前的项目忽略.DS_Store文件
cd your-project-root-directory
echo ".DS_Store" >> ./.gitignore
echo "**/.DS_Store" >> ./.gitignore