cean-2.0.sh使用的小技巧 — 一个文件既包含shell脚本,又包含压缩包数据

     cean-2.0.sh为CEAN在Linux的安装器,使用Vim打开后发现shell文件末尾为一些二进制乱码,查看该文件中的shell语句,安装过程并没有进行联网,且shell语句并且比较少。故怀疑文件后面的二进制是有用的,用于进行安装CEAN。查看该文件,发现其中有如下逻辑:

     app=cean

     ext=”tar -zxf -”

     dd if=$0 bs=512 skip=2 2>/dev/null | (cd $app; $ext)

     test -x $app/bin/postinstall.sh && (cd $app; bin/postinstall.sh $*)

     故猜想文件后面的二进制为压缩包数据,使用dd把该数据提取出来,再使用tar进行解压,使用解压后的bin/postinstall.sh进行安装。

     尝试使用dd if=cean-2.0.sh bs=512 skip=2 2>/dev/null > a.tgz,得到压缩包,的确可以解压并查看a.tgz的内容而没有提示文件受损,说明文件后面的数据的确为压缩包数据。

     从此可知道在一个文件存放两种不同格式数据的方法,另外格式的数据可使用dd在指定偏移处读取,为了偏移对齐某个整数(如512),可在两种格式数据间插入\0。该方法类似于在图片中隐藏包含压缩包。但本人觉得使用该方法制作发布版本不如发布一个压缩包,压缩包里面再包含执行安装的shell及相关文件,不仅不利于用户理解,且制作发布版本过程相对比较复杂。

阅读全文...

使用Vundle管理Vim插件

    Vundle使有子目录管理每个Vim插件,配置安装插件名称或代码仓库后,Vundle自动联网使用git下载安装Vim插件,配置Vim插件来源时,比vim-addon-manager更灵活。对于没有使用的插件,可方便一次全部删除。
一、安装配置
    过程参见https://github.com/gmarik/vundle/。
    1. 安装Vundle:
        $ git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
    2. 配置bundles,把如下内容增加到~/.vimrc:
        set nocompatible               ” be iMproved
        filetype off                   ” required!
       
        set rtp+=~/.vim/bundle/vundle/
        call vundle#rc()
       
        ” let Vundle manage Vundle
        ” required!
        Bundle ‘gmarik/vundle’
       
        ” My Bundles here:
        “
        ” original repos on github
        Bundle ‘tpope/vim-fugitive’
        Bundle ‘Lokaltog/vim-easymotion’
 &nb阅读全文...

使用vim-addon-manager管理Vim插件

    默认Vim所有插件都放到~/.vim/plugin/目录中,插件多了,不便于管理,要删除,不知要删除那些文件。vim-addon-manager使用子目录管理每个Vim插件以解决该问题,执行相关VAM命令或配置自动激活插件,vim-addon-manager会自动联网使用git下载安装Vim插件到独自的目录中。使用vim-addon-manager安装Vim插件时,对于某些插件,可能插件名称不容易查询得到。
一、安装vim-addon-manager
    从http://www.vim.org/scripts/script.php?script_id=2905 下载 vim-addon-manager-9999.zip
    解压后,打开doc/vim-addon-manager.txt 文件,或不下载压缩包,直接在浏览器打开https://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager-getting-started.txt文件,查看第2节 Installation 的安装说明,把如下内容粘贴到.vimrc 文件中:
        fun SetupVAM()
          ” YES, you can customize this vam_install_path path and everything still works!
          let vam_install_path = expand(‘$HOME’) . ‘/.vim/vim-addons’
          exec ‘set runtimepath+=’.vam_install_path.’/vim-addon-manager’

          ” * unix based os users may want to use this code checking out VAM
          ” * windows users want to use http://mawercer.de/~marc/vam/index.php
          “   to fetch VAM, VAM-known-repositories and the listed plugins
          “   without having to install curl, unzip阅读全文...

启用VMware共享目录

     在虚拟机上开发PHP程序,在本机的Zend Studio上调试PHP程序,配置Xdebug后,调试时需要本机代码与服务器(虚拟机)上的代码一致,故想在虚拟机配置到本机代码目录的共享,再在虚拟机上的共享目录内建立到服务器网页根目录的软链接,这样在服务器上的代码变化会实时在本机代码目录体现出来,但后来试验发现不能在共享目录内创建到服务器网页根目录的软链接。安装VMware Tools后,可不用配置samba,就可实现Windows、Linux系统的文件共享,现对虚拟机启用共享目录进行说明。

1. 设置host computer共享的目录:

     打开虚拟机,先不要启动虚拟机系统,选择VMware Workstation程序菜单中 VM>Settings>Options>Shared Folders ,“Folder sharing”中选择“Always enabled”,点击对话框右下的“add”按钮,点击“Next”,在文本框“name”中输入共享目录的名字(这里填写的目录名以后在虚拟机的linux系统中将显示出同样的目录名),假设为www;在“host folder”中填入host computer中windows系统想要共享出来的目录,假设为G:wamp\www,然后点击“完成”。

     下一个对话框是选择共享的方式: Enable this share 是指这个共享长期有效,目录可读写;Read-only 是指这个共享长期有效,目录只读;Disable after this session 是指下次ghost computer被关闭或挂起后,共享将会失效。一般情况下选择“Enable this share”,然后点击“Finish”。

2. 共享目录的使用

     配置后的共享目录在虚拟机内系统的/mnt/hgfs目录下,在虚拟机系统内执行:ls /mnt/hgfs,可以看到共享目录,可以用cp等指令实现windows到linux,linux到windows的读写操作了,但不能建立软硬链接到虚拟机系统的文件系统。

     如果/mnt/hgfs文件夹里没有共享目录,输入lsmod,看看输出内容是否有vmhgfs,如没有,执行sudo vmware-config-tools.pl 重新配置vmware-tools,或重新安装vmware-tools。

参见:VMWare Tools 和 Shared folder(共享文件夹)

How do I mount shared 阅读全文...

Perl Curl模块

Perl Curl模块:WWW::Curl

一、安装

     参见README:  # perl Makefile.PL && make && make test && make install

     注:The Makefile.PL script will try to use the ‘curl-config’ command to find the correct headers and libcurl path. If curl.h can’t be found, either through curl-config or the internal list of guesses, you can specify an explicit path when building the Makefile:

         perl Makefile.PL /home/foo/curl/include

     If you want to specify which curl-config to use instead of the first in path, set the environment variable CURL_CONFIG to point at the curl-config to use.

二、例子:

1. 提交请求:

    my $curl = WWW::Curl::Easy->new;

    my $cookie_file = ‘/data/nialltan/utility/cookie.txt’;

    # 响应包含响应头

    $curl->setopt(CURLOPT_HEADER,1);

    # 跟随响应头Location进行跳转请求

    $curl->setopt(CURLOPT_FOLLOWLOCATION,1);

    $curl->setopt( CURLOPT_CONNECTTIMEOUT,8);

    # 指定记录和读取cookie信息的文件

    $curl->setopt(CURLOPT_COOKIEJAR,$cookie_file);

    $curl->setopt(CURLOPT_COOKIEFILE,$cookie_file);

    my @post_data=(“id=1″,”name=tom”);

    my $post_data = join(‘&’,@post_data);

    # print “———-post_data:$post_data——-\n”;

    # 设置POST请求数据

    $curl->setopt(CURLOPT_P阅读全文...

libcurl 使用

一、安装

     方法 参见安装包内的docs/INSTALL文件。 # ./configure && make && make install

作为第三方库使用:

     1、# ./configure –prefix=/tmp/curl && make && make install

     2、拷贝/tmp/curl目录中的 include 和 lib 目录到项目的 include和lib 目录

     3、静态编译需指定链接库 -lrt ,否则会出现链接错误:undefined reference to `clock_gettime’;指定链接库-lrt ,否则会出现链接错误:undefined reference to ‘inflate’。-lrt -lz需放在-lcurl后面,否则还是会出现以上错误。

二、函数说明

* curl_global_init() 在使用libcurl之前进行全局初始化。 整个程序只调用一次。

* curl_global_cleanup() 在不再使用libcurl,以相反顺序的操作清理curl_global_init()初始化的资源。整个程序只调用一次。

* easyhandle = curl_easy_init(); 在每个线程中使用一个句柄,不要在多个线程中使用同一个句柄。 

* curl_easy_setopt() 对句柄设置属性和选项,设置保持不变直到改变设置。

* curl_easy_perform(easyhandle); 执行传输,如果回调函数返回值不等于传递给他的字节数,libcurl会中止执行。会多次调用CURLOPT_WRITEFUNCTION选项设置的回调函数,curl_easy_perform()执行完之后,也传输完数据。

<> 函数返回值可参考各函数说明,或使用man libcurl-errors 查看返回值说明。

三、curl_easy_getinfo()函数说明

curl_easy_getinfo()函数的作用是获取一个curl连接资源句柄的信息,curl_easy_getinfo()函数有两个参数,第一个参数是curl的资源句柄,第二个参数是下面一些常量:

* CURLINFO_EFFECTIVE_URL

     最后一个有效的url地址

* CURLINFO_HTTP_CODE

     最后一个收到的HTTP代码

* CURLINF阅读全文...

获取客户端IP

获取客户端IP — REMOTE_ADDR,HTTP_VIA,HTTP_X_FORWARDED_FOR,HTTP_CLIENT_IP,HTTP_X_REAL_IP

使用代理服务器转发的请求类似以下例子:

GET / HTTP/1.1

Host: www.example.com

X-Forwarded-For: 123.45.67.89

Via: 1.1 134.51.59.129 (MyProxy/1.0)


REMOTE_ADDR

The IP address of the agent sending the request to the server. Not 

necessarily that of the client.

     REMOTE_ADDR = hostnumber

     hostnumber  = digits “.” digits “.” digits “.” digits

     digits      = 1*digit

注意:HTTP/1.1中没有Remote_Addr头,REMOTE_ADDR是服务端根据连接得到对端IP而设置的环境变量。

     在Nginx中配置 proxy_set_header  Remote_Addr  $remote_addr;     设置REMOTE_ADDR,或 在客户端代码中设置了 HTTP头信息,那么在服务器端,这三个值应该分别通过 HTTP_REMOTE_ADDR、HTTP_VIA 、HTTP_X_FORWARDED_FOR 这三个属性来读取,注意读取时要在前面加前缀HTTP_。

     REMOTE_ADDR 属性是无法设置的,设置的只是HTTP_REMOTE_ADDR。HTTP_VIA 、HTTP_X_FORWARDED_FOR可以随意修改,故在客户端使用时要对其进行验证。

使用代理服务器后,要想不改动程序,仍使用REMOTE_ADDR得到客户端IP,需要apache上安装个第三方的mod — mod_rpaf

    说明:http://stderr.net/apache/rpaf/

    (It changes the remote address of the client visible to other Apache modules when two conditions are satisfied. First condition is that the remote client is actually a proxy that is defined in httpd.conf. Secondly if there is an incoming X-Forwarded-For header and the proxy is in it’s list of known proxies i阅读全文...

Nginx 日志出现400错误

==> /data/xxx/nginx_logs/error.log <==

2011/11/18 16:37:16 [info] 15786#0: *9 client closed prematurely connection while reading client request line, client: xxx.6.36.115, server: xx.xxx.com

==> /data/xxx/nginx_logs/access.log <==

127.0.0.1 – - [18/Nov/2011:16:37:16 +0800] “-” 400 0 “-” “-” “-” 0.000

400返回状态码表示 Bad Request,因为错误的语法导致服务器无法理解请求信息。

网上文章 nginx + cookies + firefox = 400 Bad Request,NGINX 400错误排查 说是由于request header过大,通常是由于cookie中写入了较长的字符串引起的。

解决方法为调大client_header_buffer_size,large_client_header_buffers的值,如

client_header_buffer_size 32k;
large_client_header_buffers 4 32k;

client_header_buffer_size 指令说明

语法:client_header_buffer_size size

默认值:1k

使用字段:http, server

指令指定客户端请求头部的缓冲区大小,绝大多数情况下一个请求头不会大于1k,不过如果有来自于wap客户端的较大的cookie它可能会大于1k,Nginx将分配给它一个更大的缓冲区,这个值可以在large_client_header_buffers里面设置。

large_client_header_buffers 指令说明

语法:large_client_header_buffers number size

默认值:large_client_header_buffers 4 4k/8k

使用字段:http, server

指定客户端一些比较大的请求头使用的缓冲区数量和大小。请求行(Request-Line   = Method SP Request-URI SP HTTP-Version CRLF)不能大于一个缓冲区大小,如果客户端发送一个比较大的头,nginx将返回”Request URI too large” (414)

同样,请求的头部最长字段不能大于一个缓冲区,否则服务器将返回”Bad request” (400)。

缓冲区只在需要时是分开的。默认一个缓冲区大小为操作系统中分页文件大小,通常是4k或8k,如果一个连接请求最终将状态转换为keep-alive,它所占用的缓冲区将被释放。

但127.0.0.1是本机发起的请求,请求为空,发送字节为0,referer、user_agent也为空阅读全文...

WIN7/XP系统在局域网文件共享设置方法

     先要启用来宾账户,打开控制面板–系统与安全–打开管理工具–双击计算机管理–本地用户和组,找到GUEST(来宾账户)–右击属性–将账户已禁用的勾去掉,也就是启用来宾账户–确定。

     还有要注意的是访问共享目录时,使用\\ip(如\\192.168.10.100)的形式访问共享目录,本人一开始使用\\计算机名(如test-pc)访问,可以列出目录,但访问目录总是提示不能访问,还以为哪里设置错误,改成使用\\ip的形式即可访问共享目录。

后续设置参见 WIN7/XP系统在局域网文件共享设置方法

阅读全文...

巧用VMware虚拟机NAT端口映射使外网访问虚拟机

     如果虚拟机网络连接方式配置为NAT,则本机和虚拟机可互相访问,虚拟机可通过本机的路由功能访问外网,但外网机器不能访问虚拟机。对于外网机器访问使用路由器上网的内网机器具有同样的问题,但对于路由器,可配置端口映射解决该问题。当外网机器访问内网某个服务,路由器根据端口映射规则,将访问某个对外端口的请求转发给内网某台真正提供服务的机器,从而使得外网机器可访问内网机器提供的服务。对于使用NAT方式访问网络的虚拟机,可以使用类似的方式配置NAT端口映射,使得外网机器可访问虚拟机提供的服务。

     配置方法如下:

     打开“编辑–虚拟网络设置”,选择类型为NAT的VMnet8,打开“NAT设置”,点击“增加”,即可根据需要进行如下配置:

          主机端口,填入真实主机要被转换的端口,外网访问使用该端口访问,如1021。

          类型根据服务类型配置,可选择TCP、UDP类型都配置。

          虚拟机IP地址,填入内网虚拟机的IP,如192.168.10.4;

          虚拟机端口,填入虚拟机提供服务的端口,如提供FTP服务的21端口。

     配置后,如本机IP为221.196.193.220,可使用 ftp://221.196.193.220:1021 访问 虚拟机提供的FTP服务。如果访问还有问题,可能要把1021端口添加到防火墙的例外中。如使用路由器上网,还需在路由器配置端口映射,配置规则类似,只不过多配了一层映射,外网访问路由器的ip和配置的端口。

参见:巧用VMware虚拟机NAT端口映射使外网访问虚拟机

阅读全文...