代理上网行为检测逃脱之本地路由引导+SSH隧道

相信很多公司为了限制员工上网,都会选择一些深信服的设备对用户的流量做控制,一般只会给用户普通的权限,比如只允许浏览某些网页啦,打开个优酷都会被拦截啦。本文简单介绍一个在现有只允许打开某些网站的情况的,简历SSH隧道,把SSH隧道再塞进HTTP流里面去。示意图大致如下:

13898000658030

这个模型首先需要用户在公网有一台服务器(vps之流,并可以SSH上去)

思路:

本地去往公网的路由都通过一个小软件导导入到HTTP流中去,例如:Proxifier(这里可以跟路由把不支持代理功能的软件通过路由的方式把数据流导入到HTTP流中去)。这一步完成之后也就是你可以让所有软件都通过HTTP代理出去。

但是问题来了,这个依然是不加密的,改限制的网站依然会被限制。这个时候就用到了外网的那台开启了SSH功能的VPS,通过CRT(SecureCRT)用SSH链接到公网的VPS(此时所以数据流都可以通过Proxifier出去)。

到了这一步,前面的准备的工作已经完成,然后进行二次代理,以Firefox为例:

插件:autoproxy,设置127.0.0.1 端口号32768。然后在SecureCrt里面选择Option—>Session option—>port forwarding 。然后点击add,如下图所示:

13898008565439

上图中的32768即是SecureCrt在本地进行监听的端口号。

点击OK之后会在本地看到32768端口正在监听,如下图:

13898009931378

到了这里,双击Firefox的AutoProxy按钮,就可以畅通无阻的走起来了。检测不到里面的数据,这些行为监控之类的代理设备就形同虚设了。

Chrome神器Vimium快捷键学习记录

今天下午折腾了一下Chrome下面的一个插件Vimium的使用,顿时发现该插件功能强大,能够满足减少鼠标的使用。至于为何要使用这个插件,源于我手腕上的伤一直没有好,使用鼠标的时候有轻微的疼痛。而且,由于我一般都是在SNS网站上停留,在人人和微博比较多,所以实际上发现每次看完一个一个页面都要点下一页的感觉很不爽,而同时最近在学习Vim,所以想到如果能够实现几个简单的快捷键,那么会相当方便。为此Google之,发现了这个给力的插件,以下为我的学习笔记。

Vimium使用快捷键总结

Vimium-help-graphic

 

j,

: Scroll down

k,

: Scroll up

h

: Scroll left

l

: Scroll right

gg

: Scroll to the top of the page

G

: Scroll to the bottom of the page

zH

: Scroll all the way to the left

zL

: Scroll all the way to the right

d

: Scroll a page down

u

: Scroll a page up

r

: Reload the page

gs

: View page source

yy

: Copy the current URL to the clipboard

yf

: Copy a link URL to the clipboard

gu

: Go up the URL hierarchy

i

: Enter insert mode

gi

: Focus the first (or n-th) text box on the page

f

: Open a link in the current tab

F

: Open a link in a new tab

: Open multiple links in a new tab

b

: Open a bookmark in the current tab

B

: Open a bookmark in a new tab

[[

: Follow the link labeled previous or <

]]

: Follow the link labeled next or >

gf

: Cycle forward to the next frame on the page

j: 向下移动。
k:向上移动。(不明白默认的表示是啥用法,使用了c-y这三个键没有效果)
h:向左移动。
l:向右移动。

zH:一直移动到左部。
zL:一直移动到右部。
gg:跳转到页面的顶部。
G:跳转到页面的底部。
d:向下翻页(相当于PageDown被按下了)
u:向上翻页(相当于PageUp被按下了)
r:重新载入该页(相当于F5刷新页面)

gs:查看页面源代码
yy:拷贝当前页面的URL到剪贴板
yf:拷贝某一个URL到剪贴板(实际上是相当于输入了f,然后出现很多编码的URL,选择某个之后,相当于拷贝了某个,因为一个页面中可能有很多超链接)

gu:跳转到父页面(比如http://www.douban.com/group/vim/,输入后跳转到父页面即http://www.douban.com/group/,所以不同于H的快捷键是回到上个历史页面)

i:输入模式(如果发现命令不起作用,可能是进入输入模式了,此时按Esc回到命令模式)
gi:将焦点集中到第一个输入框(输入gNi则焦点集中到第N个输入框)
f:在当前的页面打开一个新的链接。
F:在新的页面打开一个新的链接。

:在当前页面打开多个链接(没感觉使用到了多个标签,不过表示的是输入af)
b:在当前页打开一个书签。(输入部分网址会自动进行搜索)
B:在新的标签页打开一个书签

gf:循环到当前页面的下一个框层(可能跟页面制作有关,目前没用到)

查找模式:(和Vim相似)
/ : 查找
n: 向下查找匹配内容
N:向上查找匹配内容

导航历史:
H:回退上一个历史页面(相当于浏览器中的向左箭头)
L:回到下一个历史页面(相当于浏览器的向右箭头)

标签页操作:
K,gt:跳转到右边的一个标签页
J,gT:跳转到左边的一个标签页
t:创建一个新的标签页
x:关闭当前的标签页
X:恢复刚刚关闭的标签页
?:显示命令的帮助提示(再按一次关闭)
(红色为常用的命令)

另外,在当前的标签页直接输入一个新的网址,按F6就OK了。这个基本的快捷键都不会,搜了半天才搞定,汗~
发现学习一个新的东西也不是很费时间,而且能够提高效率,看来还是要折腾啊,年轻不折腾就会退步,就像工作以后就没心思倒腾了一样,退步不少啊!

附linuxToy的部分说明(http://linuxtoy.org/archives/vimium.html):
Vimium 用法
页面浏览
j、k、h、l:向下/上/左/右滚动 
gg 和 G:移至页顶/页底 
Ctrl + d 和 Ctrl + u:下/上翻页 
zi 和 zo:放大/缩小 
历史
H:后退 
L:前进 
标签页
t:打开新标签 
d:关闭标签 
u:还原标签 
J/K:下/上一个标签 
Hint 模式
f/F:进入 Hint 模式,后者会在新标签页中打开链接 

Embed Gists on your WordPress blog without a plugin

When I first started writing tutorial blog posts that involved posting code snippets I would add the code directly into the posts and use the SyntaxHighlighter Evolved plugin to render it readable on the front end. This sometimes worked, and sometimes didn’t.

Eventually I started using Gists on GitHub as public repositories for my code snippets, and installed a plugin on my site to embed and display the Gists in the blog posts. This worked okay, but it depended on a plugin.

Then I ran across a post by Christian Engvall (who cited Robert O’Rourke) with a way to embed Gists without a plugin, simply by placing the following code in your functions.php file or in a mu-plugin.

Gist – Embed Gists with a URL

Simply add the Gist URL to your post

With that code in place, all you need to do is add the URL of a Gist into your post (or page) on its own line and the Gist will be embedded in the post on the front end.

Remove your username from the Gist URL

Gist adds your username to the Gist URL, and if you leave that username in the URL in your post then it won’t embed the Gist – it will simply display the URL.

基于HTTP返回头信息的服务器时间同步

因为偶尔遇到由于各种原因,我们在使用ntpdate的时候无法成功的跟服务器同步时间的现象,而一般情况下我们对时间的精度要求都不是太高,所以想到可以使用根据HTTP头里面的信息来校时的做法。
之前看到一个使用php编写的脚本,但是考虑到很多机器是没有php环境的,因此选用shell来进行代码的编写,尽量保证通用。

PS:这篇文章正好测试一下Gist插件,看看效果如何。

Ctrl与Caps Lock键的交换

Emacs和VIM之所以这样受程序员的喜爱,是因为两者都有高度的可定制性,以及丰富的快捷键组合。利用这些快捷键组合,让你能够手不离键盘,就能完成大多数的工作。其实,用鼠标操作神马的,效率是极其低下的……

话说Emacs中,用到最多的两个快捷键组合,就是Meta键和Ctrl键。对于我们普通的键盘,Meta键还好,离手很近。不过,对于Ctrl键,就离得比较远了…… 网上有网友推荐的做法,是用手掌去按Ctrl键,不过,这样的方法,对于普通键盘还不错,但是对于笔记本来说,也不太实用。

正规的Unix键盘的键位布局,Ctrl键应该是在现在标准键盘的Caps Lock位置的。这样,按起Ctrl键,就方便多了。

那要怎么交换这两个键的键位呢?重新买一个键盘? No!! 其实,也不用换键盘,我们完全可以用软件的方式来实现两个键位的交换。
下面是我从网上整理来的方法:

Win7下交换键位的设置

其实Win7下面,方法还比较多,一种是直接修改注册表,实现全局的替换,另外一种,是让两个键的交换,只在Emacs窗口激活的时候生效。至于哪个更好,完全根据你自己的需要。

局部替换大法

这种方法,需要用到一个辅助软件,那就是大名鼎鼎的Auto Hotkey,简称AHK

编辑一个脚本,输入如下内容,保存,reload,即可生效:
IfWinActive emacs; 判断当前激活的窗口是否是Emacs,这是根据窗口标题实现的,如果你的标题不一样,请替换一下

Control::Capslock; 把Control替换为Capslock

Capslock::Control; 把Capslock替换为Control

IfWinActive

全局替换大法

可以利用第三方工具,或者直接在注册表中修改键位映射关系

注册表位置:[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] 如果没有此键,就新建一个

新建一个二进制值的Key,名叫:Scancode Map

输入如下的值:

00,00,00,00

00,00,00,00

03,00,00,00

3A,00,1D,00

1D,00,3A,00

00,00,00,00

前两行和最后一行,都是固定的,全部为0。第三行,表示你修改了几个键,其实我们只是改了两个键,不过最后那一行也要算进去,所以是3。

重点是在第四行和第五行。3A00,代表Caps Lock, 1D00,代表Ctrl。这一行,意思即为,将Caps Lock映射为Ctrl

第五行,就不用说了,意思刚好相反。

修改完毕后,重新登录Windows即可生效!

下面附上各个键位值的参考:

Escape 01 00

Tab 0F 00

Caps Lock 3A 00

Left Alt 38 00

Left Ctrl 1D 00

Left Shift 2A 00

Left Windows 5B E0

Right Alt 38 E0

Right Ctr l1D E0

Right Shift 36 00

Right Windows 5C E0

Backspace 0E 00

Delete 53 E0

Enter 1C 00

Space 39 00

Insert 52 E0

HOME 47 E0

End 4F E0

Num Lock 45 00

Page Down 51 E0

Page Up 49 E0

Scroll Lock 46 00

Mac OS下交换键位设置

Mac OS Lion下,非常简单,甚至不需要任何第三方软件,直接在键盘设置里面修改即可。当初我还google了一下文章,有的说需要装键盘驱动,有的说要用第三方软件,其实没那么麻烦,Lion已经有这个功能了……

Linux挂载Windows共享文件夹或硬盘分区

好久没使用过samba了,刚刚需要在Fedora9下挂载Windows共享时,准备使用smbmount,执行smbmount的时候,提示没有这个命令,系统samba也安装了呀,为什么没有呢,google下才知道,从Fedora9以后就没有smbmount这个概念了,而是使用cifs (Common Internet File Systemcifs),也就是说在这以后的系统直接使用mount加参数cifs就可直接挂载Windows的共享了.

使用方法:

先在你的xp电脑里面添加一个共享的文件夹linux

#mount -t cifs -o username=fish,password=fish //192.168.1.10/linux /mnt/linux

这样就可以了很是方便

但是如果你要挂载你的硬盘分区的话,同样设置你的硬盘分区d为共享但是主要你的共享名称一定要是英文

#mount -t cifs -o username=fish,password=fish //192.168.1.10/ld /mnt/d

这样也可以的

如果你要卸载你挂载的东西

#umount /mnt/linux

#umount /mnt/d

就可以了

备注:

说明一下,cifs是MS的一种通用的协议,Windows下的网上邻居访问其它计算机就是使用cifs协议.

服务器批量执行工具 PSSH

操作一台服务器的时候可以 ssh,操作多台服务器可以开多个窗口多个 ssh,那操作很多台服务器呢?

我们的一个 Oracle Gird Engine 集群上大概有60多台 Ubuntu 服务器作执行节点,这些服务器操作系统和软件配置完全一样(上线后由 puppet 统一配置),有时候我们需要在这些服务器上做同样的操作,这个时候特别适合使用 PSSH 这种 ssh 批量操作工具。

当然,如果对 Python 不恐惧的话也可以用 Fabric 批量执行服务器任务。

下载和安装 pssh:

$ git clone http://code.google.com/p/parallel-ssh/
$ cd parallel-ssh/
$ sudo python setup.py install

批量执行

首先新建一个服务器列表文件,把需要操作的服务器的 hostname(或者 IP 地址)加进去,然后就可以批量执行 uptime 命令了,-l 指定登录用户名,-A 询问密码,-h 指定服务器列表文件:

$ vi grids
grid01
grid02
grid03
grid04
grid05

$ pssh -i -l root -A -h grids 'uptime'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 05:42:09 [SUCCESS] grid01
11:42:09 up 620 days, 20:30, 0 users, load average: 6.09, 6.14, 6.13
[2] 05:42:09 [SUCCESS] grid03
11:42:09 up 620 days, 20:29, 0 users, load average: 9.01, 9.04, 9.05
[3] 05:42:09 [SUCCESS] grid05
11:42:09 up 620 days, 20:10, 0 users, load average: 8.46, 8.18, 8.10
[4] 05:42:09 [SUCCESS] grid04
11:42:09 up 620 days, 20:25, 0 users, load average: 6.00, 6.01, 6.05
[5] 05:42:10 [SUCCESS] grid02
11:42:10 up 606 days, 2:07, 0 users, load average: 6.03, 6.02, 6.01

批量上传

批量上传本地文件 linux-3.14.3.tar.xz 到服务器上的 /tmp 目录:

$ pscp -l root -A -h grids linux-3.14.3.tar.xz /tmp/
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 05:56:16 [SUCCESS] grid01
[2] 05:56:16 [SUCCESS] grid03
[3] 05:57:04 [SUCCESS] grid05
[4] 05:57:04 [SUCCESS] grid04
[5] 05:57:05 [SUCCESS] grid02

批量下载

批量下载服务器上的某文件到本地,不用担心重名问题,因为 pssh 已经建立了 grid01, grid02, …, grid05 目录来存放下载的文件:

$ pslurp -l root -h grids -A /tmp/linux-3.14.3.tar.xz .
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 06:06:01 [SUCCESS] grid01
[2] 06:06:01 [SUCCESS] grid03
[3] 06:06:06 [SUCCESS] grid04
[4] 06:06:06 [SUCCESS] grid02
[5] 06:06:06 [SUCCESS] grid05

$ ls
grid01 grid02 grid03 grid04 grid05 grids linux-3.14.3.tar.xz parallel-ssh

批量同步

有时候我们需要保持开发机上(某目录里)的数据和服务器上的数据一致:

$ prsync -l root -h grids -A -r develop/ /tmp/production/
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 06:12:52 [SUCCESS] grid05
[2] 06:12:52 [SUCCESS] grid01
[3] 06:12:52 [SUCCESS] grid04
[4] 06:12:52 [SUCCESS] grid02
[5] 06:12:52 [SUCCESS] grid03

动态修改php的配置项

我们一般修改php的配置项都是在php.ini中修改。在php,ini中的修改会影响到所有使用php的程序。假如我想让修改只在某个域名下生效,该如何做呢?

使用ini_set()
首先想到的可能是使用ini_set()方法在脚本中修改。但是这个只能修改作用域为PHP_INI_USER和PHP_INI_ALL的配置项。具体配置项作用域说明请查看 PHP配置指令作用域说明

使用php_value
如果我访问wanke.etao.com下的url时,程序每次执行都自动加载一个header.php文件。但是,如果是通过shell脚本方式执行,就不要加载这个文件了。要实现这个需求,我们需要用到 auto_prepend_file 这个配置想。这个配置想的作用域是 PHP_INI_PERDIR 。 也就是说不能通过ini_set()方法设置。那我们可以通过php_value进行设置。

如果是apache+php的组合,我们可以在apache的配置文件中加入如下指令即可。

Php_value auto_prepend_file /home/www/wanke.etao.com/header.php

如果是nginx+php组合,可以加入如下指令

fastcgi_param PHP_VALUE “auto_prepend_file=/home/www/wanke.etao.com/header.php”;

注意,nginx中多次使用 PHP_VALUE时,最后的一个会覆盖之前的。如果想设置多个配置项,需要写在一起,然后用换行分割。如:

fastcgi_param PHP_VALUE “auto_prepend_file=/home/www/wanke.etao.com/header.php \n auto_append_file=/home/www/wanke.etao.com/external/footer.php”;

php官方对配置项设置的一些文档

php核心配置项说明
怎样修改配置设定
.user.ini 文件

OS X 支持 NTFS 读写

苹果的 OS X 明明已经支持 NTFS 分区读写, 但是默认情况还是按只读挂载, 查了些资料小修改了下, 就可以开启原生读写了
# 用 root 身份做如下操作 (高危! 请切记自己在干什么)
sudo -s

cd /sbin
# 将系统自带的挂载程序改名
mv mount_ntfs mount_ntfs_orig
# 新建我们要的挂载脚本并编辑
vim mount_ntfs

mount_ntfs
#!/bin/sh
/sbin/mount_ntfs_orig -o rw "$@"

# 保存退出后改一下权限
chmod a+x mount_ntfs
# 都搞定了, 退出 root 身份
exit

不过这个方法还有几个小问题要注意

1. 分区最好有卷标, 默认的 “未命名磁盘” 可能无法挂载. 如遇无法自动挂载可以先在终端下改个名再试
# 获取对应分区的 DiskIdentifier (类似 disk1s1 这样的)
diskutil list
# 分区重命名
diskutil rename disk1s1 newname

2. 网络上其他方法经常会让把脚本里的挂载参数加上 nobrowse, 这个参数就让挂载的分区不显示成新的移动磁盘, 然后又有一堆方法教怎么在 finder 侧边栏能快速访问这样挂载的 NTFS 分区. 其实 man mount 看明白 -o 参数后面的设定就明白了, 去掉那个画蛇添足的 nobrowse 吧

// 最后这个 nobrowse 的参数, 似乎加上后又是只能在 finder 显示但是不能写, 搜了下也没有合理的解释, 如果不行还是先加回去吧
// 为了方便访问, 可以在 finder 里用 cmd+shift+G 打开跳转, 输 /Volumes 进入所有磁盘目录, 然后在用 cmd+shift+T 将 /Volumes 保存到边栏

使用perl脚本输出可读的dmesg时间

#!/usr/bin/perl

use strict;
use warnings;

my @dmesg_new = ();
my $dmesg = "/bin/dmesg";
my @dmesg_old = `$dmesg`;
my $now = time();
my $uptime = `cat /proc/uptime | cut -d"." -f1`;
my $t_now = $now - $uptime;

sub format_time {
my @time = localtime $_[0];
$time[4]+=1; # Adjust Month
$time[5]+=1900; # Adjust Year
return sprintf '%4i-%02i-%02i %02i:%02i:%02i', @time[reverse 0..5];
}

foreach my $line ( @dmesg_old )
{
chomp( $line );
if( $line =~ m/\[\s*(\d+)\.(\d+)\](.*)/i )
{
# now - uptime + sekunden
my $t_time = format_time( $t_now + $1 );
push( @dmesg_new , "[$t_time] $3" );
}
}

print join( "\n", @dmesg_new );
print "\n";

脚本下载地址:dmesg.tar