存档

作者存档

redsn0w_win_0.9.10b3下载,ios5.0.1完美越狱

2011年12月29日 没有评论

做个分享下载吧,原站点国内访问不了,redsn0w_win_0.9.10b1下载,ios5.0.1完美越狱
redsn0w_win_0.9.10b3

分类: 软件 标签:

非常有用的TC限速例子

2011年12月28日 没有评论
#!/bin/bash
DEV="tun0"
UPLINK=300
#下行downlink 3200 k 大概一半左右,以便能够得到更多的并发连接
DOWNLINK=2048
VIP1="192.168.1.159/32"
VIP2="192.168.1.163/32"
##两个vip用户
 
echo "==================== Packetfilter and Traffic Control 流量控制 By 网络技术部 Ver. 1.0===================="
 
start_routing() {
        echo -n "队列设置开始start......"
        #tc qdisc del dev $DEV root >null 2&>1
        #删除原来的队列
 
        #1.增加一个根队列,没有进行分类的数据包都走这个1:24是缺省类:
        tc qdisc add dev $DEV root handle 1: htb default 24
        #1.1增加一个根队下面主干类1: 速率为$UPLINK k
        tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0
 
        #1.1.1 在主干类1下建立第一叶子类,这是一个最高优先权的类.需要高优先和高速的包走这条通道,比如SYN,ACK,ICMP等
        tc class add dev $DEV parent 1:1 classid 1:11 htb rate $[$UPLINK]kbit ceil ${UPLINK}kbit prio 1
        #1.1.2 在主类1下建立第二叶子类 ,这是一个次高优先权的类。比如我们重要的crm数据.
        tc class add dev $DEV parent 1:1 classid 1:12 htb rate $[$UPLINK-150]kbit ceil ${UPLINK-50}kbit prio 2
 
        #1.2 在根类下建立次干类 classid 1:2 。此次干类的下面全部优先权低于主干类,以防重要数据堵塞.
        tc class add dev $DEV parent 1: classid 1:2 htb rate $[$UPLINK-150]kbit prio 3
 
        #1.2.1 在次干类下建立第一叶子类,可以跑例如http,pop等.
        tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil $[$UPLINK-150]kbit prio 4
 
        #1.2.2 在次干类下建立第二叶子类。不要太高的速度,以防发大的附件大量占用带宽,例如smtp等
        tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil $[$UPLINK-160]kbit prio 5
 
        #1.2.3 在次干类下建立第三叶子类。不要太多的带宽,以防大量的数据堵塞网络,例如ftp-data等,
        tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil $[$UPLINK-170]kbit prio 6
 
        #1.2.4 在次干类下建立第四叶子类。无所谓的数据通道,无需要太多的带宽,以防无所谓的人在阻碍正务.
        tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil $[$UPLINK-250]kbit prio 7
 
        #1.3 在主干类1下建立第三叶子类,给VIP用户(尽量不限速)
        tc class add dev $DEV parent 1: classid 1:3 htb rate $[$UPLINK+1000]kbit prio 3
 
        #在每个类下面再附加上另一个队列规定,随机公平队列(SFQ),不被某个连接不停占用带宽,以保证带宽的平均公平使用:
        #SFQ(Stochastic Fairness Queueing,随机公平队列),SFQ的关键词是“会话”(或称作“流”) ,
        #主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO队列中,每个队列对应一个会话。
        #数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。这种方式非常公平,保证了每一
        #个会话都不会没其它会话所淹没。SFQ之所以被称为“随机”,是因为它并不是真的为每一个会话创建
        #一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。
        #参数perturb是多少秒后重新配置一次散列算法。默认为10
        tc qdisc add dev $DEV parent 1:11 handle 111: sfq perturb 5
        tc qdisc add dev $DEV parent 1:12 handle 112: sfq perturb 5
        tc qdisc add dev $DEV parent 1:3 handle 13: sfq perturb 5
        tc qdisc add dev $DEV parent 1:21 handle 121: sfq perturb 10
        tc qdisc add dev $DEV parent 1:22 handle 122: sfq perturb 10
        tc qdisc add dev $DEV parent 1:23 handle 133: sfq perturb 10
        tc qdisc add dev $DEV parent 1:24 handle 124: sfq perturb 10
        echo "队列设置成功.done."
        echo -n "设置包过滤 Setting up Filters......"
        #这里设置过滤器,handle 是iptables作mark的值,让被iptables 在mangle链做了mark的不同的值选择不同的通
        #道classid,而prio 是过滤器的优先级别.
        tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
        tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
        tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
        tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:3
        tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
        tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
        tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24
        echo "设置过滤器成功.done."
 
 
 
########## downlink ##########################################################################
#6. 下行的限制:
#设置入队的规则,是因为把一些经常会造成下载大文件的端口进行控制,不让它们来得太快,导致堵塞.来得太快
#的就直接drop,就不会浪费和占用机器时间和力量去处理了.
#(1). 把下行速率控制在大概1000-1500k左右,因为这个速度已经足够用了,以便能够得到更多的并发下载连接
 
tc qdisc add dev $DEV handle ffff: ingress
 
tc filter add dev $DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${DOWNLINK}kbit burst 10k drop flowid :8
 
 
##vip 通道,给特殊ip较高的优先级和较大的下载速度
tc filter add dev $DEV parent ffff: protocol ip prio 3 u32 match ip dst $VIP1 police rate 2000kbit burst 10k drop flowid :1
tc filter add dev $DEV parent ffff: protocol ip prio 3 u32 match ip dst $VIP2 police rate 2000kbit burst 10k drop flowid :1
 
#(2).如果内部网数据流不是很疯狂的话,就不用做下载的限制了,用#符号屏蔽上面两行即可.
#(3).如果要对任何进来数据的数据进行限速的话,可以用下面这句:
tc filter add dev $DEV parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
}
###############################################################################################
#7. 开始给数据包打标记,往PREROUTING链中添加mangle规则:
start_mangle() {
 
        echo -n "开始给数据包打标记......start mangle mark......"
 
iptables -F -t mangle
iptables -X -t mangle
iptables -Z -t mangle
 
#(1)把出去的不同类数据包(为dport)给mark上标记1--6.让它走不同的通道
#(2)把进来的数据包(为sport)给mark上标记8,让它受到下行的限制,以免速度太过快而影响全局.
#(3)每条规则下根着return的意思是可以通过RETURN方法避免遍历所有的规则,加快了处理速度
 
##设置vip
 
 
##设置TOS的处理:
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN
 
##提高tcp初始连接(也就是带有SYN的数据包)的优先权是非常明智的:
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
 
######icmp,想ping有良好的反应,放在第一类吧.
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
 
# small packets (probably just ACKs)长度小于64的小包通常是需要快些的,一般是用来确认tcp的连接的,
#让它跑快些的通道吧.也可以把下面两行屏蔽,因为再下面有更多更明细的端口分类.
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j MARK --set-mark 2
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j RETURN
 
#ftp放第2类,因为一般是小包, ftp-data放在第5类,因为一般是大量数据的传送.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN
##提高ssh数据包的优先权:放在第1类,要知道ssh是交互式的和重要的,不容待慢哦
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN
#
##smtp邮件:放在第4类,因为有时有人发送很大的邮件,为避免它堵塞,让它跑4道吧
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 8
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN
## name-domain server:放在第1类,这样连接带有域名的连接才能快速找到对应的地址,提高速度的一法
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN
#
## http:放在第3类,是最常用的,最多人用的,
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
##pop邮件:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN
## https:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN
## Microsoft-SQL-Server:放在第2类,我这里认为较重要,一定要保证速度的和优先的.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j RETURN
 
## voip用, 提高,语音通道要保持高速,才不会断续.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j RETURN
 
## vpn ,用作voip的,也要走高速路,才不会断续.
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1723 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1723 -j RETURN
 
## 放在第1类,因为我觉得它在我心中很重要,优先.
#iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j MARK --set-mark 1
#iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j RETURN
 
## WWW caching service:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN
 
##提高本地数据包的优先权:放在第1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j RETURN
 
iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
 
#本地small packets (probably just ACKs)
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j RETURN
 
#(4). 向PREROUTING中添加完mangle规则后,用这条规则结束PREROUTING表:
##也就是说前面没有打过标记的数据包将交给1:24处理。
##实际上是不必要的,因为1:24是缺省类,但仍然打上标记是为了保持整个设置的协调一致,而且这样
#还能看到规则的包计数。
 
iptables -t mangle -A PREROUTING -i $DEV -j MARK --set-mark 6
echo "标记完毕! mangle mark done!"
}
#-----------------------------------------------------------------------------------------------------
 
#8.取消mangle标记用的自定义函数
stop_mangle() {
 
        echo -n "停止数据标记 stop mangle table......"
        ( iptables -t mangle -F && echo "ok." ) || echo "error."
}
 
#9.取消队列用的       
stop_routing() {
        echo -n "(删除所有队列......)"
        ( tc qdisc del dev $DEV root && tc qdisc del dev $DEV ingress && echo "ok.删除成功!" ) || echo "error."
}
 
#10.显示状态
status() {
        echo "1.show qdisc $DEV (显示上行队列):----------------------------------------------"
        tc -s qdisc show dev $DEV
        echo "2.show class $DEV (显示上行分类):----------------------------------------------"
        tc class show dev $DEV
        echo "3. tc -s class show dev $DEV (显示上行队列和分类流量详细信息):------------------"
        tc -s class show dev $DEV
        echo "3. tc -s filter ls dev $DEV (显示下行队列和分类流量详细信息):------------------"
        tc filter ls dev $DEV parent ffff:
        echo "说明:设置总队列上行带宽 $UPLINK k."
        echo "1. classid 1:11 ssh、dns、和带有SYN标记的数据包。这是最高优先权的类包并最先类 "
        echo "2. classid 1:12 重要数据,这是较高优先权的类。"
        echo "3. classid 1:21 web,pop 服务 "
        echo "4. classid 1:22 smtp服务 "
        echo "5. classid 1:23 ftp-data服务 "
        echo "6. classid 1:24 其他服务 "
        echo "7. classid 1:3 VIP通道 "
}
 
#11.显示帮助
usage() {
        echo "使用方法(usage): `basename $0` [start | stop | restart | status | mangle ]"
        echo "参数作用:"
        echo "start   开始流量控制"
        echo "stop    停止流量控制"
        echo "restart 重启流量控制"
        echo "status 显示队列流量"
        echo "mangle 显示mark标记"
}
 
#----------------------------------------------------------------------------------------------
#12. 下面是脚本运行参数的选择的控制
#
#kernel=` kernelversion`
kernel=`uname -r|cut -b 1-3`
case "$kernel" in
   2.2)
      echo " (!) Error: won't do anything with 2.2.x 不支持内核2.2.x"
      exit 1
      ;;
 
   2.4|2.6)
      case "$1" in
         start)
            ( start_routing && start_mangle && echo "开始流量控制! TC started!" ) || echo "error."
 
            exit 0
            ;;
 
         stop)
            ( stop_routing && stop_mangle && echo "停止流量控制! TC stopped!" ) || echo "error."
 
            exit 0
            ;;
         restart)
            stop_routing
            stop_mangle
            start_routing
            start_mangle
 
            echo "流量控制规则重新装载!"
            ;;
         status)
            status
            ;;
 
         mangle)
            echo "iptables -t mangle -L (显示目前mangle表表标记详细):"
            iptables -t mangle -nL
            ;;
 
 
         *) usage
            exit 1
            ;;
      esac
      ;;
 
   *)
      echo " (!) Error: Unknown kernel version. check it !"
      exit 1
      ;;
esac
echo "script done!"
exit 1

http://hi.baidu.com/zhangyingowen/blog/item/185d77fb15a89017a8d311f2.html

分类: BASH 标签:

Nginx下搭建flv视频服务器且支持视频拖动进度条播放

2011年12月27日 没有评论

目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频。

在互联网上播放视频,有两种方式,一种是文件方式,即通过HTTP协议访问视频文件,这种方式的缺点是不能从特定的帧开始播放;另外一种就是采用专门的流媒体服务器,这种方式的缺点是要搭建复杂的流媒体服务器。不过,现在有了一种集合了以上两种方式优点的一种解决方案,即通过HTTP来实现伪流媒体。本文描述的就是这样的一种解决方案。

首先配置nginx服务支持flv模块功能

⑴查看你的nginx是否已支持flv功能模块

[root@localhost ~]# /usr/local/nginx/sbin/nginx -V  //查看nginx服务支持

结果:

nginx version: nginx/0.8.24

built by gcc 4.4.4 20100726 (Red Hat 4.4.4-13) (GCC)

configure arguments: –prefix=/usr/local/nginx –with-http_flv_module –with-http_gzip_static_module –with-http_stub_status_module

分析:我的nginx版本0.8.24,http_flv_module已经开启,支持flv服务

⑵安装支持flv模块的nginx服务器:

#tar zxvf nginx-0.8.24.tar.gz

#cd nginx-0.8.24

#./configure –prefix=/usr/local/nginx  –with-http_flv_module –with-http_gzip_static_module –with-http_stub_status_module //开启flv模块

#make && make install

#/usr/local/nginx/sbin/nginx       //启Nginx

⑶nginx服务器配置(nginx.conf文件)

server

{

listen       80;

server_name  localhost;

charset utf-8;

location / {

root   html;

index  index.php index.html index.htm;

}

location ~ \.flv {

flv;

limit_rate_after 10m;

limit_conn one 1;

limit_rate 85k;

}

}

使用location 将 .flv的文件指向flv模块即可。

以上使用了limit_rate 是为了限速,当 flv视频下载超过10M,则限速到85K,只允许用户开1个进程,也就是先快速缓存可以播放,后面的慢慢下载。

⑷安装支持flv拖放进度条的播放器

上面三步都是安装支持nginx服务支持flv功能的,现在需要支持flv拖放进度条的播放器.

你需要有一个能够播放Flv视频的播放器,很显然,它还需要能够嵌入到网页中。目前比较流行的,功能上也还比较完善的一个Flv播放器就是 JW FLV Media Player(也称为 jwplayer)。它的网址是:

http://www.longtailvideo.com/players/jw-flv-player/

这个播放器支持视频加入广告和视频节目单功能,

下载包里面有很全的实例和使用方式,

将包中的player.swf(如果是带有Viral插件的,就是player-viral.swf)放到你的网站内,这就是用来提供视频播放的播放器。至于包中其它的文件,都可以不要。

接下来,将播放器嵌入到你的视频播放网页中:

直接嵌入,使用Object/Embed代码嵌入:

<embed

type=”application/x-shockwave-flash”

id=”player2″

name=”player2″

src=”player.swf”

width=”328″

height=”200″

allowscriptaccess=”always”

allowfullscreen=”true”

flashvars=”file=http://192.168.40.135/test.flv&image=http://192.168.40.135/preview.jpg&autostart=false&type=http&streamer=start”

>  </embed>

file:”video.flv”, // FLV视频地址

type:”http”,        // 数据类型,本文是基于http模式的,这个必须写滴

image:”preview.jpg”,// 开始播放之前的预览图

autostart:”false”,  // 是否自动播放

streamer:”start”,   // 参数为 “start”,这个参数用于传递给服务器从特定的关键帧开始播放,nginx编译了 flv 模块 所以是支持的。。

⑸添加关键帧

如果一个Flv视频要能够被拖到特定点播放,该Flv需要在其metadata中有关键帧的信息。如果你的Flv视频制作的时候没有这些信息,也是不能拖放播放的。可以使用yamdi来为你的视频加上关键帧信息 :

安装:

1 [root@localhost ~]#wget http://sourceforge.net/projects/yamdi/files/yamdi/1.4/yamdi-1.4.tar.gz/download

2 [root@localhost ~]#tar zxvf yamdi-1.4.tar.gz

3 [root@localhost ~]#cd yamdi-1.4/

4 [root@localhost yamdi-1.4]#make && make install

使用方法:

yamdi -i source.flv -o dest.flv //原视频 输出视频

http://blog.csdn.net/youacai/article/details/6728013

分类: Nginx 标签:

ipad的user-agent

2011年12月26日 没有评论
 --user-agent="Mozilla/5.0(iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4 Safari/6533.18.5"
分类: 软件 标签:

vmware运行游戏或软件,被检测出在虚拟机中运行,解决方法

2011年12月11日 没有评论

修改配置文件 .vmx
在最后增加
monitor_control.restrict_backdoor = “TRUE”
如果还不行
增加
disable_acceleration = “TRUE”

分类: 虚拟机 标签:

bash里用cat EOF来输出多行文本

2011年12月11日 没有评论
cat > file <<EOF
some some
some
EOF

如果不想$被替换成变量

cat > file <<\EOF
some $some
some
EOF

参考资料:

http://tldp.org/LDP/abs/html/here-docs.html

Example 19-7. Parameter substitution turned off

分类: BASH 标签:

javascript 格式化

2011年11月20日 4 条评论

http://www.css88.com/tool/js_beautify/

http://jsbeautifier.org/

http://tool.chinaz.com/Tools/JsFormat.aspx

都是http://jsbeautifier.org/提供的

分类: jquery/JS 标签:

vmware用桥接,vm获取不到IP地址

2011年11月18日 没有评论

原因是主机有多个网卡,在Edit – Virtual Network Editor里面设置 VMnet0(或者已经有bridge类型的)为bridge类型,bridge to指定的网卡

分类: 虚拟机 标签:

转:用Python干实事(一)自动修改Windows的IP、网关和DNS设置

2011年11月18日 没有评论

最近由于工作和学习需要在家里装上了小区宽带(80元/月),整个小区共享30M带宽,开始以为会很慢,结果用起来速度还是挺不错的。不说废话了,言归正传,由于家里和公司的IP设置不一样(都是静态的),每次回家和去公司都需要手动改IP,改了几天嫌麻烦就想写个小程序可以自动设置IP,只需要双击一下程序就搞定IP设置。就上网搜了一下,大概有这么几种方法:使用Windows的脚本(http://www.microsoft.com/china/technet/community/scriptcenter/topics/networking/default.mspx)或者编写一个批处理使用netsh命令来完成这个任务,当然用C/C++也是绝对可以的。不过为了练习一下Python和想更多了解一下Python,所以就决定用Python来写个自动设置IP的程序。参考文章:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0508/694212.html
代码如下:

1 # FileName: modify_ip.py
  2 # Author  : qujinlong
  3 # Email   : qujinlong123@gmail.com
  4 # Date    : 2007-06-20
  5 
  6 import _winreg
  7 
  8 from ctypes import *
  9 
 10 # MessageBox = windll.user32.MessageBoxA
 11 # MessageBox(0, 'Welcome!', 'Hello', 0)
 12 
 13 print '正在修改IP,请稍后'
 14 
 15 netCfgInstanceID = None
 16 
 17 hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, \
 18                        r'System\CurrentControlSet\Control\Class\{4d36e972-e325-11ce-bfc1-08002be10318}')
 19 
 20 keyInfo = _winreg.QueryInfoKey(hkey)
 21 
 22 # 寻找网卡对应的适配器名称 netCfgInstanceID
 23 for index in range(keyInfo[0]):
 24     hSubKeyName = _winreg.EnumKey(hkey, index)
 25     hSubKey = _winreg.OpenKey(hkey, hSubKeyName)
 26 
 27     try:
 28         hNdiInfKey = _winreg.OpenKey(hSubKey, r'Ndi\Interfaces')
 29         lowerRange = _winreg.QueryValueEx(hNdiInfKey, 'LowerRange')
 30 
 31         # 检查是否是以太网
 32         if lowerRange[0] == 'ethernet':
 33             driverDesc = _winreg.QueryValueEx(hSubKey, 'DriverDesc')[0]
 34             # print 'DriverDesc: ', driverDesc
 35             netCfgInstanceID = _winreg.QueryValueEx(hSubKey, 'NetCfgInstanceID')[0]
 36             # print 'NetCfgInstanceID: ', netCfgInstanceID
 37             break
 38 
 39         _winreg.CloseKey(hNdiInfKey) # 关闭 RegKey
 40     except WindowsError:
 41         print r'Message: No Ndi\Interfaces Key'
 42 
 43     # 循环结束,目前只提供修改一个网卡IP的功能
 44     _winreg.CloseKey(hSubKey)
 45 
 46 _winreg.CloseKey(hkey)
 47 
 48 if netCfgInstanceID == None:
 49     print '修改IP失败 - 没有找到网络适配器'    
 50     exit()
 51 
 52 # print netCfgInstanceID
 53 
 54 # 通过修改注册表设置IP
 55 strKeyName = 'System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Interfaces\\' + netCfgInstanceID
 56 
 57 # print strKeyName
 58 
 59 hkey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, \
 60                        strKeyName, \
 61                        0, \
 62                        _winreg.KEY_WRITE)
 63 
 64 # 定义需要修改的IP地址、子网掩码、默认网关和DNS等
 65 ipAddress = ['192.168.1.135']
 66 subnetMask = ['255.255.255.0']
 67 gateway = ['192.168.1.10']
 68 dnsServer = ['202.106.196.115', '202.106.0.20']
 69 
 70 try:
 71     _winreg.SetValueEx(hkey, 'IPAddress', None, _winreg.REG_MULTI_SZ, ipAddress)
 72     _winreg.SetValueEx(hkey, 'SubnetMask', None, _winreg.REG_MULTI_SZ, subnetMask)
 73     _winreg.SetValueEx(hkey, 'DefaultGateway', None, _winreg.REG_MULTI_SZ, gateway)
 74     _winreg.SetValueEx(hkey, 'NameServer', None, _winreg.REG_SZ, ','.join(dnsServer))
 75 except WindowsError:
 76     print 'Set IP Error'
 77     exit()
 78 
 79 _winreg.CloseKey(hkey)
 80 
 81 # 调用DhcpNotifyConfigChange函数通知IP被修改
 82 DhcpNotifyConfigChange = windll.dhcpcsvc.DhcpNotifyConfigChange
 83 
 84 inet_addr = windll.Ws2_32.inet_addr
 85 
 86 # DhcpNotifyConfigChange 函数参数列表:
 87 # LPWSTR lpwszServerName,  本地机器为None
 88 # LPWSTR lpwszAdapterName, 网络适配器名称
 89 # BOOL bNewIpAddress,      True表示修改IP
 90 # DWORD dwIpIndex,         表示修改第几个IP, 从0开始
 91 # DWORD dwIpAddress,       修改后的IP地址
 92 # DWORD dwSubNetMask,      修改后的子码掩码
 93 # int nDhcpAction          对DHCP的操作, 0 - 不修改, 1 - 启用, 2 - 禁用
 94 DhcpNotifyConfigChange(None, \
 95                        netCfgInstanceID, \
 96                        True, \
 97                        0, \
 98                        inet_addr(ipAddress[0]), \
 99                        inet_addr(subnetMask[0]), \
100                        0)
101 
102 print '修改IP结束'
103

Python写起来真是清爽啊,没有一点拖泥带水,没有任何的指针、引用传进传出,也不用搞复杂的类型变来变去。
代码中用到了winreg模块去读取和修改Windows的注册表,还用到了ctypes去链接DLL调用Windows API。
至于程序所使用的修改IP的原理在参考文章中描述的很清楚,有什么问题可以mail我。
程序以简单起见,在修改IP的过程中一些例外情况并没有处理,呵呵,只要自己能正常使用就行了:)
等过两天有时间写个界面程序,可以设置和读取IP配置,类似于Windows的网络设置的UI界面。

不喜欢上面代码中有行号的朋友可以下载这个源程序:自动修改IP的Python程序

改进性能从点滴做起:
(1).由于Python中的字符串是不可变的,每次使用“+”号创建新字符串会拷贝原有的字符串构造新的字符串,降低性能,所以应避免使用“+”号构造字符串(类似于Java)。据此可将上面的一句代码更改如下:
strKeyName = r’System\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\%s’ % netCfgInstanceID
(2).待续…

(2007-06-21增加)
经笨笨狗的提示,研究了一下在Python中使用WMI来实现这个功能,比上面的修改注册表方法简单的太多,而且比使用Windows的脚本也简单了一点。先将新版本的代码贴出来(其中使用了Tim Golden对WMI的包装模块,并且这个模块使用了Python for Windows extensions(pywin32)):

1 # -*- coding: cp936 -*-
 2 
 3 # FileName: modify_ip(wmi).py
 4 # Author  : qujinlong
 5 # Email   : qujinlong123@gmail.com
 6 # Date    : 2007-06-21
 7 
 8 import wmi
 9 
10 print '正在修改IP,请稍后'
11 
12 wmiService = wmi.WMI()
13 
14 colNicConfigs = wmiService.Win32_NetworkAdapterConfiguration(IPEnabled = True)
15 
16 #for objNicConfig in colNicConfigs:
17 #    print objNicConfig.Index
18 #    print objNicConfig.SettingID
19 #    print objNicConfig.Description
20 #    print objNicConfig.IPAddress
21 #    print objNicConfig.IPSubnet
22 #    print objNicConfig.DefaultIPGateway
23 #    print objNicConfig.DNSServerSearchOrder
24 
25 if len(colNicConfigs) < 1:
26     print '没有找到可用的网络适配器'
27     exit()
28 
29 # 获取第一个网络适配器的设置
30 objNicConfig = colNicConfigs[0]
31 
32 #for method_name in objNicConfig.methods:
33 #   method = getattr(objNicConfig, method_name)
34 #   print method
35 
36 arrIPAddresses = ['192.168.1.136']
37 arrSubnetMasks = ['255.255.0.0']
38 arrDefaultGateways = ['192.168.1.1']
39 arrGatewayCostMetrics = [1]
40 arrDNSServers = ['192.168.1.3', '202.106.46.151', '202.106.0.20']
41 intReboot = 0
42 
43 returnValue = objNicConfig.EnableStatic(IPAddress = arrIPAddresses, SubnetMask = arrSubnetMasks)
44 if returnValue[0] == 0:
45     print '  成功设置IP'
46 elif returnValue[0] == 1:
47     print '  成功设置IP'
48     intReboot += 1
49 else:
50     print '修改IP失败(IP设置发生错误)'
51     exit()
52 
53 returnValue = objNicConfig.SetGateways(DefaultIPGateway = arrDefaultGateways, GatewayCostMetric = arrGatewayCostMetrics)
54 if returnValue[0] == 0:
55     print '  成功设置网关'
56 elif returnValue[0] == 1:
57     print '  成功设置网关'
58     intReboot += 1
59 else:
60     print '修改IP失败(网关设置发生错误)'
61     exit()
62 
63 returnValue = objNicConfig.SetDNSServerSearchOrder(DNSServerSearchOrder = arrDNSServers)
64 if returnValue[0] == 0:
65     print '  成功设置DNS'
66 elif returnValue[0] == 1:
67     print '  成功设置DNS'
68     intReboot += 1
69 else:
70     print '修改IP失败(DNS设置发生错误)'
71     exit()
72 
73 if intReboot > 0:
74     print '需要重新启动计算机'
75 else:
76     print ''
77     print '  修改后的配置为:'
78     print '  IP: ', ', '.join(objNicConfig.IPAddress)
79     print '  掩码:', ', '.join(objNicConfig.IPSubnet)
80     print '  网关:', ', '.join(objNicConfig.DefaultIPGateway)
81     print '  DNS:', ', '.join(objNicConfig.DNSServerSearchOrder)
82 
83 print '修改IP结束'
84

简单了很多,呵呵

转自: http://www.blogjava.net/qujinlong123/archive/2007/06/20/125434.html

分类: Python 标签:

Using the Windows 32 API from Python

2011年11月18日 没有评论

具体请看这里

http://vermeulen.ca/python-win32api.html

分类: Python 标签: