您的当前位置:首页正文

linux使用心得

2020-01-02 来源:好走旅游网
虚拟机安装

虚拟机安装时,各配置保持默认,除:hardware->hard disk->Existing Disk->Red Linux->Add->Red Linux Location

注意:不能使用网络安装,比如\\\\192.168.7.154\\xp.iso,因为系统没装好前虚拟机网卡不能使用

查看linux版本(通用命令) lsb_release -a

linux启动方式

如何让linux启动后自动进入图形界面或不让它进入图形界面?

a.进入图形界面:安装时选图形启动方式或把/etc/inittab的id:x:initdefault:这行改成id:5:initdefault:。

b.不进入图形界面:安装时选文本启动方式或把/etc/inittab的id:x:initdefault:这行改成id:3:initdefault:。 c.启动时按

ctrl+F1 文本模式 ctrl+F2 ctrl+F3 ctrl+F4

ctrl+F5 图形模式 ctrl+F6

注意:如果因为图形文件被损坏,进不了系统,则可以使用failsafe terminal(安全终端)进入终端模式修改启动文件,步骤为

选择session,将会话设定为

填写用户名和密码后,即可进入系统

一路OK后,即可打开终端

进入/etc/inittab,修改启动方式为3,即可使用文本方式登录

Linux中查看IP信息 IP:ifconfig DNS:nslookup cd /etc/init.d

./network restart

route/gateway:route

配置eth0的IP,同时激活设备

#ifconfig eth0 192.168….. netmask 255…… 激活/禁用设备: ifconfig eth 0:1 up/down

显示系统进程

ps -ef 显示系统进程 ps –A

ps -A |grep oracle >oracle.txt ps -ef | grep 'oracle' | wc -l tnsping orcl tnsping ydnm

sqlplus ydnm/ydnm@orcl grep orcl * -nR

service oracle9i stop service oracle9i restart

tcpdump -nei eth0 host 192.168.7.253 lsof | grep /home/virtual/bbb/ service portmap stop

service nfs stop

echo \"/home/virtual/public

192.168.7.235(rw,sync,all_squash,anonuid=555,anongid=555)\">>/etc/exports su -c \"chmod ug+rw /home/virtual/public\" virtual

su -c \"mkdir /home/virtual/public\" virtual

useradd virtual -c \"NFS private user\" -d /home/virtual -s /bin/bash -u 555 -g virtual df lsof

ifconfig eth0 | grep \"inet addr:\" | tr ' ' ':' |awk -F ':' '{print $13}' ifconfig eth0 | grep \"inet addr:\" | awk -F ':' '{print $2}'

sed -e '/export[\ ]*PATH/d' -e '/export[\ ]*DISPLAY/d' -e '/export[\ ]*ORACLE_BASE/d' -e '/export[\ ]*ORACLE_HOME/d' -e '/export[\ ]*ORACLE_SID/d' -e '/export[\ ]*LD_LIBRARY_PATH/d' -e '/export[\ ]*ORACLE_TERM/d' -e '/export[\ ]*ORA_NLS33/d' -e '/export[\ ]*LD_ASSUME_KERNEL/d' -e '/export[\ ]*NLS_LANG/d' -e '/export[\ ]*LANG/d' -e '/export[\ ]*DATASOURCE/d' -e '/export[\ ]*USERNAME/d' -e '/export[\ ]*PASSWORD/d' ~/.bash_profile >$profile profile=/tmp/profile.$$

sed -e '/export[\ ]*PATH/d' -e '/export[\ ]*ORACLE_SID/d' ~/.bash_profile

sed -e '/export[\ ]PATH/d' -e '/export[\ ]ORACLE_BASE/d' -e

'/export[\ ]ORACLE_SID/d' ~/.bash_profile

mount -o rw -t nfs 192.168.7.23:/home/virtual/public /home/virtual/bbb umount /home/virtual/bbb ntsysv nfsstat –a exportfs –v rpcinfo –p

netstat -lnp groupdel virtual groupadd -g 555 virtual

useradd virtual -c \"NFS private user\" -d /home/virtual -s /bin/bash -u 555 -g virtual

useradd virtual -c \"NFS private user\" -d /home/virtual -s /sbin/nologin -u 555 -g virtual lsm

Linux系统下终端setup显示乱码的解决方法 方法一:配置SSH工具

SecureCRT中文版配置

[全局选项]→[默认会话]→[编辑默认设置]→[终端]→[外观]→[字体]→[新宋体 10pt CHINESE_GB2312]→[字符编码 UTF-8] putty配置

[window]→[Appearance]→[Font settings]→[Change]→[Fixedsys CHINESE_GB2312]

[window]→[Appearance]→[Translation]→[Received data assumed to be in which character set]→[Use font encoding UTF-8]

如果经常使用,把这些设置保存在session里面。

打开putty,登录成功后,在shell中输入:export LC_ALL='zh_CN.utf8' 方法二:配置系统

操作系统语言是中文,显示中文字符 编辑/etc/sysconfig/i18n,修改为如下内容: LANG=\"zh_CN.GB2312\"

SUPPORTED=\"zh_CN.UTF-8:zh_CN:zh\" SYSFONT=\"latarcyrheb-sun16\" 或者

LANG=zh_CN.GB18030

LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN

export LANG LANGUAGE

这样就能在终端输入和显示中文了,并且shell脚本里原本的中文显示乱码问题也解决了。 操作系统语言是英文,显示中文字符

编辑/etc/sysconfig/i18n,修改为如下内容: LANG=\"en_US\"

SUPPORTED=\"en_US.UTF-8:en_US:en\" SYSFONT=\"latarcyrheb-sun16\"

Linux必学的60个命令 -文件操作

Linux 系统信息存放在文件里,文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址及其它一些管理信息,如文件的用户、文件的大小等。文件可以是一封信、一个通讯录,或者是程序的源语句、程序的数据,甚至可以包括可执行的程序和其它非正文内容。 Linux文件系统具有良好的结构,系统提供了很多文件处理程序。这里主要介绍常用的文件处理命令。 file

1.作用 件内容判断文件类型,使用权限是所有用户。

2.格式

file通过探测文

file [options] 文件名

3.[options]主要参数

-v:在标准输出后显示版本信息,并且退出。

-z:探测压缩过的文件类型。

-L:允许符合连接。

-f name:从文件namefile中读取要分析的文件名列表。

4.简单说明

使用file命令可以知道某个文件究竟是二进制(ELF格式)的可执行文件, 还是Shell Script文件,或者是其它的什么格式。file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。

5.应用实例

如果我们看到一个没有后缀的文件grap,可以使用下面命令:

$ file grap

grap: English text

此时系统显示这是一个英文文本文件。需要说明的是,file命令不能探测包括图形、音频、视频等多媒体文件类型。

mkdir

1.作用

mkdir命令的作用是建立名称为dirname的子目录,与MS DOS下的md命令类似,它的使用权限是所有用户。

2.格式

mkdir [options] 目录名

3.[options]主要参数

-m, --mode=模式:设定权限<模式>,与chmod类似。

-p, --parents:需要时创建上层目录;如果目录早已存在,则不当作错误。

-v, --verbose:每次创建新目录都显示信息。

--version:显示版本信息后离开。

4.应用实例

在进行目录创建时可以设置目录的权限,此时使用的参数是“-m”。假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限),那么可以使用以下命令:

$ mkdir -m 777 tsk grep

1.作用

grep命令可以指定文件中搜索特定的内容,并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

2.格式

grep [options]

3.主要参数

[options]主要参数:

-c:只输出匹配行的计数。

-I:不区分大小写(只适用于单字符)。

-h:查询多文件时不显示文件名。

-l:查询多文件时只输出包含匹配字符的文件名。

-n:显示匹配行及行号。

-s:不显示不存在或无匹配文本的错误信息。

-v:显示不包含匹配文本的所有行。

pattern正则表达式主要参数:

\\:忽略正则表达式中特殊字符的原有含义。

^:匹配正则表达式的开始行。

$: 匹配正则表达式的结束行。

\\<:从匹配正则表达式的行开始。

\\>:到匹配正则表达式的行结束。

[ ]:单个字符,如[A]即A符合要求 。

[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 。:所有的单个字符。

* :有字符,长度可以为0。

正则表达式是Linux/Unix系统中非常重要的概念。正则表达式(也称为“regex”或“regexp”)是一个可以描述一类字符串的模式(Pattern)。如果一个字符串可以用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。这和DOS中用户可以使用通配符 “*”代表任意字符类似。在Linux系统上,正则表达式通常被用来查找文本的模式,以及对文本执行“搜索-替换”操作和其它功能。

4.应用实例

查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址,但是却忘了第二部分中的其余部分,只

知到有两个句点,例如nnn nn..。要抽取其中所有nnn.nnn IP地址,使用[0-9 ]\\{3 \\}\\.[0-0\\{3\\}\\。含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。

$grep '[0-9 ]\\{3 \\}\\.[0-0\\{3\\}\\' ipfile

补充说明,grep家族还包括fgrep和egrep。fgrep是fix grep,允许查找字符串而不是一个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持\\q模式范围的应用及与之相对应的一些更加规范的模式。 dd

1.作用

dd命令用来复制文件,并根据参数将数据转换和格式化。

2.格式

dd [options]

3.[opitions]主要参数

bs=字节:强迫 ibs=<字节>及obs=<字节>。

cbs=字节:每次转换指定的<字节>。

conv=关键字:根据以逗号分隔的关键字表示的方式来转换文件。

count=块数目:只复制指定<块数目>的输入数据。

ibs=字节:每次读取指定的<字节>。

if=文件:读取<文件>内容,而非标准输入的数据。

obs=字节:每次写入指定的<字节>。

of=文件:将数据写入<文件>,而不在标准输出显示。

seek=块数目:先略过以obs为单位的指定<块数目>的输出数据。

skip=块数目:先略过以ibs为单位的指定<块数目>的输入数据。

4.应用实例

dd命令常常用来制作Linux启动盘。先找一个可引导内核,令它的根设备指向正确的根分

区,然后使用dd命令将其写入软盘:

$ rdev vmlinuz /dev/hda

$dd if=vmlinuz of=/dev/fd0

上面代码说明,使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda,请把“hda”换成自己的根分区,接下来用dd命令将该内核写入软盘。 find

1.作用

find命令的作用是在目录中搜索文件,它的使用权限是所有用户。

2.格式

find [path][options][expression]

path指定目录路径,系统从这里开始沿着目录树向下查找文件。它是一个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。

3.主要参数

[options]参数:

-depth:使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容。

-maxdepth levels:表示至多查找到开始目录的第level层子目录。level是一个非负数,如果level是0的话表示仅在当前目录中查找。

-mindepth levels:表示至少查找到开始目录的第level层子目录。

-mount:不在其它文件系统(如Msdos、Vfat等)的目录和文件中查找。

-version:打印版本。

[expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。它的参数非常多,这里只介绍一些常用的参数。

—name:支持统配符*和?。

-atime n:搜索在过去n天读取过的文件。

-ctime n:搜索在过去n天修改过的文件。

-group grpoupname:搜索所有组为grpoupname的文件。

-user 用户名:搜索所有文件属主为用户名(ID或名称)的文件。

-size n:搜索文件大小是n个block的文件。

-print:输出搜索结果,并且打印。

4.应用技巧

find命令查找文件的几种方法:

(1)根据文件名查找

例如,我们想要查找一个文件名是lilo.conf的文件,可以使用如下命令:

find / -name lilo.conf

find命令后的“/”表示搜索整个硬盘。

(2)快速查找文件

根据文件名查找文件会遇到一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在很深的子目录中时。如果我们知道了这个文件存放在某个目录中,那么只要在这个目录中往下寻找就能节省很多时间。比如smb.conf文件,从它的文件后缀“.conf”可以判断这是一个配置文件,那么它应该在/etc目录内,此时可以使用下面命令:

find /etc -name smb.conf

这样,使用“快速查找文件”方式可以缩短时间。

(3)根据部分文件名查找方法

有时我们知道只某个文件包含有abvd这4个字,那么要查找系统中所有包含有这4个字符的文件可以输入下面命令:

find / -name '*abvd*'

输入这个命令以后,Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件(其中*是通配符),比如abvdrmyz等符合条件的文件都能显示出来。

(4) 使用混合查找方式查找文件

find命令可以使用混合查找的方法,例如,我们想在/etc目录中查找大于500000字节,并且在24小时内修改的某个文件,则可以使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。

find /etc -size +500000c -and -mtime +1 mv

1.作用

mv命令用来为文件或目录改名,或者将文件由一个目录移入另一个目录中,它的使用权限是所有用户。该命令如同DOS命令中的ren和move的组合。

2.格式

mv[options] 源文件或目录 目标文件或目录

3.[options]主要参数

-i:交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答“y”或“n”,这样可以避免误覆盖文件。

-f:禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示,指定此参数后i参数将不再起作用。

4.应用实例

(1)将/usr/cbu中的所有文件移到当前目录(用“.”表示)中:

$ mv /usr/cbu/ * .

(2)将文件cjh.txt重命名为wjz.txt:

$ mv cjh.txt wjz.txt ls

1.作用

ls命令用于显示目录内容,类似DOS下的dir命令,它的使用权限是所有用户。

2.格式

ls [options][filename]

3.options主要参数

-a, --all:不隐藏任何以“.” 字符开始的项目。

-A, --almost-all:列出除了“ . ”及 “.. ”以外的任何项目。

--author:印出每个文件著作者。

-b, --escape:以八进制溢出序列表示不可打印的字符。

--block-size=大小:块以指定<大小>的字节为单位。

-B, --ignore-backups:不列出任何以 ~ 字符结束的项目。

-f:不进行排序,-aU参数生效,-lst参数失效。

-F, --classify:加上文件类型的指示符号 (*/=@| 其中一个)。

-g:like -l, but do not list owner。

-G, --no-group:inhibit display of group information。

-i, --inode:列出每个文件的inode号。

-I, --ignore=样式:不印出任何符合Shell万用字符<样式>的项目。

-k:即--block-size=1K。

-l:使用较长格式列出信息。

-L, --dereference:当显示符号链接的文件信息时,显示符号链接所指示的对象,而并非符号链接本身的信息。

-m:所有项目以逗号分隔,并填满整行行宽。

-n, --numeric-uid-gid:类似-l,但列出UID及GID号。

-N, --literal:列出未经处理的项目名称,例如不特别处理控制字符。

-p, --file-type:加上文件类型的指示符号 (/=@| 其中一个)。

-Q, --quote-name:将项目名称括上双引号。

-r, --reverse:依相反次序排列。

-R, --recursive:同时列出所有子目录层。

-s, --size:以块大小为序。

4.应用举例

ls 命令是Linux系统使用频率最多的命令,它的参数也是Linux命令中最多的。使用ls命令时会有几种不同的颜色,其中蓝色表示是目录,绿色表示是可执行文件,红色表示是压缩文件,浅蓝色表示是链接文件,加粗的黑色表示符号链接,灰色表示是其它格式文件。ls最常使用的是ls- l,见图1所示。

图1 使用ls-l命令

文件类型开头是由10个字符构成的字符串。其中第一个字符表示文件类型,它可以是下述类型之一:-(普通文件)、d(目录)、l(符号链接)、b(块设备文件)、c(字符设备文件)。后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读(r)、写(w)和执行权限(x)。对于目录,表示进入权限。s表示当文件被执行时,把该文件的UID 或GID赋予执行进程的UID(用户ID)或GID(组 ID)。t表示设置标志位(留在内存,不被换出)。如果该文件是目录,那么在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文件,那么在该文件执行后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。接着显示的是文件大小、生成时间、文件或命令名称。 diff

1.作用

diff命令用于两个文件之间的比较,并指出两者的不同,它的使用权限是所有用户。

2.格式

diff [options] 源文件 目标文件

3.[options]主要参数

-a:将所有文件当作文本文件来处理。

-b:忽略空格造成的不同。

-B:忽略空行造成的不同。

-c:使用纲要输出格式。

-H:利用试探法加速对大文件的搜索。

-I:忽略大小写的变化。

-n --rcs:输出RCS格式。 cmp

1.作用

cmp(“compare”的缩写)命令用来简要指出两个文件是否存在差异,它的使用权限是所有用户。

2.格式

cmp[options] 文件名

3.[options]主要参数

-l: 将字节以十进制的方式输出,并方便将两个文件中不同的以八进制的方式输出。 cat

1.作用

cat(“concatenate”的缩写)命令用于连接并显示指定的一个和多个文件的有关信息,它的使用权限是所有用户。

2.格式

cat [options] 文件1 文件2„„

3.[options]主要参数

-n:由第一行开始对所有输出的行数编号。

-b:和-n相似,只不过对于空白行不编号。

-s:当遇到有连续两行以上的空白行时,就代换为一行的空白行。

4.应用举例

(1)cat命令一个最简单的用处是显示文本文件的内容。例如,我们想在命令行看一下README文件的内容,可以使用命令:

$ cat README

(2)有时需要将几个文件处理成一个文件,并将这种处理的结果保存到一个单独的输出文件。cat命令在其输入上接受一个或多个文件,并将它们作为一个单独的文件打印到它的输出。例如,把README和INSTALL的文件内容加上行号(空白行不加)之后,将内容附加到一个新文本文件File1 中:

$ cat README INSTALL File1

(3)cat还有一个重要的功能就是可以对行进行编号,见图2所示。这种功能对于程序文档的编制,以及法律和科学文档的编制很方便,打印在左边的行号使得参考文档的某一部分变得容易,这些在编程、科学研究、业务报告甚至是立法工作中都是非常重要的。

图2 使用cat命令/etc/named.conf文件进行编号

对行进行编号功能有-b(只能对非空白行进行编号)和-n(可以对所有行进行编号)两个参数:

$ cat -b /etc/named.conf ln

1.作用

ln命令用来在文件之间创建链接,它的使用权限是所有用户。

2.格式

ln [options] 源文件 [链接名]

3.参数

-f:链结时先将源文件删除。

-d:允许系统管理者硬链结自己的目录。

-s:进行软链结(Symbolic Link)。

-b:将在链结时会被覆盖或删除的文件进行备份。

链接有两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。

默认情况下,ln命令产生硬链接。

硬连接指通过索引节点来进行的连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件才会被真正删除。

与硬连接相对应,Lnux系统中还存在另一种连接,称为符号连接(Symbilc Link),也叫软连接。软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

动手联系

上面我们介绍了Linux文件处理命令,下面介绍几个实例,大家可以动手练习一下刚才讲过的命令。

1.利用符号链接快速访问关键目录

符号链接是一个非常实用的功能。假设有一些目录或文件需要频繁使用,但由于Linux的文件和目录结构等原因,这个文件或目录在很深的子目录中。比如, Apache Web服务器文档位于系统的/usr/local/httpd/htdocs中,并且不想每次都要从主目录进入这样一个长的路径之中(实际上,这个路径也非常不容易记忆)。

为了解决这个问题,可以在主目录中创建一个符号链接,这样在需要进入该目录时,只需进入这个链接即可。

为了能方便地进入Web服务器(/usr/local/httpd/htdocs)文档所在的目录,在主目录下可以使用以下命令:

$ ln -s /usr/local/httpd/htdocs gg

这样每次进入gg目录就可访问Web服务器的文档,以后如果不再访问Web服务器的文档时,删除gg即可,而真正的Web服务器的文档并没有删除。

2.使用dd命令将init.rd格式的root.ram内容导入内存

dd if=/dev/fd0 of=floppy.fd

dd if=root.ram of=/dev/ram0 #

3.grep命令系统调用

grep是Linux/Unix中使用最广泛的命令之一,许多Linux系统内部都可以调用它。

(1)如果要查询目录列表中的目录,方法如下:

$ ls -l | grep '∧d'

(2)如果在一个目录中查询不包含目录的所有文件,方法如下:

$ ls -l | grep '∧[∧d]'

(3)用find命令调用grep,如所有C源代码中的“Chinput”,方法如下:

$find /ZhXwin -name *.c -exec grep -q -s Chinput {} \\;-print

转自ChinaUnix

--

※ 来源:·水木社区 newsmth.net·[FROM: 211.151.90.*]

secureCRT自动断开问题 可能原因之一

有时候服务器端的 /etc/profile 或者 ~/.bash_profile 中设置了 TMOUT 选项,或者是 /etc/ssh/sshd_config 文件中设置了客户端连接时间的设置,很可能一段之间之后,SecureCRT就会被断开连接,所以SecureCRT又一个选项可以设置每隔多少秒自动发送一个信息到服务器端,告诉服务器端客户端还在连接中。

会话选项 –> 终端 –> 反空闲 –> 发送字符串 可以设置,比如发送 \\n 、null或其他信息过去,后面可以设置每隔多少秒发送,比如可以60秒一次,这样可以保证不会掉线。 如果想应用于所有会话的话,选择全局选项->默认会话->编辑默认设置.做上述修改修改就可以全局使用了.

发现这样做不好,每隔一段时间过来看,发现出来好多null、空格或别的字符,看着很不爽,经过研究发现原来是卡巴斯基的问题,要把卡巴上反黑客的防火墙关掉,就彻底解决了,嘿嘿 现在用着好多了,半天不用SecureCRT,回来发现还可以操作,爽呆了,简直仿佛重见天日啊 哈哈

可能原因之二 无

解决方法

Under Linux/FreeBSD/etc systems that use OpenSSH you can add the following to your

~/.ssh/config:

ServerAliveInterval 30

thus your connections will never timeout.

实践了一下,只需要建~/.ssh这个目录就足够了,不需要再往下建config

设置时间

date -s \"01:59:00 5/16/2008\"

修改时区

# vi /etc/sysconfig/clock ZONE=Asia/Shanghai UTC=false ARC=false (查/usr/share/zoneinfo下面的文件) # rm /etc/localtime

# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Linux环境下的Apache的配置 Linux环境下的Apache自动启动

Linux有两种方法可以让Apache在系统启动时自动启动。

1. 在/etc/rc.d/rc.local中增加启动apache的命令,例如:/usr/local/httpd/bin/apachectl start

2. 将apache注册为系统服务

首先将apachectl命令拷贝至/etc/rc.d/init.d目录下,改名为httpd 使用编辑器打开httpd文件,并在第一行#!/bin/sh下增加两行文字如下 # chkconfig: 35 70 30 # description: Apache 接着注册该服务 chkconfig --add httpd 一切OK了,启动服务 service httpd start

其中所增加的第二行中三个数字第一个表示在运行级别3和5下启动apache,第二、三是关于启动和停止的优先级配置,无关紧要。

APACHE支持的认证(普通认证+摘要认证)

基于应用程序级的Apache认证配置(普通认证篇)

作者:雨水 日期:2007-03-23 转载请保留此处

Apache服务器提供了两种用户认证方式,即普通认证和摘要认证。在网上有很多讲如何配置Apache普通认证的文章,但是它们几乎都是类似告诉你如何去保护某个文件夹的文件之类的配置方法。

如果你的需求是对所有的HTTP请求都认证,并且针对认证后的请求做出相应的处理,这又该如何配置呢?这里也跟我这里题目有关。首先我要解释一下它。这个题目为什么叫基于应用程序级呢?也就是说这里的配置不是为那些将Apache用于网页浏览的Web服务器配置,而是为需要在Apache上做应用程序开发,处理自定义业务的用户。要对所有的HTTP请求自己再加自定义的处理,因此就必须编写了自己的Apache模块,并定义了处理方法,这里叫hello-bdb。

首先,配置httpd.conf文件。你需要在conf目录下的httpd.conf文件中加入(位置不重要,但必须放在最顶层)如下配置:

SetHandler hello-bdb

AuthName \"Server Infomation\" AuthType Basic

AuthUserFile D:\\Apache22\\conf\\htpasswd.pwd require valid-user 针对上述配置的解释:

(1)SetHandler 是增加的自定义处理,也就是自己编写的处理模块;

(2)AuthName 后面是服务器信息,你可以替换成任意字符,最好用能反应你服务器信息的字符

串,这里个信息会显示在输入用户和密码的对话框中,见后面的图;

(3)AuthType 后面是认证类型,Basic表示普通认证。摘要认证相应的指令是Digest; (4)AuthUserFile 后面是你存放用户名和密码的文件,后面会介绍如何生成该文件; (5)require valid-user表示配置文件中的合法用户都可以访问。

其次,生成用户名和密码文件。这时要使用Apache提供的htpasswd工具。方法如下: htpasswd -bc ../conf/htpasswd.pwd user1 1234

上述命令生成htpasswd.pwd文件,并向其中加入用户user1,密码为1234。 如果成功了,系统会提示如下。 Automatically using MD5 format. Adding password for user user1

最后,运行。在浏览器中输入http://localhost。会弹出图示如下的对话框:

分别输入用户名user1和密码1234,然后系统通过认证后,进行自定义的处理,然后会将处理结果返回到浏览器。

大家一看就感觉上面的普通认证安全性不高,并且用户名和密码在传输过程中也只进行了Base64编码,很容易被窃取。摘要认证的安全性要比普通认证高,缺点就是不是所有的浏览器都支持它。

在另外的文章中,我会介绍摘要认证的配置方法。如有疑问欢迎评论或来邮。

基于应用程序级的Apache认证配置(摘要认证篇)

作者:雨水 日期:2007-03-23 出处: 转载请保留此处

在《基于应用程序级的Apache认证配置(普通认证篇)》中已经讲述了如何配置Apache的普通认证,关于很多背景信息请参考该文。

这里为了简便,就直接在上文的背景下讲述如何配置摘要认证。

首先,配置httpd.conf文件。你需要在conf目录下的httpd.conf文件中加入(位置不重要,但必须放在最顶层)如下配置:

SetHandler hello-bdb

AuthName \"Server Infomation\" AuthType Digest

AuthUserFile D:\\Apache22\\conf\\htpasswd.pwd Require valid-user

上述的配置与摘要认证不同之处在于AuthType后面变成了Digest,表示认证类型为摘要认证。

这里要提起的是AuthUserFile指令,在所有讲述摘要认证的文章中(包括Apache官方文档)都说应该使用AuthDigestFile指令,我最先也是按照官方文档去配置,结果就是install不成功。系统提示” Invalid command 'AuthDigestFile', perhaps misspelled or defined by a module not included in the server configuration”。这个问题多花我至少1个小时。最先以为是其他的什么地方配置不对,最后经过查阅才发现在Apache2.2.4版本中还不支持AuthDigestFile指令(通过查看源代码),因此暂时用AuthUserFile指令替代。

特别注意的是,Apache系统默认加载mod_auth_basic模块,也即是默认是普通认证。因此还必须将LoadModule auth_basic_module modules/mod_auth_basic.so这一行前面加一个#将其注释掉,然后加上LoadModule auth_digest_module modules/mod_auth_digest.so对摘要模块的加载。

其次,生成用户名和密码文件。这时要使用Apache提供的htdigest工具。方法如下: htdigest -c ../conf/htpasswd.pwd \"Server Infomation\" user1

上述命令生成htpasswd.pwd文件,并向其中加入用户user1,随后会提示你输入密码两遍,如下:

Adding password for user1 in realm Server Infomation. New password: ****

Re-type new password: ****

最后,运行。在浏览器中输入http://localhost。会弹出图示如下的对话框:

分别输入用户名user1和密码1234,然后系统通过认证后,进行自定义的处理,然后会将处理结果返回到浏览器。

这里只介绍了摘要认证的简单配置,还有一些较为复杂的配置后面再继续探讨。如有疑问欢迎评论或来邮。

apache虚拟主机(非虚拟目录)的配置 conf/extra/httpd-vhosts.conf

apache编译讨论

以前编译apache的时候,都是google搜索到的直接拿来用,这次自己编译mod_rewrite和ssl遇到了问题,又不知道问题出在哪里,一个是mod_rewrite模块没有起作用,一个是以ssl启动apache的时候报告如下错误:

apachectl startssl

Syntax error on line 246 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_ssl.so /usr/local/apache2/modules/mod_ssl.so: undefined symbol: X509_free

into

server:

当时我是这么编译apache的

./configure

--prefix=/usr/local/apache2 --enable-so

--enable-mods-shared=most --enable-rewrite --enable-speling --enable-forward

--enable-ssl

--with-ssl=/usr/local/openssl

而问题就出在–enable-so。现在知道了–enable-so的意思是说让apache 核心装载DSO,但是不实际编译任何动态模块,而–enable-ModuleName的意思是说编译并包含模块ModuleName,–enable-ModuleName=shared 的意思是说将这个模块编译成动态的.也就是说--enable-so和--enable-mods-shared=most,--enable-rewrite等各项都是矛盾的

明白了这几个选项的意思,感觉就水落石出了,根据上面的总结,我应该去掉–enable-so这行,如何希望动态编译模块,比如:–enable-rewrite应该替换为: –enable-rewrite=shared,最后,我将要编译的应该为:

./configure

--prefix=/usr/local/apache2 --enable-mods-shared=most --enable-rewrite --enable-speling

--enable-forward --enable-ssl

--with-ssl=/usr/local/openssl

上面中 –enable-mods-shared=most的意思是说 动态的编译进来大多数的模块 而 –enable-mods-shared=all是指动态的编译所有的模块 如果把-shared去掉,就是静态的编译了…

综上所述

总结出了我个人对apache的动态与静态编译的理解

好比有两个人a和m,a代表apache,m代表module,要想让a使用m的东西 一个方法是把m的东西都放到a那里去,a使用的时候就是现成的了,就是所谓的静态编译 而另一个方法就是动态编译了,就是告诉a, m的住址,当a要使用m的东西的时候,a去找m,然后使用

不过,这种方法要注意的一个问题就是:m必须要有实际的住址,

否则a会找不到m而产生错误的,我此文开始提到的 apachectl startssl产生 的错误就是这个原因,应该再编译好ssl才可以的.

这种方法也就是apache 的动态(DSO)编译了

linux+apache+mysql+php 编译apache

./confugure –help | more 7.11

./configure --prefix=/usr/apache2 --enable-so --enable-mods-shared=most && make && make install

添加ssl版

./configure --prefix=/usr/apache2 --enable-so --enable-mods-shared=most --enable-ssl --with-ssl=/usr/local/openssl && make && make install

添加其它模块版

./configure --prefix=/usr/apache2 --enable-so --enable-mods-shared=most --enable-rewrite --enable-speling --enable-forward --enable-ssl --with-ssl=/usr/local/openssl && make && make install

--with-ssl=/usr/local/openssl 把ssl模块编译进apache中,但不启用,体现在LoadModule位置,相当于apache的外部模块

--enable-ssl 启用ssl模块,体现在Include extra/httpd-ssl.conf 否则纵使openssl已经装好,还是无法被apache使用

编译php

./configure --prefix=/usr/php5 --with-apxs2=/usr/apache2/bin/apxs --with-mysql=/usr/mysql5 --with-config-file-path=/usr/php5/lib --with-gd --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-freetype-dir=/usr/lib --with-gdbm --with-xsl --with-zlib-dir=/usr/lib --with-libxml-dir=/usr/local/lib --with-openssl --enable-debug --enable-sockets --enable-soap --enable-mod-charset --enable-force-cgi-redirect --enable-fastcgi --enable-ftp --enable-zip --enable-shared=yes --enable-static=yes

--with-jpeg-dir[=DIR] GD: Set the path to libjpeg install prefix --with-png-dir[=DIR] GD: Set the path to libpng install prefix --with-zlib-dir[=DIR] GD: Set the path to libz install prefix

--with-xpm-dir[=DIR] GD: Set the path to libXpm install prefix --with-ttf[=DIR] GD: Include FreeType 1.x support

--with-freetype-dir[=DIR] GD: Set the path to FreeType 2 install prefix

--with-t1lib[=DIR] GD: Include T1lib support. T1lib version >= 5.0.0 required --enable-gd-native-ttf GD: Enable TrueType string function

--enable-gd-jis-conv GD: Enable JIS-mapped Japanese font support 精简版

./configure --prefix=/usr/php5 --with-apxs2=/usr/apache2/bin/apxs --with-mysql=/usr/mysql5 --with-config-file-path=/usr/php5/lib --enable-shared=yes --with-dbm --enable-dba && make && make install

编译mysql

./configure --prefix=/usr/mysql5 --sysconfdir=/etc --localstatedir=/var/lib/mysql && make && make install

apache+ssl配置

服务器证书在启动apache的时候得到使用(此时要求输入服务器证书的密码),使apache具备验证客户端证书的能力

客户端的证书在导入内容的时候得到使用(此时要求输入客户端的密码),使浏览器具备访问apache服务器的能力

配置了ssl后启动apache时免输入密码

安装了一台服务器,只开放了https,没有开放http

把启动命令/usr/local/bin/apachectl startssl写到/etc/rc.local里,重启服务器。 发现apache并没有自动运行。 手动运行

[root@localhost]# /usr/local/bin/apachectl restart httpd not running, trying to start

Apache/2.2.0 mod_ssl/2.2.0 (Pass Phrase Dialog)

Some of your private key files are encrypted for security reasons. In order to read them you have to provide the pass phrases.

Server www.example.com:443 (RSA) Enter pass phrase:

OK: Pass Phrase Dialog successful. 发现原来是要输入pass phrase的原因

解决方案有2种

1:去掉/usr/local/bin/apachectl startssl启动的pass phrase,用空pass phrase启动apache

(while preserving the original file):

$ cp server.key server.key.org

$ openssl rsa -in server.key.org -out server.key

确认server.key 文件为root可读 $ chmod 400 server.key

参考http://www.chinaunix.net/jh/13/599604.html

2:编辑

vi /usr/local/apache2/conf/extra/httpd-ssl.conf 注释SSLPassPhraseDialog builtin

在后添加

SSLPassPhraseDialog exec:/usr/local/apache2/conf/apache_pass.sh

vi /usr/local/apache2/conf/apache_pass.sh #!/bin/sh echo \"密码\"

chmod +x /usr/local/apache2/conf/apache_pass.sh

然后重启apache

[root@localhost conf]# /home/apache2/bin/apachectl start [root@localhost conf]#

然后从起服务器,就可以运行了

参考http://httpd.apache.org/docs/2.0 ... sslpassphrasedialog

PHP文件上传相关配置

1. file_uploads = on 是否允许通过HTTP上传文件的开关。默认为ON即是开 2. upload_tmp_dir 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹

upload_max_filesize = 2m 望文生意,即允许上传文件大小的最大值。默认为2M 4. post_max_size = 10m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M

5. max_execution_time = 300 每个PHP页面运行的最大时间值(秒),默认30秒 6. max_input_time = 600 每个PHP页面接收数据所需的最大时间,默认60秒 7. memory_limit = 128m 每个PHP页面所吃掉的最大内存,默认8M 如果upload_max_filesize = 2m前面没有字符,可以加^替换,如下

sed -e 's/^upload_max_filesize = 8m/upload_max_filesize = 2m/g' cfg.sh

1. file_uploads = on 是否允许通过HTTP上传文件的开关。默认为ON即是开 2. upload_tmp_dir 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹

3. upload_max_filesize = 8m 望文生意,即允许上传文件大小的最大值。默认为2M 4. post_max_size = 10m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M

5. max_execution_time = 300 每个PHP页面运行的最大时间值(秒),默认30秒 6. max_input_time = 600 每个PHP页面接收数据所需的最大时间,默认60秒 7. memory_limit = 128m 每个PHP页面所吃掉的最大内存,默认8M 如果upload_max_filesize前面有字符,就不能加^替换,如下

sed -e 's/^upload_max_filesize = 8m/upload_max_filesize = 2m/g' cfg.sh

安装apache

安装出错:

httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

将httpd.conf中的ServerName前面的注释去掉,改为ServerName localhost:80即可 安装PHP之前,系统中必须安装一些包,包括Bison解析器生成器,Flex词法分析生成器,GCC编译器集合以及m4宏处理器

Linux软件的安装和卸载 内核的编译过程

[root@localhost ~]# make

[root@localhost ~]# make modules_install [root@localhost ~]# make install [root@localhost ~]# vi /etc/grub.conf

Linux系统中自带Mysql、Apache、Php卸载

发布时间:2008.04.01 06:27 来源:赛迪网 作者:korn 卸载步骤如下: 卸载Mysql

[root@localhost ~]# rpm -qa|grep mysql mod_auth_mysql-2.6.1-2.2 php-mysql-4.3.9-3.15

mysql-devel-4.1.20-1.RHEL4.1 mysql-4.1.20-1.RHEL4.1

mysqlclient10-3.23.58-4.RHEL4.1

libdbi-dbd-mysql-0.6.5-10.RHEL4.1

说明:rpm -qa | grep mysql 命令是为了把mysql相关的包都列出来,我上面的例子是Linux AS4默认安装mysql的rpm软件包列表,如果是别的Linux版本列出来的列表有可能会不一样,不过不用担心,不管是什么,卸载都从最下面的一个包开始,直到卸载掉第一个为止。 比如:在这个例子中,我们应该先卸载libdbi-dbd-mysql-0.6.5-10.RHEL4.1 方法如下:rpm -e -dbd-mysql-0.6.5-10.RHEL4.1

说明:rpm -e 是卸载rpm包的命令,后面是包名称,最后的版本号是不用打的,比如我们下一步卸载mysqlclient10-3.23.58-4.RHEL4.1包,方法如下: rpm -e mysqlclient 卸载Apache

[root@localhost ~]# rpm -qa|grep httpd httpd-manual-2.0.52-25.ent system-config-httpd-1.3.1-1 httpd-2.0.52-25.ent

httpd-suexec-2.0.52-25.ent

说明:方法跟卸载Mysql一样,不用说了吧 卸载PHP

[root@localhost ~]# rpm -qa|grep php php-odbc-4.3.9-3.15 php-4.3.9-3.15

php-mysql-4.3.9-3.15 php-pear-4.3.9-3.15 php-ldap-4.3.9-3.15

php-pgsql-4.3.9-3.15

说明:方法跟卸载Mysql一样,不用说了吧 注意:卸载的时候如果卸载不掉,系统一般会提示包的依赖关系,并且列出依赖的包的名称,先卸载提示依赖的包就可以了。

如果实在实在有卸载不掉的包,可以加—nodeps这个参数来卸载,比如我们卸载php-4.3.9-3.15,实在卸不掉了。

就用:

[root@localhost ~]# rpm -e php-4.3.9-3.15 --nodeps

这一部分的资料仅供参考,相较上面的资料而言无多大实际意义 Linux下软件的安装与卸载(ZT)

在Windows下安装软件时,只需运行软件的安装程序(setup、install等)或者用zip等解压缩软件解开即可安装,运行反安装程序(uninstall、unware、“卸载”等)就能将软件清除干净,完全图形化的操作界面,简单到只要用鼠标一直点击“下一步”就可以了。而 Linux好象就不一样了,很多的初学者都抱怨在Linux下安装和卸载软件非常地困难,没有像使用Windows时那么直观。其实在Linux下安装和卸载软件也非常简单,同样也有安装向导或解压安装的方式,不相同的只不过是除了二进制形式的软件分发外,还有许许多多以源代码形式分发的软件包,下面就来详细地讲一讲这些软件的安装与卸载:

一、二进制分发软件包的安装与卸载

Linux软件的二进制分发是指事先已经编译好二进制形式的软件包的发布形式,其优点是安装使用容易,缺点则是缺乏灵活性,如果该软件包是为特定的硬件/操作系统平台编译的,那它就不能在另外的平台或环境下正确执行。 1、*.rpm形式的二进制软件包 安装:rpm -ivh *.rpm 卸载:rpm -e packgename

说明:RPM(RedHat Packge Manager)是RedHat公司出的软件包管理器,使用它可以很容易地对rpm形式的软件包进行安装、升级、卸载、验证、查询等操作,安装简单,而卸载时也可以将软件安装在多处目录中的文件删除干净,因此推荐初学者尽可能使用rpm形式的软件包。rpm的参数中-i是安装,-v是校验,-h是用散列符显示安装进度,*.rpm是软件包的文件名(这里的*.rpm特指*.src.rpm以外的以rpm为后缀的文件);参数-e是删除软件包, packgename是软件包名,与软件包的文件名有所区别,它往往是文件名中位于版本号前面的字符串,例如apache-3.1.12- i386.rpm和apache-devel-3.1.12-i386.rpm是软件包文件名,

它们的软件包名称分别是apache和apache- devel。更多的rpm参数请自行参看手册页:man rpm。

如果你不喜欢在字符界面下安装或卸载这些软件包,完全可以在X-Window下使用图形界面的软件包管理程序,如glint、xrpm这样的图形接口,或者是KDE的kpackge等,这样对软件包的安装、升级、卸载、验证和查询就可以通过点击鼠标来轻松完成。 2、*.tar.gz/*.tgz、*.bz2形式的二进制软件包 安装:tar zxvf *.tar.gz 或 tar yxvf *.bz2

卸载:手动删除

说明:*.tar.gz/*.bz2形式的二进制软件包是用tar工具来打包、用gzip/bzip2压缩的,安装时直接解包即可。对于解压后只有单一目录的软件,卸载时用命令“rm -rf 软件目录名”;如果解压后文件分散在多处目录中,则必须一一手动删除(稍麻烦),想知道解压时向系统中安装了哪些文件,可以用命令“tar ztvf *.tar.gz”/“tar ytvf *.bz2”获取清单。tar的参数z是调用gzip解压,x是解包,v是校验,f是显示结果,y是调用bzip2解压,t是列出包的文件清单。更多的参数请参看手册页:man tar。

如果你更喜欢图形界面的操作,可以在X-Window下使用KDE的ArK压缩档案管理工具。 3、提供安装程序的软件包

这类软件包已经提供了安装脚本或二进制的安装向导程序(setup、install、install.sh等),只需运行它就可以完成软件的安装;而卸载时也相应地提供了反安装的脚本或程序。例如SUN公司的StarOffice办公软件套件就使用名为setup的安装程序,而且在软件安装后提供反安装的功能,目前这种类型的软件包还比较少,因其安装与卸载的方式与Windows软件一样,所以就无需多讲了。

二、源代码分发软件包的安装与卸载

Linux软件的源代码分发是指提供了该软件所有程序源代码的发布形式,需要用户自己编译成可执行的二进制代码并进行安装,其优点是配置灵活,可以随意去掉或保留某些功能/模块,适应多种硬件/操作系统平台及编译环境,缺点是难度较大,一般不适合初学者使用。 1、*.src.rpm形式的源代码软件包 安装:rpm -rebuild *.src.rpm

cd /usr/src/dist/RPMS rpm -ivh *.rpm

卸载:rpm -e packgename

说明:rpm --rebuild *.src.rpm命令将源代码编译并在/usr/src/dist/RPMS下生成二进制的rpm包,然后再安装该二进制包即可。packgename如前所述。 2、*.tar.gz/*.tgz、*.bz2形式的源代码软件包 安装:tar zxvf *.tar.gz 或 tar yxvf *.bz2 先解压 然后进入解压后的目录: ./configure 配置 make 编译

make install 安装

卸载:make uninstall 或 手动删除 说明:建议解压后先阅读说明文件,可以了解安装有哪些需求,有必要时还需改动编译配置。有些软件包的源代码在编译安装后可以用make install命令来进行卸载,如果不提供此功能,则软件的卸载必须手动删除。由于软件可能将文件分散地安装在系统的多个目录中,往往很难把它删除干净,那你应该在编译前进行配置,指定软件将要安装到目标路径:./configure

--prefix=目录名,这样可以使用“rm -rf 软件目录名”命令来进行干净彻底的卸载。与其它安装方式相比,需要用户自己编译安装是最难的,它适合于使用Linux已有一定经验的人,一般不推荐初学者使用。

关于Linux下软件的安装与卸载lanche已经讲了这么多,但可能还会有人问怎么知道一个tar.gz/bz2包是二进制文件包呢还是源代码包?如果你用过压缩工具就会明白,压缩包未必就是软件,它也可能是备份的许多图片,也可能是打包在一起的普通资料,要分辨它到底是什么最好的办法就是查看包里的文件清单,使用命令tar ztvf *.tar.gz / tar ytvf *.bz2或者在X-Window下使用图形化的ArK压缩档案管理工具都可以,源代码包里的文件往往会含有种种源代码文件,头文件*.h、c代码源文件 *.c、C++代码源文件*.cc/*.cpp等;而二进制包里的文件则会有可执行文件(与软件同名的往往是主执行文件),标志是其所在路径含有名为 bin的目录(仅有少数例外)。原来这么简单呀,还不快点自己试试!

Linux中RPM命令参数使用详解

在Linux操作系统中,有一个系统软件包,它的功能类似于Windows里面的“添加/删除程序”,但是功能又比“添加/删除程序”强很多,它就是Red Hat Package Manager(简称RPM)。此工具包最先是由Red Hat公司推出的,后来被其他Linux开发商所借用。由于它为Linux使用者省去了很多时间,所以被广泛应用于在Linux下安装、删除软件。下面就给大家介绍一下它的具体使用方法。

1.我们得到一个新软件,在安装之前,一般都要先查看一下这个软件包里有什么内容,假设这个文件是:Linux-1.4-6.i368.rpm,我们可以用这条命令查看:

rpm -qpi Linux-1.4-6.i368.rpm

系统将会列出这个软件包的详细资料,包括含有多少个文件、各文件名称、文件大小、创建时间、编译日期等信息。

2.上面列出的所有文件在安装时不一定全部安装,就像Windows下程序的安装方式分为典型、完全、自定义一样,Linux也会让你选择安装方式,此时我们可以用下面这条命令查看软件包将会在系统里安装哪些部分,以方便我们的选择:

rpm -qpl Linux-1.4-6.i368.rpm

3.选择安装方式后,开始安装。我们可以用rpm -ivh Linux-1.4-6.i368.rpm命令安装此软件。在安装过程中,若系统提示此软件已安装过或因其他原因无法继续安装,但若我们确实想执行安装命令,可以在 -ivh后加一参数“-replacepkgs”:

rpm -ivh -replacepkgs Linux-1.4-6.i368.rpm

4.有时我们卸载某个安装过的软件,只需执行rpm-e <文件名>命令即可。 5.对低版本软件进行升级是提高其功能的好办法,这样可以省去我们卸载后再安装新软件的麻烦,要升级某个软件,只须执行如下命令:rpm -uvh <文件名>,注意:此时的文件名必须是要升级软件的升级补丁

6.另外一个安装软件的方法可谓是Linux的独到之处,同时也是RMP强大功能的一个表现:通过FTP站点直接在线安装软件。当找到含有你所需软件的站点并与此网站连接后,执行下面的命令即可实现在线安装,譬如在线安装Linux-1.4-6.i368.rpm,可以用命令: rpm -i ftp://ftp.pht.com/pub/linux/redhat/...-1.4-6.i368.rpm 7.在我们使用电脑过程中,难免会有误操作,若我们误删了几个文件而影响了系统的性

能时,怎样查找到底少了哪些文件呢?RPM软件包提供了一个查找损坏文件的功能,执行此命令:rpm -Va即可,Linux将为你列出所有损坏的文件。你可以通过Linux的安装光盘进行修复。

8.Linux系统中文件繁多,在使用过程中,难免会碰到我们不认识的文件,在Windows下我们可以用“开始/查找”菜单快速判断某个文件属于哪个文件夹,在Linux中,下面这条命令行可以帮助我们快速判定某个文件属于哪个软件包: rpm -qf <文件名>

9.当每个软件包安装在Linux系统后,安装文件都会到RPM数据库中“报到”,所以,我们要查询某个已安装软件的属性时,只需到此数据库中查找即可。注意:此时的查询命令不同于1和8介绍的查询,这种方法只适用于已安装过的软件包!命令格式: rpm -参数 <文件名> 一、RPM包管理的用途;

1、可以安装、删除、升级和管理软件;当然也支持在线安装和升级软件;

2、通过RPM包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个软件包;

3、可以在查询系统中的软件包是否安装以及其版本;

4、作为开发者可以把自己的程序打包为RPM 包发布; 5、软件包签名GPG和MD5的导入、验证和签名发布

6、依赖性的检查,查看是否有软件包由于不兼容而扰乱了系统;

二、RPM 的使用权限; RPM软件的安装、删除、更新只有root权限才能使用;对于查询功能任何用户都可以操作;如果普通用户拥有安装目录的权限,也可以进行安装; 三、rpm 的一点简单用法;

我们除了软件包管理器以外,还能通过rpm 命令来安装;是不是所有的软件包都能通过rpm 命令来安装呢?不是的,文件以.rpm 后缀结尾的才行;有时我们在一些网站上找到file.rpm ,都要用 rpm 来安装; 一)初始化rpm 数据库;

通过rpm 命令查询一个rpm 包是否安装了,也是要通过rpm 数据库来完成的;所以我们要经常用下面的两个命令来初始化rpm 数据库; [root@localhost beinan]# rpm --initdb

[root@localhost beinan]# rpm --rebuilddb 注:这个要花好长时间;

注:这两个参数是极为有用,有时rpm 系统出了问题,不能安装和查询,大多是这里出了问题;

二)RPM软件包管理的查询功能: 命令格式

rpm {-q|--query} [select-options] [query-options]

RPM的查询功能是极为强大,是极为重要的功能之一;举几个常用的例子,更为详细的具体的,请参考#man rpm

1、对系统中已安装软件的查询; 1)查询系统已安装的软件;

语法:rpm -q 软件名 举例:

[root@localhost beinan]# rpm -q gaim gaim-1.3.0-1.fc4

-q就是 --query ,中文意思是“问”,此命令表示的是,是不是系统安装了gaim ;如果已安装会有信息输出;如果没有安装,会输出gaim 没有安装的信息; 查看系统中所有已经安装的包,要加 -a 参数 ; [root@localhost RPMS]# rpm -qa

如果分页查看,再加一个管道 |和more命令;

[root@localhost RPMS]# rpm -qa |more

在所有已经安装的软件包中查找某个软件,比如说 gaim ;可以用 grep 抽取出来; [root@localhost RPMS]# rpm -qa |grep gaim

上面这条的功能和 rpm -q gaim 输出的结果是一样的; 2)查询一个已经安装的文件属于哪个软件包; 语法 rpm -qf 文件名

注:文件名所在的绝对路径要指出

举例:

[root@localhost RPMS]# rpm -qf /usr/lib/libacl.la libacl-devel-2.2.23-8

3)查询已安装软件包都安装到何处;

语法:rpm -ql 软件名 或 rpm rpmquery -ql 软件名 举例:

[root@localhost RPMS]# rpm -ql lynx [root@localhost RPMS]# rpmquery -ql lynx 4)查询一个已安装软件包的信息 语法格式: rpm -qi 软件名 举例:

[root@localhost RPMS]# rpm -qi lynx 5)查看一下已安装软件的配置文件; 语法格式:rpm -qc 软件名 举例:

[root@localhost RPMS]# rpm -qc lynx 6)查看一个已经安装软件的文档安装位置: 语法格式: rpm -qd 软件名 举例:

[root@localhost RPMS]# rpm -qd lynx

7)查看一下已安装软件所依赖的软件包及文件; 语法格式: rpm -qR 软件名 举例:

[root@localhost beinan]# rpm -qR rpm-python

查询已安装软件的总结:对于一个软件包已经安装,我们可以把一系列的参数组合起来用;比如 rpm -qil ;比如:

[root@localhost RPMS]# rpm -qil lynx

2、对于未安装的软件包的查看:

查看的前提是您有一个.rpm 的文件,也就是说对既有软件file.rpm的查看等; 1)查看一个软件包的用途、版本等信息; 语法: rpm -qpi file.rpm 举例:

[root@localhost RPMS]# rpm -qpi lynx-2.8.5-23.i386.rpm 2)查看一件软件包所包含的文件; 语法: rpm -qpl file.rpm 举例:

[root@localhost RPMS]# rpm -qpl lynx-2.8.5-23.i386.rpm 3)查看软件包的文档所在的位置; 语法: rpm -qpd file.rpm 举例:

[root@localhost RPMS]# rpm -qpd lynx-2.8.5-23.i386.rpm 5)查看一个软件包的配置文件; 语法: rpm -qpc file.rpm 举例:

[root@localhost RPMS]# rpm -qpc lynx-2.8.5-23.i386.rpm 4)查看一个软件包的依赖关系 语法: rpm -qpR file.rpm 举例:

[root@localhost archives]# rpm -qpR yumex_0.42-3.0.fc4_noarch.rpm /bin/bash

/usr/bin/python

config(yumex) = 0.42-3.0.fc4 pygtk2

pygtk2-libglade

rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 usermode yum >= 2.3.2

三)软件包的安装、升级、删除等;

1、安装和升级一个rpm 包;

[root@localhost beinan]#rpm -vih file.rpm 注:这个是用来安装一个新的rpm 包; [root@localhost beinan]#rpm -Uvh file.rpm 注:这是用来升级一个rpm 包;

如果有依赖关系的,请解决依赖关系,其实软件包管理器能很好的解决依赖关系,请看前面的软件包管理器的介绍;如果您在软件包管理器中也找不到依赖关系的包;那只能通过编译他所依赖的包来解决依赖关系,或者强制安装; 语法结构:

[root@localhost beinan]# rpm -ivh file.rpm --nodeps --force [root@localhost beinan]# rpm -Uvh file.rpm --nodeps --force 更多的参数,请查看 man rpm 举例应用:

[root@localhost RPMS]# rpm -ivh lynx-2.8.5-23.i386.rpm Preparing...

########################################### [100%] 1:lynx ########################################### [100%]

[root@localhost RPMS]# rpm -ivh --replacepkgs lynx-2.8.5-23.i386.rpm Preparing...

########################################### [100%] 1:lynx ########################################### [100%]

注: --replacepkgs 参数是以已安装的软件再安装一次;有时没有太大的必要; 测试安装参数 --test ,用来检查依赖关系;并不是真正的安装;

[root@localhost RPMS]# rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm Preparing...

########################################### [100%] 由新版本降级为旧版本,要加 --oldpackage 参数; [root@localhost RPMS]# rpm -qa gaim

gaim-1.5.0-1.fc4

[root@localhost RPMS]# rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm Preparing...

########################################### [100%] 1:gaim ########################################### [100%]

[root@localhost RPMS]# rpm -qa gaim

gaim-1.3.0-1.fc4

为软件包指定安装目录:要加 -relocate 参数;下面的举例是把gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中; [root@localhost RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm Preparing...

########################################### [100%] 1:gaim

########################################### [100%]

[root@localhost RPMS]# ls /opt/

gaim

为软件包指定安装目录:要加 -relocate 参数;下面的举例是把lynx-2.8.5-23.i386.rpm 指定安装在 /opt/lynx 目录中;

[root@localhost RPMS]# rpm -ivh --relocate /=/opt/lynx --badreloc lynx-2.8.5-23.i386.rpm

Preparing...

########################################### [100%] 1:lynx ########################################### [100%]

我们安装在指定目录中的程序如何调用呢?一般执行程序,都放在安装目录的bin或者sbin目录中;看下面的例子;如果有错误输出,就做相应的链接,用 ln -s ; [root@localhost RPMS]# /opt/lynx/usr/bin/lynx

Configuration file /etc/lynx.cfg is not available.

[root@localhost RPMS]# ln -s /opt/lynx/etc/lynx.cfg /etc/lynx.cfg [root@localhost RPMS]# /opt/lynx/usr/bin/lynx www.linuxsir.org

2、删除一个rpm 包;

首先您要学会查询rpm 包 ;请看前面的说明; [root@localhost beinan]#rpm -e 软件包名 举例:我想移除lynx 包,完整的操作应该是:

[root@localhost RPMS]# rpm -e lynx

如果有依赖关系,您也可以用--nodeps 忽略依赖的检查来删除。但尽可能不要这么做,最好用软件包管理器 systerm-config-packages 来删除或者添加软件; [root@localhost beinan]# rpm -e lynx --nodeps

四、导入签名:

[root@localhost RPMS]# rpm --import 签名文件 举例:

[root@localhost fc40]# rpm --import RPM-GPG-KEY [root@localhost fc40]# rpm --import RPM-GPG-KEY-fedora 关于RPM的签名功能,详情请参见 man rpm

五、RPM管理包管理器支持网络安装和查询;

比如我们想通过 Fedora Core 4.0 的一个镜像查询、安装软件包; 地址:

http://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/ 举例:

命令格式:

rpm 参数 rpm包文件的http或者ftp的地址

# rpm -qpi http://mirrors.kernel.org/fedora/core/4/i386/os/ Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm

# rpm -ivh http://mirrors.kernel.org/fedora/core/4/i386/os/ Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm 举一反三吧;

六、对已安装软件包查询的一点补充;

[root@localhost RPMS]# updatedb

[root@localhost RPMS]# locate 软件名或文件名

通过updatedb,我们可以用 locate 来查询一些软件安装到哪里了;系统初次安装时要执行updatedb ,每隔一段时间也要执行一次;以保持已安装软件库最新;updatedb 是slocate软件包所有;如果您没有这个命令,就得安装slocate ; 举例:

[root@localhost RPMS]# locate gaim

七、从rpm软件包抽取文件;

命令格式: rpm2cpio file.rpm |cpio -div

举例:

[root@localhost RPMS]# rpm2cpio gaim-1.3.0-1.fc4.i386.rpm |cpio -div 抽取出来的文件就在当用操作目录中的 usr 和etc中;

其实这样抽到文件不如指定安装目录来安装软件来的方便;也一样可以抽出文件; 为软件包指定安装目录:要加 -relocate 参数;下面的举例是把gaim-1.3.0-1.fc4.i386.rpm指定安装在 /opt/gaim 目录中; [root@localhost RPMS]# rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm

Preparing...

########################################### [100%] 1:gaim

########################################### [100%] [root@localhost RPMS]# ls /opt/

gaim

这样也能一目了然;gaim的所有文件都是安装在 /opt/gaim 中,我们只是把gaim 目录备份一下,然后卸掉gaim;这样其实也算提取文件的一点用法;

八、RPM的配置文件;

RPM包管理,的配置文件是 rpmrc ,我们可以在自己的系统中找到;比如Fedora Core 4.0中的rpmrc 文件位于;

[root@localhost RPMS]# locate rpmrc /usr/lib/rpm/rpmrc

/usr/lib/rpm/redhat/rpmrc

我们可以通过 rpm --showrc 查看;具体的还得我们自己来学习。呵。。。不要问我,我也不懂;只要您看了这篇文章,认为对您有用,您的水平就和我差不多;咱们水平是一样的,所以我不能帮助您了;请理解;

Linux模块的安装

insmod命令加载Hello,World模块问题

我的LINUX内核是2.6.9。我按照《LINUX设备驱动程序》第三版里的“Hello,World”示例来测试,

程序名为hello.c 程序如下; #include #include

MODULE_LICENSE,(\"Dual BSD/GPL\"); static int hello_init(void) {

printk(KERN_ALERT \"Hello,world\\n\"); return 0; }

staic void hello_exit(void) {

printk(KERN_ALERT \"Goodbye,cruel world\\n\"); }

module_init(hello_init); module_exit(hello_exit);

makefile文件内容是:

obj-m := hello.o

我用make来编译很顺利,产生了hello.mod.c ,hello.o ,hello.ko,hello.mod.o四个文件,

在用下列命令来加载:insmod ./hello.ko,可出现以下结果: bash: insmo:command not found.

怎么结果说找不到命令,我还试着加载其他文件,都出现同样的错误。

不会出现书上'Hello,world\"字符串的结果。真是奇怪,到底是哪出了问题?还请指点下。 以上命令都是在超级用户下执行的,而且都是按照书上所写的内容自己去做测试。 ylj92 2007-6-14 08:22

有可能是你安装的系统里面没有安装insmod,rmmod这些命令。他一般包含在modutils的rpm包里。

你可以通过命令查看自己的系统是否已经安装modutils 如

rpm -qa | grep modutils

我的RH9输出是 modutils-2.4.22-8 modutils-devle-2.4.22-8

linux insmod内核模块加载

悬赏分:0 - 解决时间:2008-6-16 00:26 Warning: kernel-module version mismatch

/mmc/mmca1/squashfs.o was compiled for kernel version 2.4.20_mvlcee30-mainstone

while this kernel is version 2.4.20_mvlcee31-mainstone_pxa27

Warning: loading /mmc/mmca1/squashfs.o will taint the kernel: forced load 强行加载„是否有负作用?还是根本用不了 提问者: 六月的微笑 - 经理 四级 最佳答案

内核模块版本不匹配

可以试试强行加载,不一定用的了

没多大副作用,就是模块能用、不能用、勉强用但会崩溃的结果 对系统影响不大

之所以是模块,是有这个用意在里面的 其他回答 共 1 条

内核 mod 是和内核版本相关连的。

准确的说,相同版本,相同的源代码,但不同的设置和不同的编译器编译出来的 mod 都存在潜在的崩溃问题。

不然内核也不会这么强烈的限制 mod 的版本概念。

这个总装不上,不知道是什么原因,我的是rhel5 64位 [root@localhost modutils-2.4.27]# ./configure

checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for gcc... gcc

config.status: creating Makefile.common [root@localhost modutils-2.4.27]# make

make[1]: Leaving directory `/home/shiluqi/Desktop/modutils-2.4.27/util' make[1]: Entering directory `/home/shiluqi/Desktop/modutils-2.4.27/obj' gcc -O2 -Wall -I./../include -D_GNU_SOURCE -DPACKAGE_NAME=\\\"\\\" -DPACKAGE_TARNAME=\\\"\\\" -DPACKAGE_VERSION=\\\"\\\" -DPACKAGE_STRING=\\\"\\\" -DPACKAGE_BUGREPORT=\\\"\\\"

-DCONFIG_ROOT_CHECK_OFF=0 -DCOMMON_3264

-DELF_MACHINE_H='\"elf_i386.h\"' -DARCH_i386 -DONLY_32 -c -o obj_kallsyms.o obj_kallsyms.c

In file included from obj_kallsyms.c:26:

./../include/util.h:42: 警告:内建函数 ‘log’ 未被声明为函数 obj_kallsyms.c: 在函数 ‘obj32_kallsyms’ 中: obj_kallsyms.c:204: 错误:赋值运算中的左值无效 obj_kallsyms.c:279: 错误:赋值运算中的左值无效 make[1]: *** [obj_kallsyms.o] 错误 1

make[1]: Leaving directory `/home/shiluqi/Desktop/modutils-2.4.27/obj' make: *** [all] 错误 2

[root@localhost modutils-2.4.27]#

rhel5 64位用的是 2.6 系列的内核,lz 的 modutils 是 2.4 系列的。 得找 2.6 版本的 modutils 来编绎才行。

安装 Modutils-2.4.25

预计所需编译时间: 0.1 SBU

预计所需硬盘空间: 2.9 MB Modutils的内容

Modutils包含处理内核模块时使用的工具。

安装下列程序: depmod, genksyms, insmod, insmod_ksymoops_clean, kallsyms (link to insmod), kernelversion, ksyms (link to insmod), lsmod (link to insmod), modinfo, modprobe (link to insmod) 和 rmmod (link to insmod) Modutils 安装依赖关系

Modutils 依赖于: Bash, Binutils, Bison, Coreutils, Diffutils, Flex, GCC, Glibc, Grep, M4, Make, Sed. 安装 Modutils

为编译 Modutils 做准备: ./configure 编译软件包: make 安装软件包: make install

安装 Modutils-2.4.21 估计编译时间:

0.13 SBU

估计所需硬盘空间: 3 MB 安装 Modutils 命令如下: ./configure &&

make && make install Modutils的内容

最后检查于 version 2.4.16. 包含的程序

depmod, genksyms, insmod, insmod_ksymoops_clean, kallsyms (链接至 insmod), kernelversion, ksyms (链接至 insmod), lsmod (链接至 insmod), modinfo, modprobe (链接至insmod) 和 rmmod (链接至insmod) 具体说明 depmod

处理可加载内核模块的依赖关系。 genksyms

产生符号的版本信息。读取gcc -E source.c的输出,产生一个包含符号信息的文件。 insmod

向正在运行的内核加载模块。 insmod_ksymoops_clean

将/proc/ksyms和/proc/modules两个文件按时间顺序保存在/var/log/ksymoops/目录中,并删除两天内没有被访问的文件。 kallsyms

展开所有内核标志用来调试. kernelversion

报告当前使用内核的主版本号(例如:2.2)。 ksyms

显示被导出的内核符号。 lsmod

显示当前加载的内核模块信息。 modinfo

modinfo examines an object file associated with a kernel module and displays any information that it can glean. modprobe

测试一个位于内核模块目录下(/lib/modules/xx.xx-xx/)的目标文件,并显示所有能够搜集到的信息。 rmmod

从当前运行的内核中卸载内核模块 安装Modutils依赖于 最后检查于 version 2.4.12. Bash: sh

Binutils: ar, as, ld, ranlib, strip Bison: bison Diffutils: cmp

Fileutils: chmod, install, ln, mkdir, mv, rm Flex: flex

Gcc: cc, cc1, collect2, cpp0, gcc Grep: egrep, grep Make: make Sed: sed

Sh-utils: basename, expr, hostname, uname Textutils: cat, tr

命令行执行sql

Sqlplus ydquery/ydquery @/home/oracle/bjit_stat6_20080305.sql 使用哪一个用户进行登录,并执行,所生成的表就属于哪个用户的

sql导入

Sql导入是不分表的先后的,父表可以在子表的后面,但要注意sql导入过程中需要的各元素是否存在,比如表空间等

重置语言设置 unset LANG

export LANG=zh_CN.UTF-8

export LANG=zh_CN.GB2312

文件操作

显示文件内容

more programs.txt

回车显示下一行内容,空格显示下一屏 cat test.c

扫描整个文件

ls /usr/bin>programs.txt

上面的命令建立了一个名为programs.txt的文本文件 less programs.txt 使用less命令阅读

less –M programs.txt

在底部显示文件名,行数等信息

查找文件内容

在当前目录下所有的文件中查找包括96.71的文件 cat |grep 96.71

tail messages -n 20

显示文件列表

lsl *.txt

列出扩展名为txt的文件 ls .*

列出隐藏文件

ls a?

列出ad而不能列出adb [a-z]

字符组模式,从a到z的任一字符 -在方括号外失去通配能力 *,?在方括号内失去通配能力 ls *\\*转义 ls *‖*‖转义 以上两个命令一样

ls –F

在文件夹后加一斜线,在可执行文件后加*,在链接文件后加@

ls -l * | grep \"Feb 1\"

进入文件目录

Cd .. 回到上级目录 Cd / 回到根目录 Cd

Cd ~回到用户工作目录 cd – 回到前一目录

pwd 显示当前工作目录

查找文件/文件内容 Find /usr –print

列出usr目录下所有文件和目录 Find / -name

for file in *; do if grep -l POSIX $file; then more $file; fi; done more ‗grep –l POSIX *‘ more $(grep –l POSIX *) grep –l POSIX * |more

输出包含有POSIX文字的文件

locate 19277609945875752ef9fc.txt

ls -l * | grep \"Feb 1\"

把含有此内容的部分打印出来

more * | grep include

把含有此内容的文件与其相应的内容位置显示出来 grep tcpclient_inet * -Rn

备份和压缩

#tar:备份命令,gzip:压缩命令

把/home目录下包括它的子目录全部做备份文件,备份文件名为usr.tar

#tar –cvf usr.tar /home

#tar –czvf usr.tar.gz /home

把/home目录下包括它的子目录全部做备份文件,并进行压缩,备份文件名为usr.tar.gz

#tar –xzvf usr.tar.gz

把usr.tar.gz这个备份文件还原并解压缩

#tar –tvf usr.tar | more

查看usr.tar备份文件的内容,并以分屏方式显示在显示器上

解压vim-7.1.tar.bz2 bunzip2 vim-7.1.tar.bz2

要将文件备份到一个特定的设备,只需要把设备名作为备份文件名,比如下面的例子: 用户在/dev/fd0设备中的软盘中创建一个备份文件,并将/home目录下所有的文件都拷贝到备份文件中

#tar –cf /dev/fd0 /home

要恢复设备磁盘中的文件,可使用xf选项 #tar –xf /dev/fd0

容量不够,要分开存(加上-M会有换盘提示) #tar –cMf /dev/fd0 /home

将备份的资料取出(加上-xM会有换盘提示) #tar –xMf /dev/fd0 不覆盖原文件 #gzip –c source>result #gzip -d *.gz -d:解压缩

-l:查看压缩后的文件

-n: -N:

-r:递归压缩,压缩目录

-v:显示处理过程中的详细信息

-#:#代表一个数字,从1-9表示,分别指定gzip的速度和压缩比,默认6 一般先备份(会浪费空间)后压缩(会产生大量文件) #tar –cvf bak.tar doc #gzip bak.tar 逆操作

#gzip –d bak.tar.gz #tar –xvf bak.tar

#du –h /etc/X11 -a

-c -h -k -s #df #df –h

#finger

拷贝 cp/rm –I 询问

cp –R /home/thl /tmp/thl

scp mult.cgi root@192.168.7.41: /home/gapadmin/website/cgi-bin/ 远程拷贝

重定向

./xx.txt > out.txt

改变文件属性

chown –R virtual:virtual test(test是文件夹)

vi编辑命令 命令行下:

p:复制删除的行 o:插入一行 u:撤销

.:重复前一步骤 s:减少缩进 x:减少缩进

f:查找

h:光标向前一个字符 l:光标向后一个字符 b:相似度向前 e:相似度向后 g:返回文首

k:光标跳至上一行

j:光标跳至下一行 dd:删除光标所在行

cc:删除光标所在行,并进入编辑模式

yy:拷贝当前行

p:粘贴内存内容在光标处 a:在光标所在单词后添加 r:插入r

:w!将处于只读状态的文件中的修改保存 . 重复上个动作

:set num

:64 转到64行 :file 显示文件信息 $ 行末 ^ 行首 :$ 文末

ctrl+f 下翻一屏 ctrl+d 下翻半屏 ctrl+u 上翻半屏 ctrl+b 上翻一屏 #vi x X

dd D

vi test1.c +56

进入编辑器后自动跳到56行

库操作 查找库 #which ls

#whereis grep

#whereis libjson 查找库

缓存库

ldconfig

将库缓存,方便编译器查找

库的位置 /etc/ld.so.conf /usr/local/lib

库依赖 ldd

网络命令

查看端口情况

netstat -anp 显示所有连接(包括正在监听的,连接超时的,已建立连接的) netstat –lnp 只显示正在监听的连接

vi /etc/resolv.conf cat /etc/resolv.conf

配置网卡

cd /etc/sysconfig/network-scripts cat ifcfg-eth0 /sbin/ifconfig

host www.qqintl.com

dig qqintl.com

wget www.shinensp.com

地址绑定

一个网卡绑定多个IP

ifconfig eth0:3 192.168.7.77

ifconfig eht0:3 up/down 启用/禁用网卡上的这个IP

mac地址修改

可以修改,只是跟IP一样,怕跟别人的冲突,只要保证不会跟别人的冲突,就可以使用 以前王立波的虚拟机连不上和我的linux_AS2的虚拟机连不上,都可能是同样的原因导致,那就是在本机两台虚拟机由于出自同一个拷贝使用了相同的MAC地址导致

------------------------------------------------------------------------------------------------------

上面的说法不完全准确,虚拟机的HWaddr是在安装系统的时候自动生成的,一旦生成,这个HWaddr我们可以使用

[root@linux.com]# ifconfig eth0 up [root@linux.com]# ifconfig

查看,而/etc/sysconfig/network-scripts/ifcfg-eth0中的HWaddr必须与我们上面查看到的临时(动态)HWaddr保持一致

如果由于其他原因导致HWaddr重新生成了,/etc/sysconfig/network-scripts/ifcfg-eth0也要跟着改,否则运行service network restart将报错

linux配置 网关

我用ifconfig eth0 192.168.*.*配置了IP,但是怎么配置网关啊,谢谢!

1.vi /etc/sysconfig/network-scripts/ifcfg-eth0

2.route add default gw xx.xx.xx.xx 如果想永久生效就修改配置文件

3.在redhat的环境下面,使用setup,redhat-config-network,netconfig等等,都可以设置网关。

4.vi /etc/sysconfig/network-ifconfig/ifcfg-eth0 在里面加入一行 geteway=网关ip 保存退出就可以了

Ping不通的原因分析

ifconfig 看一下有没有启动eth0或1 如果有两个网卡的话. mii-tool看一下线有没有接好. 如果是接好的.

vi /etc/sysconfig/network-scripts/ifcfg-eth0 更改一下IP配置

再/etc/init.d/network restart 把网络服务启一下.看看

查看连接有没有释放 netstat –anp | grep xorp_rtrmgr IP冲突

很可能是IP冲突,提示信息可能还有会话超时等

关闭linux防火墙

永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off

即时生效,重启后复原

/etc/rc.d/init.d/iptables stop 开启: service iptables start 关闭: service iptables stop

/sbin/iptables -A FORWARD -p tcp -m ipp2p -j DROP/sbin/iptables -A FORWARD -p tcp -m ipp2p -j DROP

Linux 内核与Fat、NTFS、Vfat、Fat32、Hfs 等文件系统互访

Linux 内核支持读写Fat、NTFS、Vfat、Fat32、Hfs 等文件系统(至少可以读),因此在 Linux 下访问 Windows 要比在 Windows 下访问 Linux 方面的多,不需要使用专门的软件,直接使用 Linux 命令即可。

Fat/Fat32分区时 Linux 访问 Windows 分区

Linux 将系统中所有的设备都看作文件,所以在 Linux 下访问 Windows 分区非常方便,只要使用 mount 命令将 Windows 分区挂接成 Linux 的一个文件夹即可。

mount 命令的使用格式是(必须以 root 用户身份登陆):

mount [-afFhnrvVm] [-|<标签>] [-o<选项>] [-t<文件系统>] [设备名称] [挂接点]

若我们要将 Windows 的某一分区(如D盘)挂接到 Linux 的 /mnt/win 这个目录下,首先请在 /mnt下建立 win 文件夹,然后启动 Console 终端模式,输入命令“mount /dev/hda5 /mnt/win”,再进入 /mnt/win 目录,您就能看到 Windows 中 D 盘的内容了。

可能有的朋友要问了,为何要输入上面的命令,特别是那个 /dev/hda5 是什么东西呢?这是 Linux 下分区的一种表示方式,在 Linux 下看 Windows 分区一般是:hda1 为C盘,hda5为D盘,hda6为E盘,以此类推。。。

不过用上面的方法加载 Windows 分区后,另一个麻烦的事情出现了,就是 Windows 中所有的中文文件名和文件夹名全部显示为问号,英文却能正常显示,这计算机也有民族歧视啊!反对这种歧视,就要充分利用我们手中的武器,在 mount 命令中加入一些参数让它正确显示中文。这时,只要将上述命令改为“mount -t vfat -o iocharset=cp936 /dev/hda5 /mnt/win”,运行就可以了。

加载了这个分区,在不使用时我们还可以将它卸除,而卸除的命令为 umoun,若是卸除上述分区,只要输入“umount /mnt/win”即可。

另外,我们还可以让 Linux 在启动时自动加载分区,这样就不用每次使用 Windows 分区时都要输入命令加载了。

首先请以 root 用户登陆,进入图形界面后通过 Linux 的文件管理器找到 /etc 目录下的 fstab 文件,单击右键选择一个文字编辑软件打开此文件,在内容的最下方添加一行命令“/dev/hda5 /mnt/win vfat codepage=936,iocharset=cp936 1 1”,然后在 /mnt 目录下建立 win 文件夹,重新启动计算机后,再访问 /mnt/win 目录就是 Windows 分区的内容了。您也可以通过此种方法加载多个分区,而编辑时也可以在命令行方式下使用 vi 等编辑器。

NTFS 分区时 Linux 访问 Windows 分区

若是使用 Mandrake 或者红旗 Linux,并且在安装时硬盘中已经存在 NTFS 分区,则安装后不需要重新编译内核就可以实现对硬盘 NTFS 分区的访问;若是安装时硬盘中没有 NTFS 分区,或者使用的是 RedHat Linux,则必须重新编译内核,添加 NTFS 模块才能正常访问 NTFS 分区。

首先以 root 用户登陆,然后将 RedHat Linux 的第二张安装盘插入光驱中,在 /redhat/RPMS 目录下找到 kernel-source-2.4.xx-x.i386.rpm(这里x代表数字)文件,若是图形界面,直接双击安装,若是命令行,请输入“rpm -ivh kernel-source-2.4.xx-x.i386.rpm”命令。

再进入 /usr/src/linux-2.4.xx-x/configs 目录,这里有许多编译内核需要的培植文件,一般选择“kernel-source-2.4.xx-x.i686.config”即可。将此文件复制到 /usr/src/linux2.4.xx-x 目录,用文本编辑器打开,将“#CONFIG_NTFS_FS is not set”行改为“CONFIG_NTFS_FS=m”。

在终端模式下,进入 /usr/src/linux-2.4.xx-3 目录,运行“make modules”命令来编译想要的 NTFS 模块,在编译的过程中不需要理会与 NTFS 模块,在编译的过程中不需要理会与 NTFS 无关的内容,编译完成后,在 /usr/src/linux-2.4.xx-x/fs/ntf 目录下可以找到一个 ntfs.o 文件,将其复制到 /lib/modules/2.4.xx-x/kernel/fs 目录,然后回到 /usr/src/linux-2.4.xx-3 目录,输入命令:

#depmod

#modprobe ntfs

剩下的工作和前面 Fat/Fat32分区时 Linux 访问 Windows 分区相同。

经测试,如果上面的做法再加上下面的做法,就能真正实现linux访问windows

从Linux访问Windows文档夹是很简单的,只需键入下面的命令就能够了。

mount -t smbfs -o username=user,password=foobar,ip=192.168.**.** //HOSTMACHINE_NAME/Tinix /mnt/smb/Tinix

其中,username和password必须是宿主机上合法的用户名和密码,而且要有访问共享文档夹Tinix的权限。HOSTMACHINE_NAME是宿主机的电脑名称。注意,逗号之后不能有空格。

我们并无需配置Samba服务器,因为我们不想从Windows中访问Linux,我们只需将Windows中的文档夹共享,这样宿主机和虚拟机都能够访问,我们的目的也就达到了。 现在,在/mnt/smb/Tinix目录下已能够看到Windows下的文档了。

加载光驱

mount /dev/hda1 /mnt/hda1

lilo -r .

/sbin/ip ru l

./clearsn.bash

cp check_valid2.bash clearsn.bash

vi OnlineOutput.bash pdos95

Linux中查看IP信息 IP:ifconfig DNS:nslookup cd /etc/init.d ./network restart

route/gateway:route

配置eth0的IP,同时激活设备

#ifconfig eth0 192.168….. netmask 255…… 激活/禁用设备: ifconfig eth0:1 up/down

制作计划任务 退出编辑模式 ctrl+z

cat /etc/crontab

vi /etc/crontab

crontab -e crontab -l

sync_export.bash #!/bin/bash

/usr/php4.0/bin/php -q /home/printorder/www/export/getfile_ftp.php '?&export&getfile' printorder printorder16888 php -q:忽略输出

/usr/php4.0/bin/php:因为有php解析文件,页面才能显示,否则会弹出文件保存对话框

/usr/php4.0/bin/php -q /home/printorder/www/export/getfile_ftp.php:php解析getfile_ftp.php这个文件,忽略它的输出

'?&export&getfile':php解析命令的第二个参数,防止被人盗链

printorder printorder16888:第三个第四个参数,和前两个参数一起传到getfile_ftp.php页面中 10

0,3

*

*

*

root

/home/printorder/www/export/sync_export.bash

>>

home/printorder/www/export/sync_export.log

vi /etc/crontab 编辑

先按i,再进行编辑 按esc退出 :w存盘

:q! 不存盘退出

:wq存盘后退出

rm –rf 目录名 // 删除非空目录 新建的文件夹默认是没有写权限的

如果硬盘满了,所有的存储和数据交换都将不能进行,这样,我们的系统也就不能正常运行,比如说对加密文件的解密

新建的文件默认是没有写权限的,要重新设定,否则如果程序需要写入的话,会报错的

查看系统命令 1. 系统/文件/网络

df -lh 查看磁盘的使用情况以及文件系统被挂载的位置 fdisk -l 查看磁盘分区表及分区结构

stat display file or filesystem status

uname \"什么系统\查看内核版本\" du \"查看文件占用空间\"

dmesg \"系统信息\"

netstat \"由于参数众多,不一一详细写,端口信息\" 2. 用户

w Show who is logged on and what they are doing.

useradd username \"添加用户\" -G 组名 username \"直接将用户加到组并创建\" userdel username \"删除用户\" -r username \"连用户的目录也删除\" passwd username \"添加密码\" passwd -l username \"锁密码\" passwd -u username \"解开密码\" passwd -d username \"删除密码\"

id username \"查看用户信息\"

usermod -l new_username old_username \"用户改名\" usermod -G 组名 username \"更改组\" usermod -L username \"锁顶用户\" usermod -U username \"激活用户\"

groupadd 组名 \"创建组\"

gpassswd -a username 组名 \"将用户添加到组\" groupmod -n new_group old_group \"组改名\" groupdel 组名 \"删除组\" gpasswd 组名 \"改变组密码\" gpasswd -r 组名 \"删除组密码\"

用sudo给用户赋权限 Vi /etc/sudoers # sudoers file.

#

# This file MUST be edited with the 'visudo' command as root. #

# See the sudoers man page for the details on how to write a sudoers file. #

# Host alias specification

# User alias specification

# Cmnd alias specification

# Defaults specification

# User privilege specification root ALL=(ALL) ALL

# Uncomment to allow people in group wheel to run all commands # %wheel ALL=(ALL) ALL

# Same thing without a password

# %wheel ALL=(ALL) NOPASSWD: ALL

# Samples

# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom

# %users localhost=/sbin/shutdown -h now

virtual ALL=NOPASSWD:/bin/chown,/etc/init.d/vsftpd.sh

virtual ALL=NOPASSWD:/etc/init.d/vsftpd.sh, /usr/sbin/vsftpd, /bin/chown

之所以说尽量不要用图形界面来搭数据库系统,可能就是因为图形界面可能会导致超时,引起外部(比如SecureCRT)工具操作的不便

CVS的使用

Linux下CVS环境变量设置

临时设置:

export CVSROOT=:pserver:username@hostip:path username:指CVS用户名,即姓+名缩写如:liujh

hostip:指CVS服务器,公司CVS服务器IP地址为:192.168.1.30 path:指工作区路径

例:

export CVSROOT=:pserver:training@192.168.1.30:/src/workspace 永久设置:

在$HOME/.bash_profile中加入

export CVSROOT=:pserver:training@192.168.1.30:/src/workspace 注:临时设置退出后,CVS环境变量将不保存. 设置好环境变量后,再进行登陆 cvs login

Logging in to :pserver:training@192.168.1.30:2401/src/workspace CVS password:输入密码 若无任何提示表示登陆成功 check out模块

cvs checkout modulename 或cvs co modulename 例如:cvs checkout training 向模块中增加文件

设置CVS环境变量及登陆成功后,进入已check out模块目录执行cvs add filename 操作。可以一次增加多个文件如cvs add a.c b.c c.c,执行cvs add 命令后,文件并没有提交到CVS服务器中,需要执行cvs ci 命令才真正提交到服务器中.(注.cvs add 目录时,不需要执行cvs ci 操作) 提交文件

当执行cvs add 或cvs rm 操作后需要执行cvs ci 操作才能使add 和rm 操作生效. cvs ci –m ―log information…‖ filename 删除文件

先删除工作文件夹的文件再执行cvs rm filename 然后执行 cvs ci –m ―log information…‖ filename 打标签 当测试功能通过后或者认为是一过相对稳定的版本,建议打一个标签进行基线化 cvs rtag ―tagname‖ module 更新文件或目录

建议在修改文件之前先执行更新文件或目录操作,以便使本地文件版本和服务器文件版本同步命命令:cvs up [filename or directory name] 比较版本

比较工作目录文件是否与CVS服务器相同或者比较两个不同版本之间的差异 cvs diff –r 版本1 –r 版本2 文件名

cvs diff filename 查看日志信息

cvs log filename or moudlename 将一个目录下的所有文件导入 导入目录前要确认所导入的目录中不包含有CVS目录,否则导入目录后,checkout模块将会出错 命令:cvs import -m \"log message\"模块名/要提交的目录名 FST_DIST VENDOR_TAG,此操作不需要执行提交操作。

例如:已经check out training模块,然后在training目录中589E加一个目录,假设为test目录(CVS服务器上training模块中无test目录),test目录下有3个文件a.c b.c c.c 执行cvs import –m ―import test directory‖ training/test FIST_DIST test就可以将test目录下的所有文件全导入到服务器上的training模块中。 查看本地文件状态 命令:cvs stat, 要求在工作目录中执行

通常用法:cvs stat |grep ?查找本地新建文件,找到后用cvs add 命令提交;

Cvs stat|grep Mod查找本修改文件,找到后用cvs ci命令; 上述为一些基本CVS操作,希望能给大家一点帮助。

编译

编译失败

如果文件没有执行的权限,在linux仿真器上,会呈现出白色,反之绿色.以前直接将文件从本地拷到服务器上之所以不能执行,估计也就是因为拷贝后没有执行权限,导致编译失败所致

gcc

gcc -o test2 test2.c -Wall -g –ljson

autoconf 和 automake 生成 Makefile 文件

所必须的软件:autoconf/automake/m4/perl/libtool(其中libtool非必须)。

autoconf是一个用于生成可以自动地配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到 m4,便于生成脚本。automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake还需用到perl,由于automake创建的发布完全遵循GNU标准,所以在创建中不需要perl。libtool是一款方便生成各种程序库的工具。

制作Makefile.am [root@GAP1 cgi]# autoscan

[root@GAP1 cgi]# configure.scan->configure.in [root@GAP1 cgi]# vi configure.in

AC_CONFIG_HEADER([config.h])->AM_CONFIG_HEADER([config.h])

添加

AM_INIT_AUTOMAKE(FULL-PACKAGE-NAME, VERSION)

(FULL-PACKAGE-NAME, VERSION来自于 AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)的前两个参数) [root@GAP1 cgi]# aclocal [root@GAP1 cgi]# autoconf

[root@GAP1 cgi]# autoheader 新建Makefile.am文件

编辑configure.in,添加AC_CONFIG_FILES([Makefile]) [root@GAP1 cgi]# automake –a [root@GAP1 cgi]#./configure [root@GAP1 cgi]# make

新建makefile工程 #!/bin/sh

rm -f config.cache rm -f aclocal.m4

rm -f config/aclocal.m4

rm -f configure

find ./ -name Makefile -exec rm -f {} \\; autoscan

aclocal -I config autoconf #autoheader

libtoolize --force --copy automake -ac

if [ $# -eq 1 -a $1 = \"release\" ]; then

./configure --prefix=/usr/local/gap --enable-release else

./configure --prefix=/usr/local/gap fi

演示目标体,依赖和命令的简单makefile文件及其解说 # Sample Makefile for Chapter 4 howdy: howdy.o helper.o helper.h gcc howdy.o helper.o -o howdy helper.o: helper.c helper.h

gcc -c helper.c howdy.o: howdy.c gcc -c howdy.c hello: hello.c gcc hello.c -o hello

all: howdy hello clean:(注3)

rm howdy hello *.o

要编译howdy,只需在makefile所在目录下输入make即可

如果只想生成两个目标文件(注2)而不像生成howdy本身,可以使用下面两条命令: $ make helper.o

$ make howdy.o

更简洁一点,只需使用$ make helper.o howdy.o,规则使用了gcc的-c选项,只创建目标文件但跳过了连接(注1)

注1:这里的意思是,在源代码文件howdy.c和helper.c经过预处理后编译成目标文件helper.o,howdy.o后,禁止链接器把来自文件howdy.o和helper.o的目标代码和标准库以及C启动代码链接到一起生成二进制文件hello

注2:

注3:clean是伪目标,因为其没有依赖体。没有依赖体的目标其命令将不会被自动执行。比如必须输入make clean,clean的命令才会被执行

查看有没有内存泄漏

valgrind --show-below-main=yes --leak-check=full --leak-resolution=high --show-reachable=yes -v ./json-c-0.7/jsonseek ./json-c-0.7/json_seek.c author

编译过程的文件

Vi makefile //注一

include ../makefile.incl

all: SecSysManageSvr install

SecSysManageSvr: SecSysManage.h SecSysManageSvr.cpp SecSysManage.cpp $(SOAPH) $(SOAPCPP)

@echo 编译SecSysManageSvr....

$(GSOAP) -I${GSOAP_IMPORT} SecSysManage.h

$(CPP) $(CFLAGS) -o SecSysManageSvr SecSysManageSvr.cpp SecSysManage.cpp soapC.cpp soapServer.cpp $(SOAPCPP) $(LIBS)

.PHONY: clean

clean:

rm -f *.o xml* soap* SecSysManageSvr

install:

cp -f SecSysManageSvr ${INSTALL_DIR}/cgi-bin cp -f SecSysManageSvr.wsdl ${INSTALL_DIR}/htdocs

注一:makefile.incl

在Linux上运行各种服务的配置

开启linux平台samba服务 查看samba服务有没有安装 rpm –qa | grep samba

安装samba服务

tar xzvf samba_3.0.8.tar.gz

./configure && make && make install

重启samba服务 /etc/rc.d/init.d/samba restart Service smb start/stop

samba服务自动启动 最标准的做法

1. 在 /etc/init.d 中作一个如下内容的脚本smbd

$smbspool=/var/spool/samba $piddir=/var/run

$smbd=/usr/sbin/smbd $nmbd=/usr/sbin/nmbd

if [ \"x$1\" = \"x\" -o \"x$1\" = \"xstart\" ]; then if [ -d $smbspool ]; then rm -f $smbspool/* fi

$smbd -D

$nmbd -D

elif [ \"x$1\" = \"xstop\" ]; then kill `cat $piddir/smbd.pid` kill `cat $piddir/nmbd.pid` else

echo \"$0 start|stop\" fi

2. 然后执行

ln -s /etc/init.d/smbd /etc/rc3.d/S99smbd ln -s /etc/init.d/smbd /etc/rc0.d/K01smbd

经测试,此方法不行,但可以用下面的方法实现

方法一:配置SSH工具 SecureCRT中文版配置

[全局选项]→[默认会话]→[编辑默认设置]→[终端]→[外观]→[字体]→[新宋体 10pt CHINESE_GB2312]→[字符编码 UTF-8]

putty配置

[window]→[Appearance]→[Font settings]→[Change]→[Fixedsys CHINESE_GB2312]

[window]→[Appearance]→[Translation]→[Received data assumed to be in which character set]

→[Use font encoding UTF-8]

如果经常使用,把这些设置保存在session里面。

打开putty,登录成功后,在shell中输入:export LC_ALL='zh_CN.utf8' 方法二:配置系统

操作系统语言是中文,显示中文字符 编辑/etc/sysconfig/i18n,修改为如下内容: LANG=\"zh_CN.GB2312\"

SUPPORTED=\"zh_CN.UTF-8:zh_CN:zh\" SYSFONT=\"latarcyrheb-sun16\" 或者

LANG=zh_CN.GB18030

LANGUAGE=zh_CN.GB18030:zh_CN.GB2312:zh_CN

export LANG LANGUAGE

这样就能在终端输入和显示中文了,并且shell脚本里原本的中文显示乱码问题也解决了。 操作系统语言是英文,显示中文字符

编辑/etc/sysconfig/i18n,修改为如下内容: LANG=\"en_US\"

SUPPORTED=\"en_US.UTF-8:en_US:en\"

SYSFONT=\"latarcyrheb-sun16\"

添加samba用户

useradd liuhp 必须先在UNIX password database中有这个用户,否则会报错,错误信息如下

[root@GAP1 samba]# smbpasswd -a liuhp New SMB password:

Retype new SMB password:

Failed to initialise SAM_ACCOUNT for user liuhp. Does this user exist in the UNIX password database ?

Failed to modify password entry for user liuhp smbpasswd –a root即将root以samba形式共享出来了, 也可以以在/etc/samba/smb.conf中([myshare]下面)添加 [usr]

comment = usr dir path = /usr

valid users = root public = no

writable = no printable = no

这种形式,这/usr也就以samba形式共享出来了

[public]

comment = usr dir path = /

valid users = root

public = no

writable = yes //表示以root用户登录就能写文件 printable = no

找不到网络路径

配置好samba后,在本机192.168.7.154中打开7.80上的samba文件,提示找不到网络路径,经查,是由于没有在7.80上配置网关导致,因为7.154上设了网关1.1,所以7.80上也设1.1网关即解决问题

重启ftp服务

/etc/rc.d/init.d/vsftpd restart

开启linux平台ssh服务

SSH是一个用来替代TELNET、FTP以及R命令的工具包,主要是想解决口令在网上明文传输的问题。为了系统安全和用户自身的权益,推广SSH是必要的。SSH有两个版本,我们现在介绍的是版本2。

1. 安装SSH

具体步骤如下:

1. 获得SSH软件包。 (ftp://ftp.pku.edu.cn:/pub/unix/ssh-2.3.0.tar.gz) 2. 成为超级用户(root).

注意,如果你希望用tcp_wrappers来控制SSH,那么在configure时需要加上选项“--with-libwrap=/path/to/libwrap/”, 用来告诉SSH关于libwrap.a 和tcpd.h的位置。

3. # gzip –cd ssh-2.3.0.tar.gz |tar xvf –

4. # cd ssh-2.3.0 5. # ./configure 6. # make

7. # make install

和SSH有关的程序都放置在/usr/local/bin下,包括ssh,sftp,sshd2, ssh-keygen等。

二、配置

SSH的配置文件在/etc/ssh2下,其中包括sshd2的主机公钥和私钥:hostkey和hostkey.pub。这两个文件通常是在安装SSH时自动生成的。你可以通过下面的命令重新来生成它们:

# rm /etc/ssh2/hostkey*

# ssh-keygen2 –P /etc/ssh2/hostkey 而ssh2_config 文件一般情形下无需修改。 三、启动sshd2

每个要使用SSH的系统都必须在后台运行sshd2。用手工启动: # /usr/local/bin/sshd2&

可以在“/etc/rc2.d/S99local”中加入该命令,这样系统每次启动时会自动启动sshd2。 四、用tcp_wrappers控制SSH

安装SSH的站点可以用tcp_wrappers来限制哪些IP地址可以通过ssh来访问自己。比如,在/etc/hosts.allow中加入

sshd,sshd2: 10.0.0.1

那么只有10.0.0.1可以通过ssh来访问该主机。

以上都是系统管理员完成的工作。下面我们说说普通用户如何使用SSH。 五、基本应用

每个用户在使用SSH之前,都要完成以下步骤:

1. 在本地主机(比如,local.pku.edu.cn)上生成自己的ssh公钥和私钥。命令如下:

local# ssh-keygen

Generating 1024-bit dsa key pair 1 oOo.oOo.o Key generated.

1024-bit dsa, teng@ns, Fri Oct 20 2000 17:27:05

Passphrase :************ /*在此输入你的口令,以后访问这台主机时要用。 Again :************ /*

Private key saved to /home1/teng/.ssh2/id_dsa_1024_a Public key saved to /home1/teng/.ssh2/id_dsa_1024_a.pub

生成的私钥和公钥(id_dsa_1024_a和id_dsa_1024_a.pub)存放在你家目录的~/.ssh2目录下。和用户相关的SSH配置文件都在~/.ssh2下。私钥由用户保存在本地主机上,而公钥需传送到远地主机的你自己的帐号的~/.ssh2下,如果你要用ssh2访问本地主机的话。

2. 在~/.ssh2下创建“identification”文件用来说明进行身份认证的私钥。命令如下:

local:~/.ssh2# echo \"IdKey id_dsa_1024_a\" > identification

3.同样地,在远地主机(比如,remote.pku.edu.cn)上完成上面步骤。

4.将本地(local.pku.edu.cn)下你自己(这里是“teng”)的公钥(id_dsa_1024_a.pub)拷贝到远地主机(remote.pku.edu.cn)上你自己家目录下的.ssh2目录下,可命名为“local.pub”,一般用ftp上传即可。

5.

在远地主机上,你自己家目录的.ssh2目录下,创建“authorization”

文件,其中指定用来进行身份认证的公钥文件。命令如下: remote:~/.ssh2# echo “Key local.pub” > authorization

6. 现在你可以从本地用ssh2登录到远地系统了。命令如下:

local# ssh remote.pku.edu.cn

Passphrase for key \"/home1/teng/.ssh2/id_dsa_1024_a\" with comment \"1024-bit dsa,

teng@ns, Fri Oct 20 2000 17:27:05\":***********

这时会要你输入你的ssh口令(Passphrase)。验证通过后,即登录到remote主机上。

开启linux平台ftp/telnet服务

在安装好Redhat以后,需要设置Ftp和Telnet服务文件,才能启动Ftp和Telnet服务,可以通过远程控制进行开启。

1.1、用root用户登录,进入终端命令模式;

1.2、开启ftp服务。

cd /etc/xinetd.d ,编辑ftp服务的配置文件gssftp的设置:

图1 开启ftp服务设置.

vi gssftp ,将 修改两项内容:

(1)server_args = -l –a 去掉-a 改为server_args = -l (2)disable=yes改为disable=no (3)保存退出。

1.3、开启telnet服务

cd /etc/xinetd.d ,察看telnet服务的配置文件krb5-telnet的设置:

图2 开启telnet服务设置 vi krb5-telnet ,

(1)将disable=yes,改为disable=no,保存退出。

1.4、激活服务: telnet /ftp 是挂在 xinetd 底下的,所以自然只要重新激活 xinetd 就能够将 xinetd 里头的设定重新读进来,所以刚刚设定的telnet /ftp自然也就可以被激活。 激活目录和命令: cd /etc/rc.d/init.d/ service xinetd restart

有时会提示命令不存在,需要加上命令的路径

[root@localhost init.d]# service xinetd resart bash: service: command not found

[root@localhost init.d]# /sbin/service xinetd restart

图3 重新启动FTP、Telnet服务 1.5连上FTP

图4 连接FTP

说明,如果主机设置了DNS时,不知道为什么FTP连接时有点慢,当连上去以后就正常,如果去掉DNS好像就没有这个问题。

mini_httpd

几个主要的参数介绍

-c 表示需要mini_httpd提供的解析哪些文件,比如 -c \"**.php|**.cgi\"表示mini_httpd要支持php和cgi的解析

-C 表示提供的自定义配置文件,比如

-dd WEB服务器的文件根目录,如果不配置,将默认是mini_httpd服务所在的目录 -u 表示以什么用户启动mini_httpd服务

关于mini_httpd执行PHP CGI

. PHP文件开头需要指出CGI程序, 如: #!/usr/bin/php phpinfo();

echo \"a;sljfkkkksldfkjsdflkjsdfl\";

?>

. PHP文件需要有可执行属性

. 运行mini_httpd的命令

./mini_httpd -c \"**.php|**.cgi\" -u root -maxproc 16 -i /var/run/mini_httpd.pid ./mini_httpd -c \"**.php|**.cgi\" -u root -i /var/run/mini_httpd.pid

/root/agentdev/gap2v/web/mini_httpd-1.19/mini_httpd -c \"**.php|**.cgi\" -u gapadmin -i /var/run/mini_httpd.pid

无论是CGI还是php,信息要输出到浏览器,都需要先进行规范化的输出,即要有这一行: 否则输出会出错

启动xorp配置管理器

/usr/local/xorp/bin/xorp_rtrmgr -g /usr/local/xorp/rtrmgr.conf 查看命令

\\\\192.168.7.41\\public\local\\xorp\\etc\emplates 查看set结果

[root@GAP1 cgi]# cd /usr/local/xorp/bin/ [root@GAP1 bin]# su gapadmin [gapadmin@GAP1 bin]$ ./xorpsh Username:debug

Password:123/9414705

gapadmin@GAP1> configure

protocols/netdoor/control-param/timeout protocols/netdoor/control-param/expire protocols/netdoor/control-param/fdb_items protocols/netdoor/control-param/ttl_low protocols/netdoor/control-param/ttl_up 罗克平(罗克平) 18:34:03 /usr/local/xorp/config.boot 罗克平(罗克平) 18:35:48

ifconfig eth3 hw ether 00:0E:F5:00:F2:C2 罗克平(罗克平) 18:36:05 /usr/local/xorp/bin

罗克平(罗克平) 18:36:22

./xorp_rtrmgr -g ../rtrmgr.conf

xorp配置过程

cd /root/agentdev/gap2v/xorp/ make

make install

安装之后,需要手工添加几个文件(夹) cp /usr/local/xorp/net_door/ cp /usr/local/xorp/xrl/ cp /usr/local/xorp/etc/

cp /usr/local/xorp/config.boot

cp /usr/local/xorp/rtrmgr.conf

cp /usr/local/xorp/etc/xorppasswd.conf groupadd xorp cat /etc/group

useradd -g 557 -d /home/gapadmin gapadmin cd /usr/local/xorp/bin

./xorp_rtrmgr -g ../rtrmgr.conf

su gapadmin ./xorpsh

username:debug password:123456 configure show

设置PATH

declare -x PATH=\"/home/oracle/product/920/bin:/usr/apache2/bin:/root/tpcomm/bin:/usr/local/recovery-agent-1.0/bin:/usr/local/recovery-agent-1.0/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/root/bin\"

declare -x PATH=\"/home/oracle/product/920/bin:/usr/apache2/bin:/root/tpcomm/bin:/usr/local/recovery-agent-1.0/bin:/usr/local/recovery-agent-1.0/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/root/bin:.\" 类似于

PATH=$PATH:.-----$PATH取得当前PATH的值

配置环境变量

vi ~/.bash_profile

GNU/Linux编程 进程

用户CPU时间是进程花在执行用户模式上(非内核模式)代码上的时间总量 系统CPU时间是花在执行内核代码上的时间总量

Times的返回时间是相对而非绝对时间(即以系统启动时间作为基点) 后台

利用CPU时钟自动执行程序,程序不需要人实时干预

进程的概念+后台的概念=后台编程

启动一个新的进程,在这个进程上,运行程序,CPU调用这个进程的同时,程序也被调用,即完成一次后台的执行。终止后台程序的运行,只须杀掉相应进程

Fork:

if((child = fork()) == -1) { perror(\"fork\"); exit(EXIT_FAILURE); } else if(child == 0) { puts(\"in child\");

printf(\"\child pid = %d\\n\ printf(\"\child ppid = %d\\n\ exit(EXIT_SUCCESS); } else {

puts(\"in parent\");

printf(\"\parent pid = %d\\n\ printf(\"\parent ppid = %d\\n\ }

exit(EXIT_SUCCESS); 输出可能是这样: in child

child pid = 5195 child ppid = 5194 in parent

parent pid = 5194

parent ppid = 4293

先把子进程执行完后再来执行主进程 也可能是这样: in child in parent

child pid = 5195 child ppid = 5194

parent pid = 5194 parent ppid = 4293

子进程-》主进程-》子进程》主进程

也就是说,父进程和子进程的执行是无序的,异步的

exec

完全用新程序替换了调用进程

调用waitpid是能够避免kill失败的安全方法。

sigprocmask

if((sigaddset(&newset, SIGTERM)) < 0) err_quit(\"sigaddset:SIGTERM\"); if((sigaddset(&newset, SIGALRM)) < 0) err_quit(\"sigaddset:SIGALRM\");

/* Block the signals without handling them */ if((sigprocmask(SIG_BLOCK, &newset, NULL)) < 0) err_quit(\"sigprocmask\");

/* Wait for a signal */ pause();

使用make block编译这个程序。要测试这个程序,可以在一个窗口中运行block并从 另一个窗口发送信号

kill -TERM 5627(./block的pid) kill -ALRM 5627

kill -QUIT 5627

正如你从输出结果中所看到的那样,向进程发送SIGTERM和SIGALRM不起作用, 即使这两个信号的默认动作一般都是中止进程。当进程接收到SIGQUIT时,如输出结果所显示的那样,进程就退出了。注意,因为程序阻塞了SIGTERM和SIGALRM,所以pause函数永远不会返回,因为进程不会接受信号,这样程序也就不会结束。

sigpending

sigaddset(&set, SIGTERM);

sigprocmask(SIG_BLOCK, &set, NULL);信号集里的信号都阻塞

kill(getpid(), SIGTERM);SIGTERM在信号集里,于是它将成为未决的信号

/* Get pending signals */ sigpending(&pendset);

/* If SIGTERM pending, ignore it */

if(sigismember(&pendset, SIGTERM)) {

sigemptyset(&action.sa_mask);

action.sa_handler = SIG_IGN; /* Ignore SIGTERM */忽略未决信号SIGTERM

sigaction(SIGTERM, &action, NULL); }

/* Unblock SIGTERM */

sigprocmask(SIG_UNBLOCK, &set, NULL); 即使解除阻塞,SIGTERM仍然被忽略,这样就可以使程序正常结束,而不是被KILL掉 exit(EXIT_SUCCESS);

内存分配

malloc函数分配没有被初始化过的内存块。

pipe

fd[0]读出 fd[1]写入

互斥 互斥锁

在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为\" 互斥锁\" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。下面举例:

在Posix Thread中定义有一套专门用于线程同步的mutex函数。 1. 创建和销毁

有两种方法创建互斥锁,静态方式和动态方式。POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如下:

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads实现中,pthread_mutex_t是一个结构,而PTHREAD_MUTEX_INITIALIZER则是一个结构常量。

动态方式是采用pthread_mutex_init()函数来初始化互斥锁,API定义如下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t

*mutexattr) 其中mutexattr用于指定互斥锁属性(见下),如果为NULL则使用缺省属性。

pthread_mutex_destroy ()用于注销一个互斥锁,API定义如下: int

pthread_mutex_destroy(pthread_mutex_t *mutex) 销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。由于在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。 2. 互斥锁属性

互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:

* PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。

* PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。

* PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。

* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。 3. 锁操作

锁操作主要包括加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个,不论哪种类型的锁,都不可能被两个不同的线程同时得到,而必须等待解锁。对于普通锁和适应锁类型,解锁者可以是同进程内任何线程;而检错锁则必须由加锁者解锁才有效,否则返回EPERM;对于嵌套锁,文档和实现要求必须由加锁者解锁,但实验结果表明并没有这种限制,这个不同目前还没有得到解释。在同一进程中的线程,如果加锁后没有解锁,则任何其他线程都无法再获得锁。

int pthread_mutex_lock(pthread_mutex_t *mutex) int pthread_mutex_unlock(pthread_mutex_t *mutex) int pthread_mutex_trylock(pthread_mutex_t *mutex)

pthread_mutex_trylock()语义与pthread_mutex_lock()类似,不同的是在锁已经被占据时返回EBUSY而不是挂起等待。

4. 其他

POSIX 线程锁机制的Linux实现都不是取消点,因此,延迟取消类型的线程不会因收到取消信号而离开加锁等待。值得注意的是,如果线程在加锁后解锁前被取消,锁将永远保持锁定状态,因此如果在关键区段内有取消点存在,或者设置了异步取消类型,则必须在退出回调函数中解锁。

这个锁机制同时也不是异步信号安全的,也就是说,不应该在信号处理过程中使用互斥锁,否则容易造成死锁。

死锁的四个必要条件

操作系统中有若干进程并发执行,它们不断申请、使用、释放系统资源,虽然系统的进 程协调、通信机构会对它们进行控制,但也可能出现若干进程都相互等待对方释放资源才能 继续运行,否则就阻塞的情况。此时,若不借助外界因素,谁也不能释放资源,谁也不能解 除阻塞状态。根据这样的情况,操作系统中的死锁被定义为系统中两个或者多个进程无限期 地等待永远不会发生的条件,系统处于停滞状态,这就是死锁。 产生死锁的原因主要是: (1) 因为系统资源不足。

(2) 进程运行推进的顺序不合适。 (3) 资源分配不当等。

如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则 就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。

(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。 (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之

一不满足,就不会发生死锁。 死锁的解除与预防:

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和 解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立, 如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态

的情况下占用资源。因此,对资源的分配要给予合理的规划。

并发控制主要是对事务的调度进行控制,保证了事务的:一致性 原子性 隔离性 持续性

并发控制?并发用户?并行方式执行? 并 发 控 制

---- 并 发 能 力 是 指 多 用 户 在 同 一 时 间 对 相 同 数 据 同 时 访 问 的 能 力。 一 般 的 关 系 型 数 据 库 都 具 有 并 发 控 制 的 能 力, 但 是 这 种 并 发 功 能 也 会 对 数 据 的 一 致 性 带 来 危 险。 试 想 若 有 两 个 用 户 都 试 图 访 问 某 个 银 行 用 户 的 记 录 并 同 时 要 求 修 改 该 用 户 的 存 款 余 额 时, 情 况 将 会 怎 样 呢? 我 们 可 以 对PowerBuilder 中 的DataWindow 进 行 设 置 来 进 行 并 发 控 制。 所 谓 并 发 控 制 就 是 指 在 用 户 数 据 修 改 的 过 程 中 保 证 该 数 据 不 被 覆 盖 或 改 变 的 方 式, 在 下 面 的 例 子 中 我 们 将 看 到 如 何 设 置Da taWindow 来 控 制 开 发 访 问。 为 了 说 明 问 题, 我 们 举 这 样 一 个 简 单 的 银 行 系 统 中 的 例 子, 某 用 户 的 存 款 状 况 如 右:

---- 我 们 假 设 事 情 的 经 过 是 这 样 的: 公 司 的 某 员 工 在 银 行 前 台 取 款2,000 元, 银 行 出 纳 查 询 用 户 的 存 款 信 息 显 示 银 行 存 款 余 额20,000 元; 正 在 这 时, 另 一 银 行 帐 户 转 帐 支 票 支 付 该 帐 户5,0 00 元, 机 器 查 询 也 得 到 当 前 用 户 存 款20,000 元, 这 时 银 行 的 出 纳 员 看 到 用 户 存 款 超 过 了 取 款 额 , 就 支 付 了 客 户2,000 元 并 将 用 户 存 款 改 为18,000 元, 然 后 银 行 的 另 一 名 操 作 员 根 据 支 票, 将 汇 入 的5,000 元 加 上, 把 用 户 的 余 额 改 为25,000 元, 那 么 数 据 库 管 理 系 统 是 否 可 以 接 受 这 些 修 改 呢?

---- 在DataWindows 的 设 计 中, 我 们 选 择 菜 单Rows|Update …, 会 出 现Specify Update Charac teristics 的 设 置 窗 口, 在 这 个 窗 口 中 我 们 设 置Update 语 句 中Where 子 句 的 生 成, 以 此 来 进 行 开 发 控 制。 在 这 里 有

三 个 选 项, 我 们 分 别 看 一 看 在 本 例 中 这 三 个 选 项 的 结 果:

----(1)Key Columns: 生 成 的Where 子 句 中 只 比 较 表 中 的 主 键 列 的 值 与 最 初 查 询 时 是 否 相 同 来 确 定 要 修 改 的 记 录。 在 上 述 的 例 子 中, 转 帐 支 票 的 操 作 将 覆 盖 出 纳 员 作 出 的 修 改, 这 样 银 行 损 失 两 千 元。

----(2)Key and Updateable Columns: 生 成 的Where 子 句 比 较 表 中 主 键 列 和 可 修 改 列 的 值 与 最 初 查 询 时 否 是 相 同。 在 上 例 中 两 次 查 询 出 的 结 果 都 是 有 两 万 余 额, 当 第 一 个 人 修 改 余 额 时 , 余 额 仍 是 二 万 元, 所 以 修 改 成 立, 而 支 票 转 帐 操 作 时 余 额 已 不 是 二 万, 所 以 该 列 不 匹 配, 修 改 失 败。

----(3)Key and Modified Columns:Where 子 句 比 较 主 键 和 将 要 修 改 的 列, 在 本 例 中, 结 果 与 Key and Updateable Columns 的 选 择 相 同, 因 为 余 额 已 改 变, 不 再 与 最 初 的 查 询 相 同, 因 此 仍 然 不 能 修 改。

---- 让 我 们 作 另 外 一 个 假 设, 我 们 把 银 行 后 台 作 支 票 转 帐 操 作 改 为 冻 结 用 户 存 款, 即 把 状 态 字 段 的 值 改 为 冻 结, 而 且 事 件 发 生 的 次 序 如 下 表, 那 么 表 中 的 次 序4 … 前 台 出 纳 的 修 改 能 不 能 成 立 呢:

----1.Key Columns:Where 子 句 只 比 较 主 键 值, 显 然 出 纳 员 的 修 改 是 允 许 的。

----2.Key and Updateable Columns: 生 成 的Where 子 句 包 括 比 较 所 有 可 修 改 的 列, 因 此 出 纳 修 改 时Statue 字 段 为 冻 结 与 出 纳 查 询 时 的tive 不 符, 修 改 失 败, 同 时 显 示 错 误 信 息。

----3.Key and Modified Columns:Where 子 句 的 比 较 包 括 主 键 和 要 修 改 的 列, 由 于 本 列 中 修 改 列 仍 为20,000 元 没 有 变 化, 所 以 出 纳 的 修 改 可 以 成 立。

---- 在 本 例 中, 我 们 可 以 看 到Key and Updateable Columns 的 选 项 最 严 格, 可 以 避 免 出 现 状 态 列 发 生 改 变 时 余 额 作 修 改 的 错 误, 但 是 这 也 会 禁 止 我 们 作 一 些 本 当 允 许 的 并 发 修 改, 如 出 纳 修 改 存 款 余 额, 而 业 务 员 修 改 用 户 的 联 系 地 址 等。 因 此 我 们 应 当 根 据 实 际 情 况, 选 择 适 当 的Upd ate 设 置。

---- 根 据 我 们 使 用 数 据 库 的 不 同, 我 们 还 有 一 些 其 他 的 控 制 并 发 访 问 和 修 改 的 选 择 方 案, 如 对 数 据 加 锁。 锁 是 一 个 用 户 避 免 其 他 用 户 对 指 定 行 作 修 改 的 操 作。 在 结 束 一 个 事 务 如 执 行com mit,rollback,disconnect 等 语 句 时 自 动 将 锁 释 放。 如 果 您 使 用 的DBMS 支 持 锁 的 操 作, 在Pow er-Builder 的DataWindow 设 计 时,Select 语 句 可 在from

子 句 中 加 上with holdlock: 即 在data Window 的SQL Window 中, 在 表 窗 口 的 标 题 处 点 击 右 鼠 标, 弹 出 菜 单 的 最 后 一 个 选 项 即 为Hold lock。 选 择 该 项, 生 成 的SQL 语 句 将 在re-trievel() 函 数 执 行 后 将 所 查 询 的 数 据 加 锁, 以 避 免 其 他 用 户 的 修 改 访 问, 直 至commit,rollback 等 事 件 发 生 后 解 锁。 这 种 方 式 带 来 的 问 题 是, 当 用 户 查 询 完 数 据 后 可 能 离 开 计 算 机 长 时 间 不 用, 这 段 时 间 内 其 他 用 户 均 无 法 修 改 数 据。 此 外 有 些DBMS 如Sybase 等 不 支 持 行 级 锁, 也 就 是 说 当 你 对 某 一 行 查 询 时 更 多 的 行 都 被 上 了 锁, 这 就 更 增 加 了 并 发 处 理 的 局 限 性。 另 一 个 值 得 注 意 的 问 题 是 在 多 窗 口 应 用 中 某 一 个 窗 口 的 事 务 提 交 将 会 导 致 使 用 一 事 务 中 其 他 数 据 窗 口 的 查 询 行 解 锁, 这 时 修 改 将 可 能 发 生 错 误。 某 些DBMS 系 统 支 持 一 个 称 作\" 时 间 戳(timestamp)\" 的 数 据 项 来 控 制 并 发 性。 每 张 表 中 都 有 一 个 时 间 戳 的 数 据 列, 当Insert 语 句 或Update 语 句 对 数 据 行 作 修 改 时 该 列 自 动 被 修 改 为 当 前 时 间。 当 你 要 作 修 改 时,where 子 句 可 检 查 时 间 戳 列 在 查 询 时 和 修 改 时 两 个 值 是 否 相 符, 以 此 来 确 保 您 作 出 的 修 改 不 会 覆 盖 别 人 的 修 改, 因 此 这 种 确 认 方 式 与key and Updateable Columns 选 项 相 同 。 即 使 两 个 用 户 对 同 一 行 的 不 同 列 作 修 改, 后 一 个 修 改 者 也 将 失 败。 在 常 用 的 关 系 型 数 据 库 中Sybase 和Microsoft 的SQL Server 支 持 时 间 戳 的 使 用。 而 在PowerBuilder 中, 不 管 用 户 后 台 连 接 何 种 数 据 库, 只 要 表 中 带 有timestamp 的 列 名 且 数 据 类 型 为datetime,PB 将 自 动 忽 略Upda te characteristics 的 选 项, 而 在where 子 句 中 生 成 主 键 和 时 间 戳 列 的 比 较。

---- 如 果 您 所 用 的 数 据 库 不 支 持 时 间 戳 但 支 持 触 发 器, 您 也 可 以 在 表 中 增 加 一 列 整 数 型 的 列 。 当 有 对 表 中 某 种 记 录 作 修 改 时, 该 列 自 动 加1。 下 列 使 用 的 是Watcom 数 据 库, 对Shipper 表 增 加Updcnt 字 段 并 作 两 个 触 发 器, 这 样 任 何 用 户 或 进 程 试 图 修 改 某 行 记 录 时, 该 字 段 均 可 发 生 变 化。

---- 对INSERT 触 发 器 的 编 写 如 下:

----DROP TRIGGER INS —SHIPPER‘

----CREATE TRIGGER SHIPPER BEFORE INSERT ON SHIPPER

----REFERENCING NEW AS Newvalue

----FOR EACH ROW

---- BEGIN

---- SET newvalue.UpdCnt=newvalue.UpdCnt+1;

---- END'

---- 同 理 可 编 写UPDATE 触 发 器。

---- 在 您 的PowerBuilder 应 用 之 中, 除 表 的 主 键 外, 必 须 再 加 上 这 一 列 作 为 检 测 列 加 入Updat e 语 句 中 的Where 子 句 中, 这 样 再 作Update 操 作 时, 后 台 数 据 库 会 比 较 修 改 时 与 用 户 作Retriev e 操 作 时 数 据 是 否 相 等, 以 确 认 是 否 能 作 修 改。 在DataWindows 中 在Specify Update Charact eris-tics 的 对 话 框 的 右 下 角 的Unique key column(s) 中 加 上Updcnt 一 项, 同 时 注 意where c lause 中 选 择Key columns, 这 样PowerBuilder 在 构 造where 子 句 时 就 会 认 为Updcnt 亦 是 表 的 主 键, 而 成 为 检 测 项。

---- 当 数 据 窗 口 的Update 函 数 被 调 用 后, 触 发 器 将 修 改 过 记 录 中 的Updcnt 列 表 为 新 值, 为 保 证 下 一 次 修 改 能 够 有 效, 您 应 当 立 即 作Retrieve() 以 使DataWindow 缓 冲 区 中Updcnt 的 值 与 数 据 库 相 同。 显 然 修 改 后 立 即 查 询 的 代 价 要 比 其 他 任 何 一 种 并

---- 发 控 制 的 代 价 要 小 得 多。

并发控制的概念和解决方法

学数据库的时候了解了一些关于并发控制的东西. 举例说就是多个用户同时修改某个文件. 由于修改的先后顺序不同.导致文件存取异常.

例如 联网售票系统 如果原有的两张票 被四个售票台同时卖出去了. 后果.....

解决办法就是需要设制访问独占,区分访问者的先后顺序吧. 保证同一时间只有一个用户能够存取....

再具体的我就不清楚拉~ 我也是学习中~~~~呵呵 关注~~

做项目时,需要数据 并发控制 时如何解决?

如果多台计算机同时修改数据库中同一数据,必然会导致数据的不正确,请问大家在做并发控制是有什么好的解决方案?

假如说发生了同时修改数据,数据库会返回什么信息呢?在程序中怎么捕捉?

在作系统分析时,就应当通盘考虑。我们现在的做法是,在数据库建表时会多出一个字段update datetime类型,在数据提交时前会先从数据库中取出当前值与原有值进行比较,如果不一致就说明已经有别人修改过了。 关于asp.net对数据库并发控制的问题

如果一个网站,有几个人在同一时间修改数据库的一个表里的同一个字段,在asp.net里怎么办?能否把我以下这段代码改一下? OleDbConnection

con

=

Source

=\"

new +

OleDbConnection(@\"Provider=Microsoft.Jet.OLEDB.4.0;Data Server.MapPath(\".\") + \"/db/du.mdb\");

con.Open();

OleDbCommand cmd_fangwencishu = new OleDbCommand(\"update fangwencishu set llcishu=llcishu+1\

cmd_fangwencishu.ExecuteNonQuery();

你这个并发问题并不典型,网站的访问次数每次加一总是不会错,除非数据库服务器的负载能力远远弱于网站访问量。

一个程序员要处理的典型问题是网上商店,用户看到的货品数量,可能已经改变过,这才需要更新前检查,或者用使用了数据库事务处理的存储过程。

数据库并发控制题 T1:A=A+1 T2:A=A*2 T3:A=A**3 有三个事务

T1:A=A+1 T2:A=A*2 T3:A=A**3

串行表示;有哪几种调度;不可串行化调度;什么情况发生死锁? 解: 方法一:

已知a>0,b>0,c>0,d>0,则 (a-b)^2≥0 a^2+b^2-2ab≥0 a^2+b^2≥2ab c^2+d^2≥2cd

a^2+b^2+c^2+d^2≥2ab+2cd abcd=1

[√(ab)-√(cd)]^2≥0 ab+cd-2√(abcd))≥0 ab+cd≥2

同理 ac+bd≥2 bc+ad≥2

a^2+b^2+c^2+d^2+ab+ac +ad+bc+bd+cd ≥3(ab+cd)+ac+ad+bc+bd ≥3*2+2+2=10

a^2+b^2+c^2+d^2+ab+ac +ad+bc+bd+cd≥10

可知(a^2+b^2+c^2+d^2+ab+ac +ad+bc+bd+cd)的最小值=10 方法二:

a>0,b>0,c>0,d>0,abcd=1 cd=1/(ab)

ab+cd≥2√[ab*1/(ab)]=2 其它同方法一. 简单解:

a>0,b>0,c>0,d>0,abcd=1

a^2+b^2+c^2+d^2+ab+ac +ad+bc+bd+cd ≥3(ab+cd)+(ac+bd)+(ad+bc) ≥3*2√(abcd)+2√(abcd)+2√(abcd)=10

答:(a^2+b^2+c^2+d^2+ab+ac +ad+bc+bd+cd)的最小值=10

因篇幅问题不能全部显示,请点此查看更多更全内容