之前参加过公司组织的Linux培训,老师讲的比较基础,但是比较全面,让我这样以前闭门造车的人有一个机会比较好的学习并且复习了一下,不但长了很多见识,更重要的是纠正了很多以前的错误概念。下面分享下(因为版本关系,没有办法保证下面的命令在所有的Linux下都正确,再加上小弟经验和知识有限,没有办法保证所有的说法都正确,最好是自己确认下,如有问题,请多多指教! fantian830211@163.com)。 But what is Linux, according to Wikipedia:Linux Is maN’s Unix. 典型的字母递归J

一、一些重要的概念(关于Linux系统的一些重要特性)

由于我们用Windows太多,我就感觉我自己除了会点鼠标之外对于Windows系统没有太多的了解,甚至没有Linux多。简单重要的几个概念:

1、  文件系统结构

Linux的文件系统这里只说一点,对于多个磁盘分区,Linux也只有一个根目录,而不象Windows,每个分区都有一个根目录,就是我们所看到的C/: D/:等等盘符。

2、文件类型

一切都是文件,包括普通文件、设备文件、目录等等。这里只强调一点,就是跟Windows不一样,文件的后缀名跟文件的类型一般没有什么关系,文件的内容才会真正的决定文件的类型。还有就是隐藏文件是以“.”开头的文件。

3、运行级别

Linux有6个运行级别,但是我们常用的只有3和5,分别表示Shell和X-Window两种模式。如果需要察看和修改,可以修改/etc/inittab文件,之后会有介绍。

4、管道

顾名思义,一根管子,可以连接两个东西,但是只用来连接两个命令,比如:

$ cat afile | less   这个命令的意思就是将cat afile的输出作为less命令的输入。

5、重定向

跟上面的管道有点类似,但是用来将命令的输出定向到另外一个地方,这个地方可以是文件,可以是某个设备等等。这里的重定向是针对标准的输入(Keyboard)输出(Monitor)来讲,操作符有五个:

>

左边的输出定向到右边的输入,比如: wc /etc/passwd > afile

>>

左边的输出定向到右边的输入,比如: wc /etc/passwd > afile

与上一个命令的区别是:如果文件内容存在,>>在文件末尾追加,而>将会将文件内容清空,然后写入自己的内容。

<

右边命令的输出作为左边命令的输入。

2>

标准错误输出重定向。

2>>

标准错误输出重定向。区别与”>””>>”区别相同。

6、交换分区

相当于Windows的虚拟内存。但是Windows的虚拟内存用文件实现,而Linux在磁盘上单独的分区作为虚拟内存。

7、根目录下各个目录的意义

根目录下的目录实际上比较多,而且跟Linux厂商有关系,下面介绍一些常见的目录,这些目录主要是我们常见的Redhat以及其类似的系统的目录,即使这样,下面的这些描述都不一定准确,理由很简单,就是因为时代在变嘛!J

bin

存放系统命令,这些命令与Unix兼容

sbin

存放Linux命令(不是全部)

Usr/bin

存放用户命令

Usr/sbin

存放用户命令

boot

存放内核文件

lib

内核用到的库

dev

设备文件所在,设备文件相当于一个设备,操作这个文件等于操作这个设备。这里介绍两个常用的设备:

/dev/null  空设备。不需要的输出可以重定向到这个设备

/dev/zero  零设备。从这个设备读取数据时只会有0

etc

现在一般存放配置文件(etc顾名思义就是乱七八糟的意思:( )

home

用户工作目录的主目录所在(除root外)

mnt

外部文件系统一般的挂载点

tmp

临时目录(几乎每个用户都会有读写权限),一般为了让所有用户都可以访问到的文件或者目录都放在这里

var

存放程序数据

usr

系统的应用软件的默认安装目录

proc

内核虚拟的一个文件系统,物理上并不存在。内核把自己的状态以文件的形势表现出来。

二、文本编辑

1、  vi简介

vi(Visual Editor)是Linux/Unix系统中自带的一种文本编辑器,功能强大到我们想要学会其所有的功能几乎都是不可能的,下面简介一下,因为这个系统自带的嘛!

首先:vi的三种模式

命令模式

删除字符、排版

插入模式

插入字符、删除、修改字符

最后行模式

通过命令操作vi

接着:vi的使用(使用这些命令的时候注意大小写)

模式之间切换

Esc

插入模式------------>命令模式

Shift + :

插入模式------------>最后行模式

I或者i(区别是i在当前位置插入,I在行首插入)

命令模式------------>插入模式

Shift + :

命令模式------------>最后行模式

Backspace

最后行模式------------>命令模式/插入模式

插入模式

插入、删除、修改

命令模式

移动光标

(使用上下左右键也可以实现上下左右移动)

左移一个字符:按h

右移一个字符:按l

上移一行:按j

下移一行:按k

移至行首:按^

移至行尾:按$

移至文件顶部:按H

移至文件中部:按M

移至文件底部:按L

前翻一屏:按ctrl+f

后翻一屏:按ctrl+b

前翻半屏:按ctrl+d

后翻半屏:按ctrl+u

插入文本

在光标的右边插入文本:按a

在一行的结尾处添加文本:按A

在光标的左边插入文本:按i

在行首插入文本:按I

在光标所在行的下一行插入新行:按o

在光标所在行的上一行插入新行:按O

撤销操作

撤销前一个命令的操作:按u

撤销对一行的更改:按U

删除文本

删除一个字符:按x

删除一个词:按dw

删除一行:按dd

删除行的部分内容:按D(删除光标右的内容)

或按d0(删除光标左的内容)

删除到文件的结尾dG

复制粘贴

复制一行的内容:按yy

复制两行的内容:按2yy   更多行以此类推

粘贴:按p

查找

/aString 在当前的文件里从头开始查找aString。按n查找下一个

?aString 在当前的文件里从结尾开始查找aString。按n查找下一个

最后行模式

vi +num file

这样可以打开时光标定位到num指定的行,如果直接这样写:vi + file ,那么将定位到文件尾

w

保存文件

q

退出vi

q!

退出但是不保存

wq

保存退出

Vi的用法常用的大概就这么多了,但是很多东西我们短时间内很难记得住,其实没有关系,只要记住我标示为蓝色的部分就应该差不多了,呵呵!

三、常用的命令

这边常用的命令我都会凭我的感觉给出他的英文全称,这个不一定准确,但是有助于记忆,呵呵!所有的这些命令其实没有办法给出一个真正的手册,其实还是要亲自试试看才知道!但是,我这边给出来的都是我自己试过的,应该没有什么错误。还有就是很大部分命令都支持正则表达式。

1、基本

包括:cd  clear  alias  unalias  date  ls  pwd  man  exit  echo  service

cd

(Change directory) 改变目录,比如切换到etc目录:

$ cd /etc ,如果$cd,那么会切换到当前用户的目录,比如当前用户是oracle,那么会切换到/home/oracle/

clear

清除当前屏幕的所有内容

alias

取别名,使用格式:aliasName=’aCommand’

unalias

取消别名,使用格式: unalias aliasName

date

显示当前日期,一般显示格式:XXXX年XX月XX日 星期 时:分:秒 CST。也可以用来修改当前的系统时间,比如:

#date –s  ‘2006-4-2 14:07’

cal

(Calendar)也用来显示时间,顾名思义

ls

(List)显示指定目录下的内容,并切换到指定的目录,比如:ls /home/oracle/  但是我一般都用它来显示但前目录下的内容,比如:ls –l 以详细的格式显示当前目录下的内容

ls –la 以详细的格式显示当前目录下的内容,包括隐藏文件

pwd

(Print work directory)显示当前的工作路径

man

$man aCommand 显示当前命令的详细情况,包括使用方法、参数等

exit

退出当前用户,如果当前用户是最后先登陆的一个用户,那么当前终端就会关闭

echo

显示一些东西,比如 $echo $CLASSPATH 就用来显示当前的classpath

service

这个命令用来开启或者关闭一些服务,比如:

#service nfs start(stop/restart) //nfs共享

#service network start(stop/restart)

#service iptables start(stop/restart) //防火墙

2、文件管理

包括:cat  more  less rm  head  tail  grep  cp  mv  wc  find  touch file

cat

读取文件的内容,使用方法如下:$cat afile

建议配合其他命令一起使用,如果文件过大。$cat afile | less

more

用来显示文件内容,可以换行

less

用来显示文件内容,可以翻页

rm

rm删除文件或者目录:

$rm –f afile

$rm –rf adirectory

head

从头开始显示文件指定行的内容

比如:$head –20 afile 显示前20行

默认显示10行

tail

从末尾开始显示文件指定行的内容

比如:$ tail –20 afile 显示后20行

默认显示10行

grep

检查输入是否有指定的字符串或者符合条件的字符串

比如:$grep helloYg afile 检查afile里是否有helloYg

$ls | grep helloYg 检查是否有helloYg这个文件或者目录

cp

(copy)拷贝:cp 源文件 目标文件

也可以拷贝目录 但是需要加 –r参数

mv

(move)移动文件或者目录,或者给文件或者目录改名

wc

(world counter)计算文件内的单词数

find

查找文件,支持正则表达式

touch

修改文件修改时间或者建立空文件 $touch afile

file

察看文件类型

3、目录管理

包括:mkdir  rmdir  rm  du  df

mkdir

建立一个目录

rmdir

删除一个目录

rm

删除一个目录 $rm –rf adirectory

du

察看文件或者目录的大小 $du –hs afile

$du –hs adirectory

df

察看磁盘空间使用情况 $df –h

4、权限命令

如何设定我们用户和文件以及系统的权限。

包括:su  chmod  chower

su

(Switch user) 切换用户。

su – username 和su username的区别:

前者失去当前上下文,并且获得自己的初始环境变量

后者保持当前上下文,不能得到自己的初始环境变量

chmod

修改文件或者目录属性:

$chmod 777 afile

$chmod –R 777 adirectory 修改目录和其子目录和文件

chower

修改文件的所有者

$chown username afile

$chown –R username adirectory

5、系统命令

包括:mount  umount  free  env  uptime  top  kill  关机命令

mount

挂载文件系统

比如:$mount /mnt/cdrom 挂载光盘

umount

卸载文件系统

比如:$mount /mnt/cdrom 卸载光盘

free

查看内存使用状态

$free

env

查看环境变量

$env

uptime

命令显示系统已经运行了多长时间,它依次显示下列信息:现在时间、系统已经运行了多长时间、目前有多少登录用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。

$uptime

top

察看系统状态

$top

kill

杀死进程

$kill –9 pid

关机命令

立即关机$halt

保存后关机 $shutdown –h now

重启$reboot 或者$shutdown –r now

6、用户管理

其实用户管理是Linux一个非常重要的基本功,但是这里我不做详细的介绍,仅仅介绍几个常用的命令,这几个命令都需要root用户来执行。包括:useradd  userdel  passwd  usermod  手工修改

useradd

添加一个用户$useradd newusername

userdel

删除一个用户$userdel username

passwd

修改用户密码$passwd username

usermod

修改一个用户

手工修改

/etc/group /etc/passwd /etc/shadow 三个重要文件

7、常用的网络命令

关于网络管理以及使用的一些命令,包括:ifconfig  ifup  ifdown  ping  netstat  traceroute  route  arp  nbtstat

ifconfig

(iwconfig)

很多时候有人问我为什么不用ipconfig,受毒害太深啊!

ifconfig用来查看当前网络配置,或者修改当前网络配置

比如:ifconfig eth0 192.168.38.88 newmask 255.255.255.0

用来修改当前的IP为192.168.38.88 子网掩码255.255.255.0

iwconfig针对无线网络

ifup

启动网络适配器$ifup eth0

ifdown

关闭网络适配器$ifdown eth0

ping

不知道

netstat

显示网络的连接状态$netstat –rn

traceroute

跟踪路由 $traceroute www.163.com

route

显示路由表或者添加路由表

$route显示当前路由表

arp

维护arp地址表

nbtstat

我一般用来查看谁抢了我的IP:

$nbtstat –A 192.168.36.56

但是不是所有的时候都好用

修改网络配置:

$setup

重新启动网络:

a、$cd /etc/rc.d/init.d

b、$./network restart

         或者

$service network restart

四、安装与卸载(限于Redhat以及相似系统)

  1、rpm命令

rpm(Redhat package manager)是Redhat或者相似系统非常重要的一个命令。可以轻松的实现程序的安装与卸载。下面简单描述下。

a、  安装

$rpm –ivh soft.1.1.rpm

$rpm –ivh –-nodeps soft.1.1.rpm     这样安装的时候不会检查依赖性,不安全,所以不建议这样。

b、  升级

$rpm –U soft.1.1.rpm

c、  卸载

$rpm –e soft.1.1.rpm

$rpm –e –-nodeps soft.1.1.rpm     强制性卸载。

d、  检查系统内安装的包

$rpm –qa | grep dhcp 检查是否安装了dhcp这个包。

$rpm –qa 查看所有的安装包。建议这么使用:$rpm –qa | less  可以翻页的哦!

rpm的使用参数很多,可以baidu或者google下。

2、  Oracle安装

很多时候我们使用Linux作为服务器来使用,关系数据库Oracle是也很常用的了,所以在Linux下安装oracle是我们很容易碰到的问题。但是,很遗憾,由于Oracle没有在Red hat下的认证,所以安装起来比较麻烦。这边我们在图形界面下用多个终端完成。

a、  安装

在Linux下安装oracle,对Linux的安装也有一定的要求,首先最好选择完全安装,然后交换分区最好在1GB以上,1GB也没有问题。其他请查看Linux安装部分。

一、配置操作

配置操作是很重要的一个过程,如果不正确,容易导致安装失败。不过没有关系,后边有介绍到如何卸载,没有弄好的情况下,卸载了然后再安装就可以了。

1、设置内核参数,调节信号灯以及共享内存。

由于oracle使用系统的共享内存,交换区等资源,如果系统内核参数不能满足oracle的要求,安装或者使用的时候就会出现问题。打开/etc/sysctl.conf文件,将下面的数据保存到末尾。

# kernel.shmmax可以计算得到

kernel.shmmax = 2147483648

kernel.shmmni = 4096

kernel.shmall = 2097152

kernel.sem = 250 32000 100 128

fs.file-max = 65536

net.ipv4.ip_local_port_range = 1024 65000

然后kernel.shmmax的计算方法为:

kernel.shmmax = 1024*1024*RAM/2(至少)

接下来设置oracle对文件的要求,$vi /etc/securety/limits.conf ,然后把下面的数据添加到末尾:

oracle soft nofile 65536

oracle hard nofile 65536

oracle soft nproc 16384

oracle hard nproc 16384

然后重启系统。

2、创建用户帐号和安装目录

首先建立用户和组,这里我们建立两个组,一个用来安装,另外一个负责管理,然后把安装和管理归到一个用户来完成。执行这些命令之前先切换到root用户。

命令如下:

$groupadd dba

$groupadd oinstall

$useradd –g oinstall –G dba oracle

$passwd oracle

设置密码。

然后建立安装目录和数据文件存放目录,运行下面的命令即可:

$mkdir /opt/oracle9i

$mkdir /opt/oracle9i/product

$mkdir /opt/oracle9i/product/9.2.0

$chown –R oracle.oinstall /opt/oracle9i

$mkdir /var/opt/oracle9i

$chown oracle.dba /var/opt/oracle9i

$chmod 755 /var/opt/oracle9i

3、设置环境变量

以oracle用户登录,然后编辑/home/oracle/.bash_profile文件,在末尾添加并保存下面的数据:

PATH=$PATH:$HOME/bin

export PATH

unset USERNAME

export ORACLE_BASE=/opt/oracle9i

export ORACLE_HOME=$ORACLE_BASE/product/9.2.0

export ORACLE_SID=FIT

#这个地方的语言自己设置自己合适的就可以了

export NLS_LANG=Japanese_Japan.JA16EUC

export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data

export PATH=$PATH:$ORACLE_HOME/bin

export ORACLE_DOC=$ORACLE_HOME/doc

export LD_ASSUME_KERNEL=2.4.1

CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib

CLASSPATH=$CLASSPATH:$ORACLE_HOME/rdbms/jlib

CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib

CLASSPATH=$CLASSPATH:$ORACLE_HOME/jdbc/lib/classes12.zip

CLASSPATH=$CLASSPATH:$ORACLE_HOME/jdbc/lib/nls_charset12.zip

export CLASSPATH

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/ctx/lib

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/jdbc/lib

export LD_LIBRARY_PATH

建议先推出oracle用户,然后再用oracle用户登录,检查环境变量是否正确。

二、安装过程

上面的前期准备工作结束之后,就可以开始安装了。这个过程大概2个小时。

我这边是从光盘安装的,所以先放入光盘,一般情况下会自动地挂载,挂载点就在/mnt/cdrom。

所以执行命令:#./mnt/cdrom/runInstaller ,然后就会出现安装的GUI界面,终于看到久违的界面了,按照提示next就可以了。

需要注意几点:

当遇到需要指定数据文件存放目录的时候,选择自己准备好的目录。

然后三步分别选择:Oracle9i Database, Standerd Edition, General Purpose

当遇到Unix Group Name 的时候,输入dba,然后next

此时会弹出一个提示小框要求用root用户执行orainstRoot.sh, 此时我们可以新开一个终端,然后:$./提示路径/orainstRoot.sh  ,强烈建议这么做,千万不要切换到提示目录下,如果操作不正确,可能导致等一下无法弹出光盘。执行结束后回到提示窗口,continue继续。当遇到全局数据库名和数据库SID的时候,输入全局数据库名即可,SID就是我们刚刚设置的oracle用户的环境变量中的ORACLE_SID,这里已经自动显示出来了。

接下来的步骤中会有字符集选择,这边建议选择和系统的一致。然后next.

然后就是换光盘的时候先执行命令:$umount /mnt/cdrom  然后才能取出光盘

正式的安装过程中linking阶段会出现2个错误。

第一个是74%的时候,会提示/soft/oracle/network/lib/ins_oemagent.mk 有问题,可以暂时不管,选择ignore.

第二个是84%的时候,会提示$ORACLE_HOME/ctx/lib/ins_ctx.mk出现错误,这个时候我们要修复这个错误,用vi编辑$ORACLE_HOME/ctx/lib/env_ctx.mk,将光标定位到1365行,把“$(LDLIBFLAG)dl”加到

“INSO_LINK=-L$(CTXLIB)$ (LDLIBFLAG)m” 后边,修改好之后应该是:

INSO_LINK = -L$(CTXLIB) $(LDLIBFLAG)m $(LDLIBFLAG)dl $(LDLIBFLAG)sc_ca $(LDLIBFLAG)sc_fa $(LDLIBFLAG)sc_ex $(LDLIBFLAG)sc_da $(LDLIBFLAG)sc_ut $(LDLIBFLAG)sc_ch $(LDLIBFLAG)sc_fi $(LLIBCTXHX) $(LDLIBFLAG)c -Wl,-rpath,$(CTXHOME)lib $(CORELIBS) $(COMPEOBJS)

然后退出重试就可以了。

等数据库建立完毕,安装程序将所有文件复制到系统之后,还会提示要求用root用户执行root.sh,执行下面的命令:

#su – root

$cd /opt/oracle9i/product/9.2.0

$./root.sh

执行之后会提示要求输入full pathname

这边我们输入:/opt/oracle9i/product/9.2.0就可以了。如果出现的错误跟我描述的一样的话,至此oracle的安装应该是Ok了。接下来如果没有别的安装,选择exit就可以了。

最后修复刚刚74%时候的错误。

用oracle用户执行下面的命令:

#cd $ORACLE_HOME/network/lib

#make –f ins_net_client.mk install

然后编辑$ORACLE_HOME/ctx/lib/ins_ctx.mk文件的13-14行:

由:

ctxhx: $(CTXHXOBJ)

$(LINK) $(CTXHXOBJ) $(INSO_LINK)

改为:

ctxhx: $(CTXHXOBJ)

$(LINK) -ldl $(CTXHXOBJ) $(INSO_LINK)

保存退出。

然后执行命令:#make –f $ORACLE_HOME/ctx/lib/ins_ctx.mk install

至此,真的装好了,呵呵! 痛苦ing!

b、  卸载

卸载oracle相对于安装来说,简单多了。

首先关闭oracle,然后删除oracle安装目录 (比如:/opt)目录下的文件,然后删除数据文件。最后删除oracle用户:$userdel –r oracle,这样删除会把/home目录下的oracle目录删除。这样卸载就应该比较彻底了。反正我这样卸载之后,再重新安装oracle没有碰到什么障碍。

c、  常用的oracle管理(启动和关闭,备份和删除数据库)

这里假设我们的数据库有两个,DTATBASE1、DTATBASE2,其ORACLE_SID也是这两个,而且这两个数据库都是使用oracle这个用户安装的(这里其实就是oracle的.bash_profile里的ORACLE_SID这个环境变量的关系)。

启动:

切换到oracle用户:$su – oracle

查看ORACLE_SID: echo $ORACLE_SID

如果是DTATBASE1,没有关系,

我们就先启动DTATBASE1:#sqlplus “username/passwd as sysdba”

然后键入startup,稍等一下,数据库就启动了。

如果需要远程的使用数据库,我们还需要打开监听程序:#lsnrctl start DTATBASE1

然后我们启动DTATBASE2

首先修改ORACLE_SID:export ORACLE_SID=DTATBASE2

然后#sqlplus “username/passwd as sysdba”,接着starup就可以了。

这个时候监听程序应该不用再启动了,因为启动过一次就应该可以了。这样Oracle就启动好了。

这里需要注意:#sqlplus “username/passwd as sysdba”这个语句不安全,因为这样可能会被其他用户看到username/passwd,所以不建议这么做,但是作为开发人员,这样做是没有什么太大的影响的。正确的做法是:#sqlplus /nolog,然后conn username/passwd as sysdba

如果还有更多的数据库,启动方式是一样的。每个数据库实例只能管理一个数据库,所以需要启动多次。

关闭的方法跟打开的时候一样,只是把startup变成shutdown或者shutdown abort

备份的时候只需要把对应数据库的数据存放目录下的所有东西全部备份就可以了。 其实这样比较傻瓜,但是简单,恢复的时候拷贝回来就可以了。

删除数据库也很简单,把数据库存放数据的目录以及其内容全部删除就可以了。

3、  Setup

setup命令可以打开一个字符菜单,这个功能强大,可以完成相当一部分的系统设置。既然是菜单,就没有什么好描述的了,按照提示做就可以了。但是我们配置好一个服务之后,一般得重启这个服务才能生效。比如说网络配置,可以$service network restart重启服务,然后配置才会生效。

五、相关工具的命令

1、  FTP

FTP是我们常用的文件传输工具。常用的命令很少,很好掌握。

a、  登陆ftp

$ftp 202.118.1.64(这个地方用IP或者Server name)

然后输入用户名和密码,当然如果匿名登陆的用户名是:anonymous,然后密码为空。

b、  查看当前目录命令ls,改变目录命令cd,这些都跟普通的终端命令一样使用。

c、  lcd命令用来定位本地的工作目录,比如ftp>lcd /home/yg,那么我们下载文件的时候默认就会保存到这里。呵呵!不知道上传的时候会怎么样,也应该可以的!

d、  下载命令 ftp>get file 这里file可以是正则表达式,这样就可以多个文件了。

上传命令 ftp>put file 把文件上传到服务器的当前目录。

其实上传和下载都可以指定模式,但是比较不常用。

e、  退出命令:quit或者bye

我们常用的ftp命令就应该可以正常操作了,至于很多高深的东西,还有待研究!

2、  Telnet

Telnet在我们远程管理一台服务器的时候,是一个非常方便的工具。

使用Telnet的最简单的方法是在命令行键入:
$telnet remote-computer-name(or IP)

还有很多高级的用法,可以上网查看一下!

六、常见的系统设置

这些设置都是在Shell下完成,至于X-Window,没有尝试过。

1、  运行级别

修改运行级别一般情况下的作用是使我们启动系统的时候默认的模式,一般都是Shell或者X-Window这两个模式。具体修改方式如下:

$ vi /etc/inittab

然后将下面的蓝色部分中的红色数字修改成上面注释的数字即可。

# Default runlevel. The runlevels used by RHS are:

#   0 - halt (Do NOT set initdefault to this)

#   1 - Single user mode(单用户模式,这个时候进入系统不需要密码)

#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)

#2这种模式下和3差不多,但是没有NFS(Network file system)服务

#   3 - Full multiuser mode(多用户模式,启动后进入Shell)

#   4 - unused

#   5 - X11 (X-Window模式,也就是图形界面模式)

#   6 - reboot (Do NOT set initdefault to this)

# 

id:5:initdefault:

2、  共享

Linux下共享是一个比较费劲的事情,但是当有这个需求的时候,我们还是需要去面对,下面我这边介绍一个简单的共享方式,为什么简单呢,因为很多安全因素没有考虑到,如果需要的话,上网查找相关的资料就可以了。这个共享方式在两个Redhat9上实现通过。

NFS(Network file system)是sun实现的一个文件系统,感觉在solaris上应该有相同的东西。

首先,服务器端设置:

服务器端的设定都是在/etc/exports这个文件中进行设定的,设定格式如下:

欲分享出去的目录 主机名称1或者IP1(参数1,参数2) 主机名称2或者IP2(参数3,参数4)

比如:

/home/public 192.168.0.*(rw)   *(ro)

/home/test  192.168.0.100(rw)

/backup  192.168.36.5  #这个方式下只允许192.168.36.5 这个用户已只读(默认)的方式挂载。这个是主机(192.168.36.91)允许192.168.36.5 以只读的方式挂载/backup目录。后边可以看到。

参数介绍:这些参数其实精通的时候才会用到,这里介绍的简单方式不会用到。

rw:可读写的权限;

ro:只读的权限;

no_root_squash:登入到NFS主机的用户如果是ROOT用户,他就拥有ROOT的权限,此参数很不安全,建议不要使用。

root_squash:如果以root身份登陆NFS的/root目录时,这个时候将会变成 nobody 身份

all_squash:不管登陆NFS主机的用户是什么都会被重新设定为nobody。

anonuid:将登入NFS主机的用户都设定成指定的user id,此ID必须存在于/etc/passwd中

anongid:同 anonuid

sync:数据同步写入存储器中。

async:数据会先暂时存放在内存中,不会直接写入硬盘。

insecure 允许从这台机器过来的非授权访问。

服务器端设置好之后执行#service nfs start(restart),重启下NFS服务。其实NFS启动之前还有一个portmap服务需要启动,但是Redhat默认是启动的,我们就不用启动了,但是如果需要启动的话,使用这个命令:#service portmap start 这样,服务器端的设置就差不多了,好痛苦啊!L

客户端的设置:

客户端的portmap服务应该起来,但是Redhat默认是启动的,所以我们不用管。

然后使用:#showmount -e 192.168.36.91 看看能不能看到刚刚我们设置的可以主机192.168.36.91的共享目录,如果看到就使用这个命令:mount -t nfs hostname(orIP):/directory /mount/point 比如:

#mount -t nfs 192.168.36.91:/backup /mnt/share 这样就OK了,但是如果这样不成功的话,麻烦就大了。不过如果保证服务都是启动的,就应该没有问题。

如果出现问题,下面的方法应该有所帮助:

a.     编辑/etc/hosts.deny 全部注释掉

b.     编辑/etc/hosts.allow 全部注释掉

c.     关闭防火墙,注意两个机器都要关闭 #service iptables stop

d.     重启protmap #service portmap restart

e.     重启nfs  #service nfs restart

但是先声名,这样做不是一般的危险,那是相当的危险了,使用时小心,不然你的机器就成了别人很容易攻击的那种了。但是这样做肯定好用,nsf肯定成功,如果不成功,考虑下最近是不是。。。。。J

下面简单介绍下安全性,来自网络,但是其实很好理解:

NFS的不安全性主要体现于以下4个方面:

a、新手对NFS的访问控制机制难于做到得心应手,控制目标的精确性难以实现

b、NFS没有真正的用户验证机制,而只有对RPC/Mount请求的过程验证机制

c、较早的NFS可以使未授权用户获得有效的文件句柄

d、在RPC远程调用中,一个SUID的程序就具有超级用户权限

加强NFS安全的方法:

a、 合理的设定/etc/exports中共享出去的目录,最好能使用anonuid,anongid以使MOUNT到NFS SERVER的CLIENT仅仅有最小的权限,最好不要使用root_squash。

b、 使用IPTABLE防火墙限制能够连接到NFS SERVER的机器范围

iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT

iptables -A INPUT -i eth0 -p UDP -s 140.0.0.0/8 --dport 111 -j ACCEPT

c、 为了防止可能的Dos攻击,需要合理设定NFSD 的COPY数目。

d、 修改/etc/hosts.allow和/etc/hosts.deny达到限制CLIENT的目的

/etc/hosts.allow

portmap: 192.168.0.0/255.255.255.0 : allow

portmap: 140.116.44.125 : allow

/etc/hosts.deny

portmap: ALL : deny

e、 改变默认的NFS 端口

NFS默认使用的是111端口,但同时你也可以使用port参数来改变这个端口,这样就可以在一定程度上增强安全性。

f、 使用Kerberos V5作为登陆验证系统

3、  修改Swap

A:修改Swap相当麻烦了。不如讲个笑话吧!

B:好啊!

A: 从前有个太监。。。。。。。。。。。

B: 下面呢?

A:没了!

4、设定系统环境变量(JDK安装)

JDK的安装对于Java开发人员来讲,是总是会碰到的问题,这边简单描述一下如何安装。在Linux系统中,每个用户都会有自己的profile,就是自己的工作目录下,比如oracle用户的:

$ls –la /home/oracle/ 就可以看到.bash_profile文件,这个就是当前用户的配置文件,理论上讲,用户的所有的环境变量都可以设置在这里,但是唯独JDK的环境变量设置在这里会有些麻烦,其实还有一个系统全局的profile,这个就是/etc目录下。这里我们把JDK的环境变量都设置到这里,然后所有的用户登录系统后都可以使用Java了。但是是不是安全呢?哪位达人能不吝赐教?其实作为开发人员,没有必要全部了解。

安装步骤:

a、  很显然,下载一个安装程序。关于安装程序的版本很多,安装起来的方式也稍有不同。但是无所谓,下面会有提到常见的格式的安装。

b、  切换到root用户,改变安装文件的属性,使得其可以执行。

$chmod 777  j2sdk-1_4_2_01-linux-i586-rpm.bin

然后./j2sdk-1_4_2_01-linux-i586-rpm.bin 到这里一般的安装都是相同的,接下来如果安装文件的不同,安装的方式就不一样了。有的安装文件在执行上面的步骤后就什么都不用做了,会自动安装完成。但是有的会生成一个rpm包,这样我们还需要:给j2sdk-1_4_2_01-linux-i586.rpm赋执行权限:$chmod 700 j2sdk-1_4_2_01-linux-i586.rpm  然后安装j2sdk-1_4_2_01-linux-i586.rpm:

$rpm -ivh j2sdk-1_4_2_01-linux-i586-rpm

出现授权协议,按Enter键接受

(5)使用默认的安装位置,在/usr/java/下,即/usr/java/j2sdk1.4.2_01

c、  然后配置环境变量

首先:$vi /etc/profile

然后在末尾添加:

#set java environment

#JAVA_HOME这一项按照自己的安装目录来设置,根据不同的JDK版本来

export JAVA_HOME=/usr/java/j2sdk1.4.2_01

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

保存退出

接着 $source profile 或者 $./profile

然后 $java –version

如果正确执行,那么Congratulations,install successfull.

如果没有正确执行,重启一下系统,再执行一下$java –version。

如果仍然没有正确执行,检查一下profile中的环境变量是否设置正确。

其实各位应该可以明白,环境变量的设置是为了让系统可以找到java的执行环境,所以我们上别的系统上拷贝过来一个JDK(当然是Linux版本),然后正确的配置环境变量,也是可以正常使用的。

4、  系统备份(打包、压缩以及解压缩)

系统备份是系统管理员的日常工作,对于我们开发人员来讲,不是特别重要,但是我们很多时候也需要备份我们的文件,然后这些备份常用的命令不过是打包、压缩以及解压缩。

a、  tar命令(打包命令)

tar命令是我们用来打包我们需要备份的文件或者目录的命令。常用的使用方法如下:

将/home/oracle/目录下的所有文件打包到a.tar

$tar cvf a.tar /home/oracle/

解开包,解压缩到当前目录

$tar xvf a.tar

查看包的内容

$tar tf a.tar

如果需要压缩或者解压缩的话,在上面命令的前两个使用方法中添加参数”z”,然后打包的时候会自动压缩,解包的时候会自动地解压缩。这个那是相当的方便了。

比如: $tar czvf a.tar.gz /home/oracle/   这个时候打包的时候就会自动地压缩。

解压缩:$tar xzvf a.tar.gz 这个时候就会自动地解压缩。

b、  压缩解压缩工具

压缩解压缩工具一般和上面的tar命令一起使用。其实了解上面的tar命令就可以实现我们常用的备份了,但是一些常见的工具我们还是有必要了解一下的。这些命令我都没有对目录成功使用过,所以每次都需要配合tar命令使用。

首先:gzip和gunzip

这个是很高效的自由软件,随便用不花钱的,呵呵!有一个很重要的特点是如果不加任何参数,压缩的时候会删除源文件。

$gzip file  这样将生成file.gz,删除源文件file;

$gzip –c file > file.gz 这样会保留源文件file

解压缩: $gzip –d file.gz 或者 $gunzip file.gz

接着:compress和uncompress

这个工具是很古老的东东,所以我猜测,在有的UNIX上也可以使用,呵呵!也有一个重要的特点:不加参数,压缩结束后会删除源文件。使用方法和上面的工具有惊人的相似。J

$compress file  这样将生成file.Z,删除源文件file;(如果文件是空,什么都不做,呵呵!)

$compress–c file > file.Z 这样会保留源文件file

解压缩: $compress –d file.Z 或者$uncompress file.Z

然后:zip和unzip

这个我们就很熟悉了,很多平台上我们都可以见到,至少Windows,Unix,Linux上多见到过。还是有一个重要的特点:不加参数压缩后不会删除源文件。

压缩一个文件: $zip zipfile sourcefile

压缩一个文件并且删除源文件:$zip –m zipfile sourcefile

解压缩:$unzip zipfile

其实解压缩应该还有另外一种用法,但是我从来没有用过,呵呵!

5、  常见的标志(权限:r w x s t 标志:l b c d)

标志位是显示一个文件属性的标识。常见的有以下几个:

r: read

w: write

x: execute

s: 表示该用户如果有权限执行该文件,那么执行的时候将变成文件所有者。

t: 表示有些权限,但是不可以删除

后两个不常用。

属性的第一个位置:

l: 表示link文件

b: 块设备文件 block device

c: 字符设备文件 character device

d: directory

七、Shell编程

Shell编程是个比较麻烦的东西,因为针对不同的shell,会有不同的语法。这边我们仅仅讨论我最常用的bash的语法。但是村长也是干部,脚本语言也是语言,那么,如何学习一门语言呢?很显然,一门语言有两个要素:API和语法。首先我们需要学习这两个,语法是必须熟悉的,API先掌握常用的就可以了,需要的时候再查。其实学习一门语言还有一个最重要的,那就是在语法的框架下,如何使用这些API高效的表达出编程人员内心的想法,这个也是我们学习一门语言最困难的地方。别的语言也是一样,甚至包括人类的语言!

OK!Let’s move!

1、  Shell变量和参数

变量的分类:

作用域:全局变量  局部变量

用途:系统环境变量 位置参数 用户自定义变量

数据类型:字符串变量 数值变量

变量的定义:

myname = “yaogao”

2、  环境变量

几个常见的环境变量:

HISTFILE 历史纪录文件

HISTSIZE 历史纪录列表的大小,就是用来缓存历史命令的条数

HOME 当前用户的主目录

PATH 当前用户的通用路径,一般用来保存一些可以执行的文件

UID  用户的ID

PS1 (PS2) 一(二)级提示符

TERM 终端类型

3、  位置参数

位置参数很重要,常用的有:

位置参数:$1-$9  $1表示命令后的第一个参数,之后的类推

特殊参数:$0 命令名

$# 参数个数

$* 所有参数

$$ 命令的PID

比如:

$vi hello 然后添加:

#!/bin/bash

echo $1

echo $2

helloyg =”yaogao”

echo $helloyg

保存退出,然后执行命令:

$chmod 777 hello

$./hello genius is

输出结果:

genius

is

yaogao

4、  运算符

运算符的种类很多,这里一一列举也没有意义,后边有用到。其实上网查询也可以。

5、  常用语句

对于这些常用的东东,这边我用例子来展示如何使用,还是那句话,用到的时候baidu或者Google下。

a、  test

测试表达式的真假:

#!/bin/bash

if test 2>2

then

echo "2>2"

elif 1>2

then

echo "1>2"

else

echo "hello yaogao"

fi

b、  if

麻烦看上面。

c、  case

#!/bin/bash

case $1 in

hello)

echo "hello yg"

;;

helloyg)

echo "hello world, hello yg"

;;

esac

d、  for

#!/bin/bash

for I in /bin/*

do

echo $I

done

e、  while break

#!/bin/bash

while [ 1=<2 ]

do

echo "hello yaogao"

break

done

f、  read

#!/bin/bash

echo "Enter a number:"

read a

echo "Enter another number:"

read b

echo "Your entered number:"

echo $a

echo $b

上面的介绍实在是太少,其实关键还是我的功力不够啊!不过这东西慢慢来!-_-p

8、运行方式

麻烦察看3中的例子。

还有一种办法,比如3中的也可以这样:$bash hello Genius is

八、Linux安装

Linux的安装比较简单(Red hat至少是这样),但是就是有一个地方稍微麻烦点,就是磁盘的分区,其他的按照安装程序的提示就可以了。

一般情况下磁盘的分区需要根据磁盘的大小来确定,我这边的磁盘是80G。

1、/ 这个根分区5GB比较合适

2、root 这个分区 5GB比较合适

3、boot 分区一般100M或者稍微大一些

4、swap 分区保持在1GB或者稍微大一些

6、  opt 分区2GB

7、  var 分区2GB

8、  usr 分区6GB,这个是应用程序的默认安装目录,所以如果完全安装系统,这里会使用到达该4GB多一些,然后再留下一些空闲的。

9、  home 目录保持在20GB比较好,这个视情况而定

10、  后剩余的空间可以作为别的用处,比如需要安装oracle,oracle的数据文件可以放在单独得一个分区上,大小就可以自己决定。

九、简单应用

简单介绍Crontab的使用,这个功能强大,很多时候我们用来实现管理的自动化。下面用batch来处理介绍下。

Batch处理就是定时地执行某个程序。其实可以很明显的看到,这里我们需要做到两个东东:定时执行程序。下面描述一下这两个东东。

定时:

我们这边使用的是Linux系统,如果我们需要按一定的周期执行程序,我们可以使用crontab来实现。crontab (C)指令从指定文件或标准输入拷贝或编辑成用户的 crontab 文件,该文件规定了在指定日期和时间调度运行一些指令。

可以使用如下的方法来使用:

$ crontab -e

编辑方式与vi相同。

编辑结束然后保存退出,系统会自动的安装crontab。修改crontab时可以使用相同的方法。虽然有别的办法可以实现相同的效果,但是这里建议使用这种方法,安全第一嘛!

Example:

$ crontab -e

#Created by Yaogao 2005-12-30 12:43

#For Ebid shukei

30 11 * * * (echo "Crontab start to run ....";

. /etc/profile;/home/ebid/ebid_rmi/rirekishukeibatch/bin/bash.sh;echo "Crontab stopped!")

00 17 * * * (echo "Crontab start to run ....";

. /etc/profile;/home/ebid/ebid_rmi/mailbatch/bin/mailsh.sh;echo "Crontab stopped!")

解释一下:

第一:"#"注释开始

第二:30 11 * * * 标示各种时间。(30 11 * * *的意思是:每天11点30分)

所以这5个数分别代表minutes  hours  day_of_month  month  day_of_week

  minutes      分钟   0-59

  hours       小时   0-23

  day_of_month   日    1-31

  month       月    1-12

  day_of_week    星期     0-6(0表示星期日)

还有就是"*"代表该字段所有的可能值。

下面是比较有意思的一些时间设定:

#每天早上6点

0 6 * * *

#每两个小时

0 */2 * * *

#晚上11点到早上8点之间每两个小时,早上8点

0 23-7/2,8 * * *

#每个月的4号和每个星期的星期一到星期三的早上11点

0 11 4 * mon-wed

#1月份1日早上4点

0 4 1 jan *

第三:Command

对于command,如果只有单个命令,可以这样:

#每天早上6点执行date命令

0 6 * * * date

如果是多个命令:0 6 * * * (echo "Crontab start to run ....";

. /etc/profile;/home/ebid/ebid_rmi/rirekishukeibatch/bin/bash.sh;echo "Crontab stopped!")那么命令之间用";"分隔。执行顺序由先至后。

其实这里还有一个比较重要的东西,就是 . /etc/profile,这个命令必须得有,虽然这个是全局变量,而且系统启动之后就应该设定好了,但是这里仍然需要重新设定。

这样我们就实现了在固定的某个时间执行我们的程序。

执行程序:

执行程序就相对来说比较简单了,只要我们设置好需要的环境变量,那么程序就可以执行了。一般的做法都是写一个脚本,比如说上面的bash.sh。

Example:

#!/bin/csh -f

#setenv  SYSTEM  shukei

setenv  CLASSPATH  '.'

set batch_home=/home/oracle/project/rirekishukeibatch/

set flist=`ls $batch_home/lib/*.jar`

foreach name ($flist)

setenv CLASSPATH ${CLASSPATH}:${name}

end

echo "Shukei Start  .........."

cd   $batch_home/bin

java divinemind.only.Helloworld helloYG

java divinemind.only.Helloworld helloYG

echo "Shukei End ........."

解释一下:

#!/bin/csh -f:指定shell,上面提到过注释,但是对于脚本,第一行不被认为是注释。这里我们使用C shell,虽然这种shell不赞成被使用,但是就像我们使用任何语言写Helloworld的效率都差不多一样,我们这里使用别的shell也没有什么区别。其实最重要的一点还是C shell有我很需要的一个重要的支持,下面会有提到。

#setenv  SYSTEM  shukei:注释

setenv  CLASSPATH  '.'  :设定环境变量,setenv命令跟bash的export命令一样可以设定环境变量。

set batch_home=/home/oracle/project/rirekishukeibatch/ :设定shell变量。

set flist=`ls $batch_home/lib/*.jar` :设定shell变量。刚刚说到的C shell的一个重要支持就在这里。其实其他shell也应该可以实现。

foreach name ($flist)

setenv CLASSPATH ${CLASSPATH}:${name}

end

循环设定环境变量。下面几句的功能就是将jar文件设定到环境变量,让java程序得以执行。

setenv  CLASSPATH  '.'

set batch_home=/home/oracle/project/rirekishukeibatch/

set flist=`ls $batch_home/lib/*.jar`

foreach name ($flist)

setenv CLASSPATH ${CLASSPATH}:${name}

end

下面这几句很简单,就是执行java代码。

echo "Shukei Start  .........."

cd   $batch_home/bin

java divinemind.only.Helloworld helloYG

java divinemind.only.Helloworld helloYG

echo "Shukei End ........."

上面描述了如何定时和如何写脚本执行我们的java程序,运行结果系统通过mail发送到当前用户的邮箱。bash.sh能够执行我们的java程序,crontab能够定时地执行我们的bash.sh,那么大家可以看到,batch处理功能已经做好,呵呵!

终于算是结束了,这个时候我才明白什么叫做心力交瘁,所以后来尤其是今天写的东西都有点完成任务的味道了,可是万能的主,我在替谁完成任务?-_-b

Linux 简单应用相关推荐

  1. Linux简单安装Mysql+Apach+PHP+phpMyAdmin

    Linux简单安装Mysql+Apach+PHP+phpMyAdmin 2008年06月02日 星期一 上午 01:00 从网上看到许多Apache+Mysql+PHP的安装文档,但有的总是会有写错误 ...

  2. [原创]linux简单之美(二)

    原文链接:linux简单之美(二) 我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事: 1 section ...

  3. 交叉编译及linux简单程序设计,嵌入式实验6交叉编译及Linux简单程序设计实验

    实验六交叉编译及Linux简单程序设计实验的实验报告 一实验目的 1.了解和掌握交叉编译模式和方法: 2.熟悉和掌握Linux简单程序设计. 二实验环境 预装Fedora10_A8_Linux的pc机 ...

  4. linux用户命令快捷链接,linux简单命令

    linux系统命令是最基础也是最重要的部分,下面由学习啦小编为大家整理了linux简单命令的相关知识,希望对大家有帮助! linux简单命令一.文件和目录 家目录为 /home/user 或者 - 目 ...

  5. linux cc脚本,Linux运维知识之Linux简单处理CC攻击shell脚本

    本文主要向大家介绍了Linux运维知识之Linux简单处理CC攻击shell脚本,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助. 第一个脚本是通过查找日志中访问次数过多的ip,并 ...

  6. Linux编译和下载嵌入式实验,嵌入式实验6交叉编译及Linux简单程序设计实验

    <嵌入式实验6交叉编译及Linux简单程序设计实验>由会员分享,可在线阅读,更多相关<嵌入式实验6交叉编译及Linux简单程序设计实验(7页珍藏版)>请在人人文库网上搜索. 1 ...

  7. Linux简单操作权限和相关工具

    Linux简单操作权限: linux是一个多用户操作系统,可以同时登录多个用户,各自操作各自的,互不影响,这时候就会出现一些问题,比如一个人把另一个代码删除或者修改了,因此系统需要进行权限的控制和设置 ...

  8. Linux简单知识点梳理(持续更新中)_莫韵乐的Linux王国

    Linux简单知识点梳理(持续更新中) Linux系统特点 特点 开放性 多用户 良好的用户界面 提供丰富的网络功能 设备独立性 可靠的系统安全 良好的可移植性 ##### Linux系统体系结构 名 ...

  9. linux最简单的命令,Linux 简单命令整理

    Linux系统是一种开源高稳定性的操作系统,在服务器领域得到广泛的应用.作为一个Java后台开发工程师经常需要登录Linux服务器部署应用程序,或者是查看程序的运行状态.一般的Linux服务器上是不会 ...

  10. 达内linux root密码,【达内课堂】 11个最常用的Linux简单命令

    叮叮叮~上课啦!各位同学,今天达妹为大家收集了11个最常用Linux简单命令,火速收藏起来吧! 1.# 表示权限用户(如:root),$ 表示普通用户 开机提示ogin:输入用户名 password: ...

最新文章

  1. pandas高级处理-数据离散化
  2. WINCE下如何设置/删除/查询这些环境变量
  3. [SoapUI] Jenkins 配置不同环境(TP, LIVE)
  4. Serializable和Parcelable
  5. .NET Core 微信公众号小程序6种获取UnionID方法,你知道哪几种?
  6. Codeforces Round #688 (Div. 2)
  7. 小心使用tf.image.resize_images,填坑经验分享给你
  8. 计算机网络四级题库word,计算机四级考试题库2016
  9. jquery上传图片插件(支持各种功能)
  10. Linux环境中清除tomcat缓存
  11. NSIS 封装软件工具封装的软件,安装后快捷方式没有图标显示问题
  12. 《Java从入门到放弃》文章目录
  13. Linux搭建waf防火墙,Linux入门教程:nginx安装配置naxsi waf防火墙,nginxwaf Naxsi 不依赖...
  14. 校园网状态下通过智能插座为ipad实现远程智能充电
  15. matlab中根据信号和信噪比添加高斯白噪声(函数直接使用)
  16. 改造vue-quill-editor: 结合element-ui上传图片到服务器
  17. 开卡修复一个掉固件的RTS5732DL固态,附瑞昱RTS5732量产工具开卡简易教程
  18. win7计算机打开显卡设置在哪里,win7 显卡设置在哪_win7系统显卡设置的方
  19. hp服务器看网卡位置,HP SuperDome确定网卡所在物理位置的方法:
  20. 计算机存储,数据类型,常量和变量

热门文章

  1. TensorFlow2.0实战项目之车道偏离预警
  2. Linux Curl命令教程
  3. 蚂蚁全媒体中心刘鑫炜解答:产品软文推广怎么写,如何写好软文
  4. 模拟群面——产品设计题
  5. B2B、B2C、C2C、O2O区别
  6. 思科sp ccie 认证中必看网络安全之垃圾邮件过滤技术
  7. html document怎么转换成word,Doxillion Document Converter – 将 DOC、DOCX、PDF、WPS、Word、HTML文档格式互相转换...
  8. java 防XSS过滤处理过滤器
  9. 黎曼曲率张量漫谈(续)
  10. uefi gpt装ghost win7系统