博文
句柄与ID的区别〔转〕(2007-6-19 22:49:00)
在Windows程序设计中,句柄无所不在,窗口有窗口的句柄HWND,线程和进程也有句柄HANDLE,甚至有人把套接字也称为句柄(我就是这样的)。
句柄在英文中是handle,作为动词讲是处理的意思。简而言之,句柄是处理对象的一个接口,对于程序中所涉及的对象,你可以通过句柄去操作他。你不应该试图去回答句柄是什么,而应该从务虚的角度去理解他,知道他干什么即可。
有人说,因为handle的定义是void *,因此他是一个指针。有些熟悉内核的人说这是一个索引。这些说法都是不准确的。需要注意的是,微软并没有精确定义句柄的含义,也许在某个特殊的操作系统中,他使用了一种内部含义,但是在其他版本中,就不保证这样了。任何对句柄的内在假设都可能导致灾难性的后果。
API是接口,句柄是接口,两者有什么区别?API是一个通用的函数族,他处理所有的对象,而句柄是和某个具体对象相关联的数据结构。只有借助句柄,API才知道处理哪个对象。
有些对象有ID。句柄表示特殊的对象,ID也表示某个对象,为什么要两个东西来表示?
首先,句柄不能唯一表示对象。一个对象可以有多个句柄。例如:假设我们用CreateProcess创建一个进程,该进程的第一个线程的句柄会返回给调用CreateProcess的进程。同时,在新创建的进程中,该线程也会有一个句柄。这样,这个线程就有两个句柄。我们也可以用DuplicateHandle复制一个句柄,这个句柄和原来句柄是不一样的,但是他们都表示同一个对象。而每个有ID的对象,在系统范围内,ID肯定是唯一的。
其次,句柄所能实现的功能ID不能实现。毕竟ID只是一个数字,他不能记录很多信息。而句柄可能在其内部结构中记录了很多信息(如权限、有无信号等)。
总之,如果试图解释他到底是什么,学习句柄就会误入歧途。从虚的角度去理解,对于新手是难一点,但是这也许是唯一正确的办法。
SQL注入[转](2007-4-21 17:04:00)
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。
但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。
根据国情,国内的网站用ASP+Access或SQLServer的占70%以上,PHP+MySQ占L20%,其他的不足10%。在本文,我们从分入门、进阶至高级讲解一下ASP注入的方法及技巧,PHP注入的文章由NB联盟的另一位朋友zwell撰写,希望对安全工作者和程序员都有用处。了解ASP注入的朋友也请不要跳过入门篇,因为部分人对注入的基本判断方法还存在误区。大家准备好了吗?Let's Go...
入门篇
如果你以前没试过SQL注入的话,那么第一步先把IE菜单=>工具=>Internet选项=>高级=>显示友好 HTTP 错误信息前面的勾去掉。否则,不论服务器返回什么错误,IE都只显示为HTTP 500服务器错误,不能获得更多的提示信息。
一、SQL注入原理
以下我们从一个网站www.19cn.com开始(注:本文发表前已征得该站站长同意,大部分都是真实数据)。
在网站首页上,有名为“IE不能打开新窗口的多种解决方法”的链接,地址为:http://www.19cn.com/showdetail.asp?id=49,我们在这个地址后面加上单引号’,服务器会返回下面的错误提示:
Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'ID=49'' 中。
/showdetail.asp,行8
从这个错误提示我们能看出下面几点:
1.网站使用的是Access数据库,通过JET引擎连接数据库,而不是通过ODBC。
2.程序没有判断客户端提交的数据是否符合程序要求。
3.该SQL语句所查询的表中有一名为ID的字段。
从上面的例子我们可以知道,SQL注入的原理,就是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取你想到得到的资料。
二、判断能否进行SQL注入
看完第一节,有一些人会觉得:我也是经常这样测试能否注入的,这不是很简单吗?其实,这并不是最好的方法,为什么呢?
首先,不一定每台服务器的IIS都返回具体错误提示给客户端,如果程序中加了cint(参数)之类语句的话,SQL注入是不会成功的,但服务器同样会报错,具体提示信息为处理 URL 时服务器上出错。请和系统管理员联络。
其次,部分对SQL注入有一点了解的程序员,认为只要把单引号过滤掉就安全了,这种情况不为少数,如果你用单引号测试,是测不到注入点的.
那么,什么样的测试方法才是比较准确呢?答案如下:
① http://www.19cn.com/showdetail.asp?id=49
② http://www.19cn.com/showdetail.asp?id=49 and 1=1
③ http://www.19cn.com/showdetail.asp?id=49 and 1=2
这就是经典的1=1、1=2测试法了,怎么判断呢?看看上面三个网址返回的结果就知道了:
可以注入的表现:
① 正常显示(这是必然的,不然就是程序有错误了)
② 正常显示,内容基本与①相同
③ 提示BOF或EOF(程序没做任何判断时)、或提示找不到记录(判断了rs.eof时)、或显示内容为空(程序加了on error resume next)
不可以注入就比较容易判断了,①同样正常显示,②和③一般都会有程序定义的错误提示,或提示类型转换时出错。
当然,这只是传入参数是数字型的时候用的判断方法,实际应用的时候会有字符型和搜索型参数,我将在中级篇的“SQL注入一般步骤”再做分析。
三、判断数据库类型及注入方法
不同的数据库的函数、注入方法都是有差异的,所以在注入之前,我们还要判断一下数据库的类型。一般ASP最常搭配的数据库是Access和SQLServer,网上超过99%的网站都是其中之一。
怎么让程序告诉你它使用的什么数据库呢?来看看:
SQLServer有一些系统变量,如果服务器IIS提示没关闭,并且SQLServer返回错误提示的话,那可以直接从出错信息获取,方法如下:
http://www.19cn.com/showdetail.asp?id=49 and user>0
这句语句很简单,但却包含了SQLServer特有注入方法的精髓,我自己也是在一次无意的测试中发现这种效率极高的猜解方法。让我看来看看它的含义:首先,前面的语句是正常的,重点在and user>0,我们知道,user是SQLServer的一个内置变量,它的值是当前连接的用户名,类型为nvarchar。拿一个nvarchar的值跟int的数0比较,系统会先试图将nvarchar的值转成int型,当然,转的过程中肯定会出错,SQLServer的出错提示是:将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误,呵呵,abc正是变量user的值,这样,不废吹灰之力就拿到了数据库的用户名。在以后的篇幅里,大家会看到很多用这种方法的语句。
顺便说几句,众所周知,SQLServer的用户sa是个等同Adminstrators权限的角色,拿到了sa权限,几乎肯定可以拿到主机的Administrator了。上面的方法可以很方便的测试出是否是用sa登录,要注意的是:如果是sa登录,提示是将”dbo”转换成int的列发生错误,而不是”sa”。
如果服务器IIS不允许返回错误提示,那怎么判断数据库类型呢?我们可以从Access和SQLServer和区别入手,Access和SQLServer都有自己的系统表,比如存放数据库中所有对象的表,Access是在系统表[msysobjects]中,但在Web环境下读该表会提示“没有权限”,SQLServer是在表[sysobjects]中,在Web环境下可正常读取。
在确认可以注入的情况下,使用下面的语句:
http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from sysobjects)>0
http://www.19cn.com/showdetail.asp?id=49 and (select count(*) from msysobjects)>0
如果数据库是SQLServer,那么第一个网址的页面与原页面http://www.19cn.com/showdetail.asp?id=49是大致相同的;而第二个网址,由于找不到表msysobjects,会提示出错,就算程序有容错处理,页面也与原页面完全不同。
如果数据库用的是Access,那么情况就有所不同,第一个网址的页面与原页面完全不同;第二个网址,则视乎数据库设置是否允许读该系统表,一般来说是不允许的,所以与原网址也是完全不同。大多数情况下,用第一个网址就可以得知系统所用的数据库类型,第二个网址只作为开启IIS错误提示时的验证。
Ipc$默认发生在win NT/2000环境下,win98将不在此次讨论之列。(2007-4-1 12:49:00)
IPC$(Internet Process Connection)是共享"命名管道"的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接双方可以建立安全的通道并以此通道进行加密数据的交换,从而实现对远程计算机的访问。IPC$是NT/2000的一项新功能,它有一个特点,即在同一时间内,两个IP之间只允许建立一个连接。NT/2000在提供了ipc$功能的同时,在初次安装系统时还打开了默认共享,即所有的逻辑共享(c$,d$,e$……)和系统目录winnt或windows(admin$)共享。所有的这些,微软的初衷都是为了方便管理员的管理,但在有意无意中,导致了系统安全性的降低。
平时我们总能听到有人在说ipc$漏洞,ipc$漏洞,其实ipc$并不是一个真正意义上的漏洞,我想之所以有人这么说,一定是指微软自己安置的那个‘后门’:空会话(Null session)。
三 什么是空会话
在介绍空会话之前,我们有必要了解一下一个安全会话是如何建立的。
在Windows NT 4.0中是使用挑战响应协议与远程机器建立一个会话的,建立成功的会话将成为一个安全隧道,建立双方通过它互通信息,这个过程的大致顺序如下:
1)会话请求者(客户)向会话接收者(服务器)传送一个数据包,请求安全隧道的建
立;
2)服务器产生一个随机的64位数(实现挑战)传送回客户;
3)客户取得这个由服务器产生的64位数,用试图建立会话的帐号的口令打乱它,将结
果返回到服务器(实现响应);
4)服务器接受响应后发送给本地安全验证(LSA),LSA通过使用该用户正确的口令来核实响应以便确认请求者身份。如果请求者的帐号是服务器的本地帐号,核实本地发生;如果请求的帐号是一个域的帐号,响应传送到域控制器去核实。当对挑战的响应核实为正确后,一个访问令牌产生,然后传送给客户。客户使用这个访问令牌连接到服务器上的资源直到建议的会话被终止。
以上是一个安全会话建立的大致过程,那么空会话又如何呢?
空会话是在没有信任的情况下与服务器建立的会话(即未提供用户名与密码),但根据WIN2000的访问控制模型,空会话的建立同样需要提供一个令牌,可是空会话在建立过程中并没有经过用户信息的认证,所以这个令牌中不包含用户信息,因此,这个会话不能让系统间发送加密信息,但这并不表示空会话的令牌中不包含安全标识符SID(它标识了用户和所属组),对于一个空会话,LSA提供的令牌的SID是S-1-5-7,这就是空会话的SID,用户名是:ANONYMOUS LOGON(这个用户名是可以在用户列表中看到的,但是是不能在SAM数据库中找到,属于系统内置的帐号),这个访问令牌包含下面伪装的组:
Everyone
Network
在安全策略的限制下,这个空会话将被授权访问到上面两个组有权访问到的一切信息。那么建立空会话到底可以作什么呢?
空会话可以做什么
对于NT,在默认安全设置下,借助空连接可以列举目标主机上的用户和共享,访问everyone权限的共享,访问小部分注册表等,并没有什么太大的利用价值;对2000作用更小,因为在Windows 2000 和以后版本中默认只有管理员和备份操作员有权从网络访问到注册表,而且实现起来也不方便,需借助工具。
从这些我们可以看到,这种非信任会话并没有多大的用处,但从一次完整的ipc$入侵来看,空会话是一个不可缺少的跳板,因为我们从它那里可以得到户列表,而大多数弱口令扫描工具就是利用这个用户列表来进行口令猜解的,成功的导出用户列表大大增加了猜解的成功率,仅从这一点,足以说明空会话所带来的安全隐患,因此说空会话毫无用处的说法是不正确的。以下是空会话中能够使用的一些具体命令:
1 首先,我们先建立一个空连接(当然,这需要目标开放ipc$)
命令:net use \\ip\ipc$ "" /user:""
注意:上面的命令包括四个空格,net与use中间有一个空格,use后面一个,密码左右各一个空格。
2 查看远程主机的共享资源
命令:net view \\ip
解释:前提是建立了空连接后,用此命令可以查看远程主机的共享资源,如果它开了共享,可以得到如下面的结果,但此命令不能显示默认共享。
在 \\*.*.*.*的共享资源
资源共享名 类型 用途 注释
-----------------------------------------------------------
NETLOGON Disk Logon server share
SYSVOL Disk Logon server share
命令成功完成。
3 查看远程主机的当前时间
命令: net time \\ip
解释:用此命令可以得到一个远程主机的当前时间。
4 得到远程主机的NetBIOS用户名列表(需要打开自己的NBT)
命令:nbtstat -A ip
用此命令可以得到一个远程主机的NetBIOS用户名列表,返回如下结果:
Node IpAddress: [*.*.*.*] Scope Id: []
NetBIOS Remote Machine Name Table
Name Type Status
---------------------------------------------
SERVER <00> UNIQUE Registered
OYAMANISHI-H <00> GROUP Registered
OYAMANISHI-H <1C> GROUP Registered
SERVER <20> UNIQUE Registered
OYAMANISHI-H <1B> UNIQUE Registered
OYAMANISHI-H <1E> GROUP Registered
SERVER <03> UNIQUE Registered
OYAMANISHI-H <1D> UNIQUE Registered
..__MSBROWSE__.<01> GROUP Registered
INet~Services <1C> GROUP Registered
IS~SERVER......<00> UNIQUE Registered
MAC Address = 00-50-8B-9A-2D-37
以上就是我们经常使用空会话做的事情,好像也能获得不少东西哟,不过要注意一点:建立IPC$连接的操作会在Event Log中留下记录,不管你是否登录成功。 好了,那么下面我们就来看看ipc$所使用的端口是什么?
C++的随机函数Srand()(2007-3-25 19:33:00)
C++/c语言里,是没有办法得到一个真正的随机数序列的.想要等到一个真正的随机数序列,必须使用特定的随机数硬件发生器.也就是说,软件是没有办法产生真正的随机数.因为软件必须按照一定的逻辑来编写.既然是按照特定的逻辑(也就是说算法)来编写 ,那么产生的运算结果就是一定的.这一点,就是软件天生的特性.想想看,如果一个软件,同样的代码喝条件下,每次运行的结果不一样,那还有谁会用?
所以,在C++/C语言中,就有了"伪随机数"的概念.意思也就是说,通过一个特定的算法,产生一个假的随机数序列.那么,程序员又希望这个随机数序列跟接近真正的随机数序列,也就是希望得到的序列的不一样,所以有了一个"播种"的概念.
srand(unsgined int seed);
这个函数就是用来"播种"的.通过一个"种子"(SEED),来控制随机数的序列不一样.只要种子不一样,那么通过rand()得到的随机数序列就不一样.反过来说,如果种子一样,那么通过srand()得到的随机数就是一样的.
srand(0);
for( int i = 0; i < 10; i++)
{
cout<<rand()<<' ';
}
你试着将这个程序执行两次,你会发现两次的结果一样。那是因为,一旦“种子”确定了,那么这个随机数序列就确定了。软件天生的“行为可重复性”决定了这一点。
所以,一般在播种的时候,喜欢用一个随机的种子.在绝大多数的情况下,会使用当前的系统时间.这个数字在每次程序运行的时候都不一样.除非你手动的改系统时间.
----------------------------------------------------------------------------------
阅读全文(2932) | 评论:0 | 复制链接
解决Sql Server2000程序安装被挂起的问题(2007-3-16 10:18:00)
有时安装SqlServer2000时,安装程序报告已经有挂起的安装程序,需要重启后再安装,这时需要重新启动计算机,但是,有时重新启动计算机后再安装时仍然出现此提示,致使无法继续安装。这时可以采用下列的办法完成系统安装。
进入注册表编辑器 REGEDIT
依次找到
HKEY_LOCAL_MACHINE ->SYSTEM ->CurrentControlSet ->Control ->Session Manager键值,在右边找到并双击“PendingFileRenameOperations”,删除其中的内容。
确定,取出注册表编辑器。
也可以把一下几行内容粘贴到记事本后,保存成“删除挂起.REG”后双击此文件即可。
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"PendingFileRenameOperations"=hex(7):00,00
原因分析:造成这个问题的主要原因是在以前安装SQL Server 2000或者其他软件的安装也可能会造成(不过主要是微软的软件)的过程中,中断了安装过程,于是就在系统中保留了安装信息,造成无法继续安装的问题。
阅读全文(2010) | 评论:0 | 复制链接
aspx和asp有什么区别(2007-3-15 23:06:00)
服务器支持ASP,但是并一定就支持ASPX.ASPX可以说是ASP的升级版,其符合MIcrosoft公司最新的.NET战略及内部结构.具有开放式的特点.
另外.ASP页面只能使用JavaScript或者vbscript进行编写,而ASPX则没有这个限制,其理论上是支持使用任意评议进行编写,比如VC,VB
所以,服务器支持ASP,但是不一定就支持ASPX,而且对于IIS来讲,要支持ASPX也需要单独安装程序.IIS默认是不支持ASPX的.
阅读全文(1522) | 评论:5 | 复制链接
Linux开发中的常用命令(2007-3-13 10:29:00)
Linux开发中的常用命令
ls #以默认方式显示当前目录文件列表
ls –a #显示所有文件包括隐藏文件
ls –l #显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行
ls --color=never *.so > obj #不显示文字颜色,将所有so文件记录到obj文件中
cd dir #切换到当前目录下的dir目录 cd / #切换到根目录 cd .. #切换到到上一级目录 cd ../.. #切换到上二级目录 cd ~ #切换到用户目录,比如是root用户,则切换到/root下 rm file #删除某一个文件 rm -fr dir #删除当前目录下叫dir的整个目录 cp source target #将文件source 复制为 target cp /root/source . #将/root下的文件source复制到当前目录 cp –av soure_dir target_dir #将整个目录复制,两目录完全一样 cp –fr source_dir target_dir #将整个目录复制,并且是以非链接方式复制,当source目录带有符号链接时,两个目录不相同 mv source target #将文件source更名为target diff dir1 dir2 #比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出 diff file1 file2 #比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的 comm file1 file2 #比较文件,显示两个文件不相同的内容 echo message #显示一串字符 echo "message message2" #显示不连续的字符串 cat: cat file #显示文件的内容,和DOS的type相同 cat file | more #显示文件的内容并传输到more程序实现分页显示,使用命令less file可实现相同的功能 more #分页命令,一般通过管道将内容传给它,如ls | more export LC_ALL=zh_CN.GB2312 #将环境变量LC_ALL的值设为zh_CN.GB2312 export DISPLAY=0:0 #通过该设置,当前字符终端下运行的图形程序可直接运行于Xserver date #显示当前日期时间 date -s 20:30:30 #设置系统时间为20:30:30 date -s 2002-3-5 #设置系统时期为2003-3-5 clock –r #对系统Bios中读取时间参数 clock –w #将系统时间(如由date设置的时间)写入Bios eject #umout掉CDROM并将光碟弹出,但cdrom不能处于busy的状态,否则无效 du #计算当前目录的容量 du -sm /root #计算/root目录的容量并以M为单位 find -name /path file #在/path目录下查找看是否有文件file grep -ir “chars” #在当前目录的所有文件查找字串chars,并忽略大小写,-i为大小写,-r为下一级目录 vi file #编辑文件file vi 原基本使用及命令:输入命令的方式为先按ctrl+c, 然后输入:x(退出),:x!(退出并保存) :w(写入文件),:w!(不询问方式写入文件), :r file(读文件file) ,s/oldchars/newchars/g(将所有字串oldchars换成newchars) 这一类的命令进行操作 man ls #读取关于ls命令的帮助 man ls | grep color #读取关于ls命令的帮助并通过grep程序在其中查找color字串 startx #运行Linux图形有环境 Xfree86 #只运行X图形server reboot #重新启动计算机 halt #关闭计算机 init 0 #关闭所有应用程序和服务,进入纯净的操作环境 init 1 #重新启动应用及服务 init 6 #重新启动计算机 tar xfzv file.tgz #将文件file.tgz解压 tar xfzv file.tgz -C target_path #将文件file.tgz解压到target_path目录下 tar cfzv file.tgz source_path #将文件source_path压缩为file.tgz tar c directory > directory.tar #将目录directory打包成不压缩的directory.tar gzip directory.tar #将覆盖原文件生成压缩的 directory.tar.gz gunzip directory.tar.gz #覆盖原文件解压生成不压缩的 directory.tar。 tar xf directory.tar #可将不压缩的文件解包 dmesg #显示kernle启动及驱动装载信息 uname #显示操作系统的类型 uname -R #显示操作系统内核的version strings file 显示file文件中的ASCII字符内容 rpm -ihv program.rpm #安装程序program并显示安装进程 rpm2targz program.rpm program.tgz #将rpm格式的文件转换成tarball格式 su root #切换到超级用户 sulogin /dev/tty4 #在tty4即alt+F4终端等待用户登陆或直接登陆开启一个shell chmod a+x file #将file文件设置为可执行,脚本类文件一定要这样设置一个,否则得用bash file才能执行 chmod 666 file #将文件file设置为可读写 chown user /dir #将/dir目录设置为user所有 mknod /dev/hda1 b 3 1 #创建块设备hda1,主设备号为3,从设备号为1,即master硬盘的的第一个分区 mknod /dev/tty1 c 4 1 #创建字符设备tty1,主设备号为4,众设备号为1,即第一个tty终端 touch /tmp/running #在/tmp下创建一个临时文件running,重新启动后消失 sleep 9 #系统挂起9秒钟的时间 lpd stop 或 cups stop #停止打印服务程序 lpd start 或 cups start #启动打印服务程序 lpd restart 或 cups restart #重新启动打印服务程序 lpr file.txt #打印文件file.txt fdisk /dev/hda #就像执行了dos的fdisk一样 cfdisk /dev/hda #比fdisk界面稍为友好些 mount -t ext2 /dev/hda1 /mnt #把/dev/hda1装载到 /mnt目录 df #显示文件系统装载的相关信息 mount -t iso9660 /dev/cdrom /mnt/cdrom #将光驱加载到/mnt/cdrom目录 mount-t smb //192.168.1.5/sharedir /mnt -o username=tomlinux,password=tomlinux #将windows的的共享目录加载到/mnt/smb目录,用户名及密码均为tomlinux mount -t nfs 192.168.1.1:/sharedir /mnt #将nfs服务的共享目录sharedir加载到/mnt/nfs目录 umount /mnt #将/mnt目录卸载,/mnt目录必须处于空闲状态 umount /dev/hda1 #将/dev/hda1设备卸载,设备必须处于空亲状态 sync #将cache中的内容与磁盘同步,在Linux中复制文件,一般要系统空闲才去写文件 e2fsck /dev/hda1 #检查/dev/hda1是否有文件系统错误,提示修复方式 e2fsck -p /dev/hda1#检查/dev/hda1是否有错误,如果有则自动修复 e2fsck -y /dev/hda1#检查错误,所有提问均于yes方式执行 e2fsck -c /dev/hda1#检查磁盘是否有坏区 mkfs /dev/hda1 #格式化/dev/hda1为ext2格式 mkfs.minix /dev/hda1 #格式化/dev/hda1为minix格式文件系统 mfks /dev/hda9 #格工化/dev/hda9为Linux swap格式 swapon /dev/hda9 #将swap分区装载当作内存来用 swapoff /dev/hda9 #将swap分区卸载 lilo #运行lilo程序,程序自动查找/etc/lilo.conf并按该配置生效 lilo -C /root/lilo.conf #lilo程序按/root/lilo.conf配置生效 grub #在Linux shell状态下运行boot loader设置程序 grub-install #安装grub磁盘引导程序,成功后升级内核无须像lilo一样要重新启动系统,只需修改/etc/grub.conf即可实现新引导配置 rdev bzImage #显示kernel的根分区信息 rdev bzImage /dev/hda1 #将kernel的根分区设置为/dev/hda1,这在没有lilo等引导程序的系统中非常重要. dd if=/dev/fd0 of=floppy.fd #将软盘的内容复制成一个镜像,功能与旧石器时代常用的hd-copy相同 dd if=/dev/zero of=root.ram bs=1024,count=1024 #生成一个大小为1M的块设备,可以把它当作硬盘的一个分区来用 mkfs root.ram #将块设备格式化为ext2格式 dd if=root.ram of=/dev/ram0 #将init.rd格式的root.ram的内容导入内存 mount /dev/ram0 /mnt #ramdisk /dev/ram0装载到/mnt 目录 gcc hello.c #将hello.c编译成名为a.out二进制执行文件 gcc hello.c -o hello #将hello.c编译成名为hello的二进制执行文件 gcc -static -o hello hello.c #将hello.c编译成名为hello的二进制静态执行文件 ldd program #显示程序所使用了哪些库 objcopy -S program #将程序中的符号表及无用的调试信息去掉,可以小很多 strace netscape #跟踪程序netscape的执行,看调用的库,环境变量设置,配置文件,使用的设备,调用的其它应用程序等,在strace下,程序干了什么东东一目了然。 ps #显示当前系统进程信息 ps –ef #显示系统所有进程信息 kill -9 500 #将进程编号为500的程序干掉 killall -9 netscape #将所有名字为netscape的程序杀死,kill不是万能的,对僵死的程序则无效。 top #显示系统进程的活动情况,按占CPU资源百分比来分 free #显示系统内存及swap使用情况 time program #在program程序结束后,将计算出program运行所使用的时间 chroot . #将根目录切换至当前目录,调试新系统时使用 chroot /tomlinux #将根目录切换至/tomlinux目录 chroot /tomlinux sbin/init #将根目录切换至/tomlinux并执行sbin/init adduser id #增加一个叫id的用户 userdel id #增除叫id的用户 userlist #显示已登陆的用户列表 passwd id #修改用户id的密码 passwd -d root #将root用户的密码删除 chown id /work #指定/work目录为id用户所拥有 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 #设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0 ifconfig eth0:1 192.168.1.2 #捆绑网卡1的第二个地址为192.168.1.2 ifconfig eth0:x 192.168.1.x #捆绑网卡1的第二个地址为192.168.1.x ifconfig down eth1 #关闭第二块网卡,使其停止工作 hostname -F tomlinux.com #将主机名设置为tomlinux.com route #显示当前路由设置情况 route add default gw 192.168.1.1 metric 1 #设置192.168.1.1为默认的路由 route del default #将默认的路由删除 dhcp #启动dhcp服务 dhclient #启动dhcp终端并自动获取IP地址 ping 163.com #测试与163.com的连接 ping 202.96.128.68 #测试与IP 202。96.128.68的连接 probe rtl8139 #检查驱动程序rtl8139.o是否正常工作 lsmod #显示已装载的驱动程序 insmod rtl8139.o #装载驱动程序rtl8139.o insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330 #装载驱动程序并设置相关的irq,dma参数 rmmod rtl8139 #删除名为rtl8139的驱动模块 gpm -k #停止字符状态下的mouse服务 gpm -t ps2 #在字符状态下以ps2类型启动mouse的服务 telnet 192.168.1.1 #登陆IP为192.168.1.1的telnet服务器 telnet iserver.com #登陆域名为iserver.com的telnet服务器 ftp 192.168.1.1 或 ftp iserver.com #登陆到ftp服务
SQL语句(2007-3-12 14:51:00)
为了大家更容易理解我举出的SQL语句,本文假定已经建立了一个学生成绩管理数据库,全文均以学生成绩的管理为例来描述。
1.在查询结果中显示列名:
a.用as关键字:select name as '姓名' from students order by age
b.直接表示:select name '姓名' from students order by age
2.精确查找:
a.用in限定范围:select * from students where native in ('湖南', '四川')
b.between...and:select * from students where age between 20 and 30
c.“=”:select * from students where name = '李山'
d.like:select * from students where name like '李%' (注意查询条件中有“%”,则说明是部分匹配,而且还有先后信息在里面,即查找以“李”开头的匹配项。所以若查询有“李”的所有对象,应该命令:'%李%';若是第二个字为李,则应为'_李%'或'_李'或'_李_'。)
e.[]匹配检查符:select * from courses where cno like '[AC]%' (表示或的关系,与"in(...)"类似,而且"[]"可以表示范围,如:select * from courses where cno like '[A-C]%')
3.对于时间类型变量的处理
a.smalldatetime:直接按照字符串处理的方式进行处理,例如:
select * from students where birth > = '1980-1-1' and birth <= '1980-12-31'
4.集函数
a.count()求和,如:select count(*) from students (求学生总人数)
b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
c.max(列)和min(列),求最大与最小
5.分组group
常用于统计时,如分组查总数:
select gender,count(sno)
from students
group by gender
(查看男女学生各有多少)
注意:从哪种角度分组就从哪列"group by"
对于多重分组,只需将分组规则罗列。比如查询各届各专业的男女同学人数 ,那么分组规则有:届别(grade)、专业(mno)和性别(gender),所以有"group by grade, mno, gender"
select grade, mno, gender, count(*)
from students
group by grade, mno, gender
通常group还和having联用,比如查询1门课以上不及格的学生,则按学号(sno)分类有:
select sno,count(*) from grades
where mark<60
group by sno
having count(*)>1
6.UNION联合
合并查询结果,如:
SELECT * FROM students
WHERE name like ‘张%’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘李%’
7.多表查询
a.内连接
select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用别名)
b.外连接
b1.左连接
select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno
左连接特点:显示全部左边表中的所有项目,即使其中有些项中的数据未填写完全。
左外连接返回那些存在于左表而右表中却没有的行,再加上内连接的行。
b2.右连接
与左连接类似
b3.全连接
select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno
两边表中的内容全部显示
c.自身连接
select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno
采用别名解决问题。
d.交叉连接
select lastname+firstname from lastname CROSS JOIN firstanme
相当于做笛卡儿积
8.嵌套查询
a.用关键字IN,如查询李山的同乡:
select * from students
where native in (select native from students where name=’ 李山’)
b.使用关键字EXIST,比如,下面两句是等价的:
select * from students
where sno in (select sno from grades where cno=’B2’)
select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)
9.关于排序order
a.对于排序order,有两种方法:asc升序和desc降序
b.对于排序order,可以按照查询条件中的某项排列,而且这项可用数字表示,如:
select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)>85
order by 3
10.其他
a.对于有空格的识别名称,应该用"[]"括住。
b.对于某列中没有数据的特定查询可以用null判断,如select sno,courseno from grades where mark IS NULL
c.注意区分在嵌套查询中使用的any与all的区别,any相当于逻辑运算“||”而all则相当于逻辑运算“&&”
d.注意在做否定意义的查询是小心进入陷阱:
如,没有选修‘B2’课程的学生 :
select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno <> ’B2’
上面的查询方式是错误的,正确方式见下方:
select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno='B2')
11.关于有难度多重嵌套查询的解决思想:
如,选修了全部课程的学生:
select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))
最外一重:从学生表中选,排除那些有课没选的。用not exist。由于讨论对象是课程,所以第二重查询从course表中找,排除那些选了课的即可。
浅淡批处理文件.(2007-3-10 20:47:00)
扩展名是bat(在NT/2000/XP/2003下也可以是CMD)的文件就是批处理文件.
首先,批处理文件是一个文本文件,这个文件的每一行都是一条DOS命令(大部分
时候就好像我们在DOS提示符下执行的命令一样),你可以使用DOS下的EDIT或者WINDOWS
的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件.
其次,批处理文件是一种简单的程序,可以通过条件语句(IF)和流程控制语句(goto)
来控制命令行的流程,在批处理中也可以使用循环语句(FOR)来循环执行一条命令.当然,批
处理文件的编程能力与C语言等编程语句比起来是十分有限的,也是十分不规范的.批处理的
程序语句就是一条条的DOS命令(包括内部和外部命令),而批处理的能力主要取决于你所使用
的命令.
第三,每个编写的批处理文件都相当于一个DOS的外部命令,你可以把它所在的目录放到你的
DOS搜索路径(PATH)中来使得它可以在任意位置运行.一个良好的习惯是在硬盘上建立一个bat
或者batch目录(例如C:\BATCH),然后将所有你编写的批处理文件放到该目录中,这样只要在path
中设置上c:\batch,你就可以在任意位置运行所有你编写的批处理程序.
第四,在DOS和W.X/ME系统下,C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理
文件,每次系统启动时会自动运行该文件,你可以将系统每次启动时都要运行的命令放入该文件中,
例如设置搜索路径,调入鼠标驱动和磁盘缓存,设置系统环境变量等.下面一个运行于Windows 98r
autoexec.bat的示例:
@echo off
path c:\windows;c:\windows\command;c:\batch
SET TEMP=D:\TEMP
SET TMP=D:\TEMP
批处理的作用
简单的说,批处理的作用就是自动的连续执行多条命令.
如启动WPS软件时,每次都必须执行(>前面内容表示DOS提示符):
C:\cd wps
c:\wps>spdos
c:\wps>py
c:\wps>wbx
c:\wps>wps
如果每次用WPS之前都这样执行一次,您是不是觉得很麻烦呢?
好了,用批处理,就可以实现将这些麻烦的操作简单化,首先我们编写一个runwps.bat
批处理,内容如下 :
@echo off
c:
cd\wps
spdos
py
wbx
wps
cd
以后,我们每次进入WPS,只需要运行runwps这个批处理文件即可.
怎样开启端口(2007-3-9 18:02:00)
要手动打开端口,请按照下列步骤操作:
1. 单击开始,然后单击网上邻居。
2. 在网络任务下,单击查看网络连接。(或者,右键单击桌面上的网上邻居,然后单击属性。)
3. 右键单击用于 Internet 的连接,然后单击属性。
4. 单击高级选项卡,然后单击设置。
注意:如果设置按钮不可用,则此连接上未启用 Windows 防火墙,您无需打开任何端口(因为它们已经全部打开)。
5. 单击添加打开新端口。
6. 在说明框中,键入一个易记的名称。例如,键入文件共享:端口 188。
7. 在“您的网络上提供此服务的计算机名或 IP 地址”框中,键入 127.0.0.1。
注意:您可以指定内部计算机的 IP 地址。但通常情况下,请使用 127.0.0.1。
8. 在“外部端口”和“内部端口”框中,键入端口号。通常,此号码是相同的。
9. 单击 TCP 或 UDP,然后单击确定。
10. 为每个要打开的端口重复步骤 1 到步骤 9。
阅读全文(5162) | 评论:0 | 复制链接


最新评论