curl 使用

1:46:00 PM 0 Comments

curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。

它支持多种协议,下面举例讲解如何将它用于网站开发。

一、查看网页源码

直接在curl命令后加上网址,就可以看到网页源码。我们以网址www.sina.com为例(选择该网址,主要因为它的网页代码较短):

  curl www.sina.com

  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  <html><head>
  <title>301 Moved Permanently</title>
  </head><body>
  <h1>Moved Permanently</h1>
  <p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
  </body></html>

如果要把这个网页保存下来,可以使用-o参数,这就相当于使用wget命令了。

  curl -o [文件名] www.sina.com

二、自动跳转

有的网址是自动跳转的。使用-L参数,curl就会跳转到新的网址。

  curl -L www.sina.com

键入上面的命令,结果就自动跳转为www.sina.com.cn

三、显示头信息

-i参数可以显示http response的头信息,连同网页代码一起。

  curl -i www.sina.com

  HTTP/1.0 301 Moved Permanently
  Date: Sat, 03 Sep 2011 23:44:10 GMT
  Server: Apache/2.0.54 (Unix)
  Location: http://www.sina.com.cn/
  Cache-Control: max-age=3600
  Expires: Sun, 04 Sep 2011 00:44:10 GMT
  Vary: Accept-Encoding
  Content-Length: 231
  Content-Type: text/html; charset=iso-8859-1
  Age: 3239
  X-Cache: HIT from sh201-9.sina.com.cn
  Connection: close

  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  <html><head>
  <title>301 Moved Permanently</title>
  </head><body>
  <h1>Moved Permanently</h1>
  <p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
  </body></html>

-I参数则是只显示http response的头信息。

四、显示通信过程

-v参数可以显示一次http通信的整个过程,包括端口连接和http request头信息。

  curl -v www.sina.com

  * About to connect() to www.sina.com port 80 (#0)
  * Trying 61.172.201.195... connected
  * Connected to www.sina.com (61.172.201.195) port 80 (#0)
  > GET / HTTP/1.1
  > User-Agent: curl/7.21.3 (i686-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18
  > Host: www.sina.com
  > Accept: */*
  > 
  * HTTP 1.0, assume close after body
  < HTTP/1.0 301 Moved Permanently
  < Date: Sun, 04 Sep 2011 00:42:39 GMT
  < Server: Apache/2.0.54 (Unix)
  < Location: http://www.sina.com.cn/
  < Cache-Control: max-age=3600
  < Expires: Sun, 04 Sep 2011 01:42:39 GMT
  < Vary: Accept-Encoding
  < Content-Length: 231
  < Content-Type: text/html; charset=iso-8859-1
  < X-Cache: MISS from sh201-19.sina.com.cn
  < Connection: close
  < 
  <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
  <html><head>
  <title>301 Moved Permanently</title>
  </head><body>
  <h1>Moved Permanently</h1>
  <p>The document has moved <a href="http://www.sina.com.cn/">here</a>.</p>
  </body></html>
  * Closing connection #0

如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。

  curl --trace output.txt www.sina.com

或者

  curl --trace-ascii output.txt www.sina.com

运行后,请打开output.txt文件查看。

五、发送表单信息

发送表单信息有GET和POST两种方法。GET方法相对简单,只要把数据附在网址后面就行。

  curl example.com/form.cgi?data=xxx

POST方法必须把数据和网址分开,curl就要用到--data参数。

  curl --data "data=xxx" example.com/form.cgi

如果你的数据没有经过表单编码,还可以让curl为你编码,参数是--data-urlencode。

  curl --data-urlencode "date=April 1" example.com/form.cgi

六、文件上传

假定文件上传的表单是下面这样:

  <form method="POST" enctype='multipart/form-data' action="upload.cgi">
    <input type=file name=upload>
    <input type=submit name=press value="OK">
  </form>

你可以用curl这样上传文件:

  curl --form upload=@localfilename --form press=OK [URL]

七、Referer字段

有时你需要在http request头信息中,提供一个referer字段,表示你是从哪里跳转过来的。

  curl --referer http://www.example.com http://www.example.com

八、User Agent字段

这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同设备,返回不同格式的网页,比如手机版和桌面版。

iPhone4的User Agent是

  Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7

curl可以这样模拟:

  curl --user-agent "[User Agent]" [URL]

九、cookie

使用--cookie参数,可以让curl发送cookie。

  curl --cookie "name=xxx" www.example.com

至于具体的cookie的值,可以从http response头信息的Set-Cookie字段中得到。

十、增加头信息

有时需要在http request之中,自行增加一个头信息。--header参数就可以起到这个作用。

  curl --header "xxx: xxxxxx" http://example.com

十一、HTTP认证

有些网域需要HTTP认证,这时curl需要用到--user参数。

  curl --user name:password example.com

【参考资料】

  * Using cURL to automate HTTP jobs

  * 教你学用CURL

JDBC-用元数据将结果集封装为List对象

11:21:00 PM 0 Comments

JDBC的方法里面有着一套对数据库元数据操作的API.通过这些API我们可以获得数据库以及驱动等信息,也可以获得结果集的一些信息.而有些信息平时用的也比较少,这里就不一一介绍.

在这里主要给大家演示一下DatabaseMetaData和ResultSetMetaData的用法.

先看下数据表结构

然后代码如下.依然借用上节整合的DBUtils和新演示类MetaOper

DBUtils.java


package com.test.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * @author Administrator
 * 模板类DBUtils
 */
public final class DBUtils {
    // 参数定义
    private static String url = "jdbc:mysql://localhost:3306/mytest"; // 数据库地址
    private static String username = "root"; // 数据库用户名
    private static String password = "root"; // 数据库密码
    private DBUtils() {
    }
    // 加载驱动
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            System.out.println("驱动加载出错!");
        }
    }
    // 获得连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
    // 释放连接
    public static void free(ResultSet rs, Statement st, Connection conn) {
        try {
            if (rs != null) {
                rs.close(); // 关闭结果集
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (st != null) {
                    st.close(); // 关闭Statement
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (conn != null) {
                        conn.close(); // 关闭连接
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
MetaOper.java 
package com.test.jdbc;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 
 * @author Administrator 
 * MetaOper: 通过ResultSetMetaData元数据,设置灵活查询语句
 * 
 */
public class MetaOper {
    public static void main(String[] args) {
        DbMeta();
        List<Map<String, Object>> datas = read("select * from users where id < 3");
        System.out.println("----------List数据返回------------");
        System.out.print(datas);
    }
    // 通过结果集元数据封装List结果集
    public static List<Map<String, Object>> read(String sql) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            conn = DBUtils.getConnection();
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            ResultSetMetaData rsmd = ps.getMetaData();
            // 取得结果集列数
            int columnCount = rsmd.getColumnCount();
            // 构造泛型结果集
            List<Map<String, Object>> datas = new ArrayList<Map<String, Object>>();
            Map<String, Object> data = null;
            // 循环结果集
            while (rs.next()) {
                data = new HashMap<String, Object>();
                // 每循环一条将列名和列值存入Map
                for (int i = 1; i < columnCount; i++) {
                    data.put(rsmd.getColumnLabel(i), rs.getObject(rsmd
                            .getColumnLabel(i)));
                }
                // 将整条数据的Map存入到List中
                datas.add(data);
            }
            return datas;
        } catch (Exception e) {
            throw new RuntimeException();
        } finally {
            DBUtils.free(rs, ps, conn);
        }
    }
    // 通过数据库元数据获得服务器信息
    public static void DbMeta() {
        Connection conn = null;
        try {
            conn = DBUtils.getConnection();
            DatabaseMetaData dbma = conn.getMetaData();
            System.out.println("----------数据库信息------------");
            System.out.println("数据库名称: " + dbma.getDatabaseProductName());
            System.out.println("驱动版本: " + dbma.getDriverVersion());
        } catch (Exception e) {
            throw new RuntimeException();
        }
    }
}
代码运行结果: 
----------数据库信息------------
数据库名称: MySQL
驱动版本: mysql-connector-java-5.0.8 ( Revision: ${svn.Revision} )
----------List数据返回------------
[{lastname=啡, age=22, firstname=咖}, {lastname=434, age=25, firstname=ni }]

linux运维常用命令一句话

12:46:00 PM 0 Comments

1、linux启动过程
开启电源 --> BIOS开机自检 --> 引导程序lilo或grub --> 内核的引导(kernel boot)--> 执行init(rc.sysinit、rc)--> mingetty(建立终端) --> shell

2、网卡绑定多IP
# ifconfig eth0:1 192.168.1.99 netmask 255.255.255.0

3、设置DNS、网关
# echo "nameserver 202.16.53.68" >> /etc/resolv.conf
# route add default gw 192.168.1.1

4、弹出、收回光驱
# eject
# eject -t

5、用date查询昨天的日期
# date --date=yesterday

6、查询file1里面空行的所在行号
# grep ^$ file

7、查询file1以abc结尾的行
# grep abc$ file1

8、打印出file1文件第1到第三行
# sed -n '1,3p' file1
# head -3 file1

9、清空文件
# true > 1.txt
# echo "" > 1.txt
# > 1.txt
# cat /dev/null > 1.txt

10、删除所有空目录
# find /data -type d -empty -exec rm -rf {} \;

11、linux下批量删除空文件(大小等于0的文件)的方法
# find /data -type f -size 0c -exec rm -rf {} \;
# find /data -type f -size 0c|xargs rm –f

12、删除五天前的文件
# find /data -mtime +5 -type f -exec rm -rf {} \;

13、删除两个文件重复的部份,打印其它
# cat 1.txt 3.txt |sort |uniq

14、攻取远程服务器主机名
# echo `ssh $IP cat /etc/sysconfig/network|awk -F = '/HOSTNAME/ {print $2}'`

15、实时监控网卡流量(安装iftop)
# /usr/local/iftop/sbin/iftop -i eth1 -n

16、查看系统版本
# lsb_release -a

17、强制踢出登陆用户
# pkill -KILL -t pts/1

18、tar增理备份、还原
# tar -g king -zcvf kerry_full.tar.gz kerry
# tar -g king -zcvf kerry_diff_1.tar.gz kerry
# tar -g king -zcvf kerry_diff_2.tar.gz kerry
# tar -zxvf kerry_full.tar.gz
# tar -zxvf kerry_diff_1.tar.gz
# tar -zxvf kerry_diff_2.tar.gz

19、将本地80端口的请求转发到8080端口,当前主机外网IP为202.96.85.46
-A PREROUTING -d 202.96.85.46 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.9.10:8080

20、在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 
crontab -e
0 6-12/2 * 11 * /usr/bin/httpd.sh

21、查看占用端口8080的进程
# netstat -tnlp | grep 8080
lsof -i:8080

22、在Shell环境下,如何查看远程Linux系统运行了多少时间?
# ssh user@被监控主机ip "uptime"

23、查看CPU使用情况的命令
""每5秒刷新一次,最右侧有CPU的占用率的数据
# vmstat 5
 
""top 然后按Shift+P,按照进程处理器占用率排序
# top

24、查看内存使用情况的命令
""用free命令查看内存使用情况
# free -m
""top 然后按Shift+M, 按照进程内存占用率排序
# top

 25、查看磁盘i/o
""用iostat查看磁盘/dev/sdc3的磁盘i/o情况,每两秒刷新一次
# iostat -d -x /dev/sdc3 2

26、修复文件系统
# fsck –yt ext3 /
-t 指定文件系统
-y 对发现的问题自动回答yes

 27、read 命令5秒后自动退出
# read -t 5 

28、grep -E -P 是什么意思
-E, --extended-regexp 采用扩展正规表达式。
-P,--perl-regexp 采用perl正规表达式

29、vi编辑器(涉及到修改,添加,查找)
插入(insert)模式
i    光标前插入
I    光标行首插入
a    光标后插入
A    光标行尾插入
o    光标所在行下插入一行,行首插入
O    光标所在行上插入一行,行首插入
G    移至最后一行行首
nG    移至第n行行首
n+    下移n行,行首
n-    上移n行,行首
:/str/          从当前往右移动到有str的地方
?/str?          从当前往左移动到有str的地方
:s/str1/str2/      将找到的第一个str1替换为str2  
:s/str2/str2/g      将当前行找到的所有str1替换为str2
:n1,n2s/str1/str2/g    将从n1行至n2行找到的所有的str1替换为str2
:1,.s/str1/str2/g      将从第1行至当前行的所有str1替换为str2
:.,$s/str1/str2/g      将从当前行至最后一行的所有str1替换为str2

30、linux服务器之间相互复制文件
copy 本地文件1.sh到远程192.168.9.10服务器的/data/目录下 
# scp /etc/1.sh king@192.168.9.10:/data/ 
 
copy远程192.168.9.10服务器/data/2.sh文件到本地/data/目录
# scp king@192.168.9.10:/data/2.sh /data/

31、使用sed命令把test.txt文件的第23行的TEST换成TSET.
# sed -i '23s/TEST/TSET/' test.txt
# sed -i '23 s/TEST/TSET/' test.txt

32、使history命令能显示时间
# export HISTTIMEFORMAT="%F %T "

33、如何查看目标主机192.168.0.1开放那些端口
# nmap -PS 192.168.0.1

34、如何查看网络连接
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

35、如何查看当前系统使用了那些库文件
# ldconfig -v

36、如何查看网卡的驱动版本
# ethtool -i eth0

37、使用tcpdump来监视主机192.168.0.1的tcp的80端口
# tcpdump tcp port 80 host 192.168.0.1

38、 如何看其它用户的邮件列表
# mial -u king

39、对大文件进行切割
按每个文件1000行来分割
# split -l 1000 httperr8007.log httperr

按照每个文件5m来分割
# split -b 5m httperr8007.log httperr

40、合并文件
取出两个文件的并集(重复的行只保留一份)
# cat file1 file2 | sort | uniq
取出两个文件的交集(只留下同时存在于两个文件中的文件)
# cat file1 file2 | sort | uniq -d
删除交集,留下其他的行
# cat file1 file2 | sort | uniq –u

41、打印文本模式下运行的服务
# chkconfig --list|awk '$5~/on/{print $1,$5}'

42、删除0字节文件
# find -type f -size 0 -exec rm -rf {} \;

43、查看进程,按内存从大到小排列
# ps -e  -o "%C  : %p : %z : %a"|sort -k5 -nr

44、查看http的并发请求数及其TCP连接状态
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

45、获取IP地址
# ifconfig eth0|sed -n '2p'|awk '{print $2}'|cut -c 6-30

perl实现获取IP地址:
# ifconfig -a | perl -ne 'if ( m/^\s*inet (?:addr:)?([\d.]+).*?cast/ ) { print qq($1\n); exit 0; }'

46、获取内存大小
# free -m |grep "Mem" | awk '{print $2}'

47、查看CPU核心数
# cat /proc/cpuinfo |grep -c processor

 48、查看磁盘使用情况
# df -h

49、查看有多少个活动的php-cgi进程
# netstat -anp | grep php-cgi | grep ^tcp | wc -l

50、查看硬件制造商
# dmidecode -s system-product-name