0. 获取帮助
man cmd // 查看cmd命令详细帮助说明
cmd --help // 查看cmd命令简要帮助说明
1. 文件/目录
pwd 显示当前目录
cd 切换目录
例:cd ~
回到当前用户工作目录
例:cd ~main
回到main用户的工作目录
例:cd -
回到上一次进入的目录
ll 较详细地列出目录内容
ls 列出目录内容
例:ls -lih
列出当前目录下的文件和子目录信息
例:ls -ltr | tail -n 8
按照修改时间降序排列(最新修改的文件排在前面),列出当前目录下的前8个文件和子目录信息
例:ls log* -lhrt
列出当前目录下,名称以log起头的文件和子目录的信息
例:ls -a
列出当前目录下的文件和子目录信息(包含隐藏部分)
stat 查看文件或目录的所有者
例:stat cmd.txt 查看cmd.txt文件的相关信息
例:stat -c %U cmd.txt 获取当前目录下cmd.txt的所有者
例:stat -c %U /home/game/test 获取/home/game/test目录的所有者
ln 为文件在另外一个位置建立一个链接
例:ln -sf /home/appsvr appsvrLink // 在当前目录中建立一个名为appsvrLink的软链接(链接指向/home/appsvr)
例:ln -f /home/expsvr expsvrLink // 在当前目录中建立一个名为expsvrLink的硬链接(链接指向/home/expsvr)
--------------------------------
-f : 创建链接时,先删除同名的链接
-i : 在删除时,先进行询问
-s : 进行软链结(symbolic link)
链接有两种,一种被称为硬链接(Hard Link),另一种被称为软链接(符号链接,Symbolic Link)。
建立硬链接时,链接文件和被链接文件必须位于同一个分区内,并且不能建立指向目录的硬链接。
硬链接会在选定的位置上生成一个和源文件大小相同的文件,而软链接,只会在选定的位置上生成一个文件的镜像,不会占用磁盘空间。
软链接可以跨分区,并能指向目录。无论是软链接还是硬链接,文件都保持同步变化。
用ls察看一个目录时,文件后面有一个@的符号,那就是用ln命令生成的文件,用ls -l命令去察看,可以显示链接的路径。
--------------------------------
dir 显示目录中内容
lsof 列出某个进程打开的所有文件信息 更详细地请参考:Unix调试的瑞士军刀:lsof
打开的文件可能是普通的文件,目录,NFS文件,块文件,字符文件,共享库,常规管道,明明管道,符号链接,
Socket流,网络Socket,UNIX域Socket,以及其它更多.
例:lsof /path/to/file // 找出哪些进程在使用file文件
lsof -p 24685 // 查看pid为24685的进程引用了那些文件
lsof +D /usr/lib【lsof | grep '/usr/lib'】
--- // 加上+D参数,lsof会对指定目录进行递归查找,注意这个参数要比grep版本慢;慢是因为+D首先查找所有的文件,然后一次性输出
lsof -c foo【lsof | grep foo】 // 只列出以foo开头的进程打开的文件
lsof -i tcp // 列出所有TCP网络连接
lsof -i tcp:8080 // 查看8080端口被那个进程占用
lsof -i :25 // 列出使用端口为25的进程
rename 文件重命名 [rename 原字符串 新字符串 文件名] -- 文件名支持通配符
例:rename "20120912" "20120913" * // 将当前目录下的所有文件(含目录)的名称中第一次搜索到"20120912"子串,替换成"20120913"子串【非递归子目录】
xx_20120912_xx.test => xx_20120913_xx.test
20120912_xx.test => 20120913_xx.test
xx_20120912 => xx_20120913
20120912_xx.20120912 => 20120913_xx.20120912 // 后一个20120912不会被替换
file 查看文件的类型描述
例:file savespace.py 查看savespace.py的类型信息
fdisk 查看磁盘容量&块组分配情况
例:fdisk -l
df 显示磁盘的相关信息
例:df -h
以可读性较高方式显示磁盘信息
du 显示目录或文件的大小
例:du -h
以可读性较高方式显示目录和文件大小
例:du -s * | sort -n | tail
列出当前目录里最大的10个文件
例:du -sh 查看当前目录大小
chmod 变更文件或目录的权限
例:chmod g+w /home/game/dll/test.so
让文件或目录的所属群组对test.so文件具有可写权限
例:chmod u+x /home/game/dll/test.so
让文件或目录的拥有者对test.so文件具有可执行权限
例:chmod o+r /home/game/dll/test.so
让其他用户对test.so文件具有可读权限
chown 修改文件或目录所属用户
例:chown main:users * 将当前目录下的文件所属用户修改为main
---------------权限控制--------------
账户相对文件对象有三种不同的角色(三种角色互斥):
1. 拥有者
2. 组(不包括拥有者的同组成员)
3. 其它账户(除上面的组和拥有者之外的所有账户)
一个文件的权限被设计成三种行为: 1. 读(r) 2. 写(w) 3. 执行(x)
这样每一个文件对像都必须要定义一个拥有者及拥有组,
而对于三种角色和三种权限可以用十个字母的可读方式表示,如: drwxrwxrwx,当某些权限没有的时候,相应的字母用 - 代替。
把这个串分成4部份: d rwx rwx rwx
第一部分:如果为d则代表是目录,否则为 - 代表是文件。
第二部份: rwx 代表角色1(拥有者)的读、写、执行权限,没有相应权限用 - 代替字母。
第三部份: rwx 代表角色2(该组中不包括拥有者的账户)的读、写、执行权限,没有相应权限用 - 代替字母。
第四部份: rwx 代表角色3(其它账户)的读、写、执行权限,没有相应权限用 - 代替字母。
示例: -rw------- :只有所有者才有读和写的权限。
-rw-r--r-- :只有所有者才有读和写的权限,组群和其他人只有读的权限。
-rwxr-xr-x :只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限。
----------------------------------
chgrp 修改文件或目录所属群组
例:chgrp -v bin log2012.log 将log2012.log的所属组修改为bin
例:chgrp - R bin test6 将目录test6及其子目录下的所有文件的所属组修改为bin
cp 复制文件或目录
例:cp test.so /home/game/dll/test.so
将当前目录下的test.so文件拷贝到/home/game/dll下,并命名为test.so
find 查找文件或目录
例:find -maxdepth 10 -name resource.h
在当前目录及其以下10级内的子目录下,搜索resource.h文件
例:find . -name .svn -execdir svn update r12005 \;
在当前目录下查找含有.svn的文件或目录(递归子目录),并对该目录执行指定版本号svn更新
例:find /Users/mySource -name .svn -execdir svn update r12005 \;
在/Users/mySource目录下查找含有.svn的文件或目录(递归子目录),并对该目录执行指定版本号svn更新
mv 移动或重命名现有的文件或目录
例:mv resource.h ../test.h
将当前目录下resource.h移动到其上级目录,并重命名为test.h
rm 删除文件或目录
例:rm -f -r ./*.o 递归子目录,强制删除的所有.o文件
例:rm -rf {test1,test2,test3} 删除当前目录下的test1,test2,test3目录
mkdir 建立目录
例:mkdir test 在当前目录下建立test目录
例:mkdir {test1,test2,test3} 在当前目录下建立test1,test2,test3三个文件夹
例:mkdir -p test/folder 在当前目录下建立test目录,并在test中新建folder目录
例:mkdir -p test/.folder 在当前目录下建立test目录,并在test中新建.folder隐藏目录
rmdir 删除空目录
例:rmdir test 删除当前目录下的test空目录
例:rmdir {test1,test2,test3} 删除当前目录下的test1,test2,test3空目录
touch 新建空文件、修改文件或目录的时间戳(格式:YYMMDDhhmm)
例:touch NEWS README AUTHORS ChangeLog 新建名为NEWS、README、AUTHORS及ChangeLog四个空文件
例:touch .file.txt 新建名为.file.txt的隐藏空文件
例:touch * 修改当前目录下文件的时间戳
例:find ./ * -exec touch {} \; 递归修改当前目录下文件的时间戳(递归子目录)
例:find ./test/ * -exec touch {} \; 递归修改当前test目录下文件的时间戳(递归子目录)
例:touch -t 0812200135 cmd.txt 将文件cmd.txt的时间戳修改为2008.12.20 01:35
例:touch -t 1312251825 source 将目录source的时间戳修改为2013.12.25 18:25
tee 重定向输出
例:tee 只输出到标准输出
例:tee file.txt 输出到标准输出的同时,保存到file.txt中。如果文件不存在则创建;如果文件存在则覆盖
例:tee -a file.txt 输出到标准输出的同时,追加到file.txt中。如果文件不存在则创建;如果文件存在则追加
例:tee - 输出到标准输出两次
例:tee file1.txt file2.txt 输出到标准输出的同时,保存到file1.txt和file2.txt中。如果文件不存在则创建;如果文件存在则覆盖
tar 打包或解包文件
例:tar czvf xx.tar.gz *.txt
将当前目录下的txt文件打包到xx.tar.gz文件
例:tar czvf kov3_20140714.tar.gz kov3
将当前目录下的kov3文件夹打包到kov3_20140714.tar.gz文件中(会将整个kov3文件夹中的所有内容打包 [递归子目录] )
例:tar xzvf xx.tar.gz -C ./
将xx.tar.gz解包到当前目录
unzip 解压
例:unzip files.zip -d /home/main2/me 将files.zip解压到/home/main2/me目录中
ar 创建静态库.a文件
例:ar -rf test.a main.o fun.o // 将main.o fun.o打包成test.a
ar -t test.a // 显示库文件中有哪些目标文件,只显示文件名
ar -tv test.a //显示库文件中有哪些目标文件,显示文件名、时间、大小等详细信息
ranlib 对静态库的符号索引表进行更新
例:ranlib test.a // 更新test.a的符号索引表
当给静态库增加一个 .o 文件到静态库中,ar可直接将需要增加的 .o 文件简单的追加到静态库的末尾。
但是当我们使用这个库生成可执行文件时,链接程序提示找不到某个符号的错误。
这个问题的原因是:追加的 .o 文件直接加入到了库的末尾,却并没有更新库的符号索引表,ranlib就是用于更新符号索引表的命令。
md5sum 计算文件的md5码
例:md5sum test.a // 计算并输出test.a的MD5码值
2. 文件查看
cat 显示文件内容
例:cat -n main.c
带上行号显示main.c的内容
例:cat main.c | grep 67523115
只显示包含67523115字符串的行
tail 显示文件末尾内容
例:tail -f test.log
显示test.log文件的最后10行,同时继续监视文件内容有无变化,新增内容会继续输出,直到按下Ctrl+C组合键停止该命令
例:tail -30 test.log
显示test.log文件的最后30行
例:tail +30 test.log
显示test.log文件的从末尾到第30行的内容
head 显示文件起始内容
例:head test.log
显示test.log文件的前10行
例:head -15 test.log
显示test.log文件的前15行
more 分页显示文件内容
例:more main.c
--------------------------------------------
空格:查看下一页 向下方向键:查看下一行 q:退出
less 分页显示文件内容
例:less main.c
--------------------------------------------
空格/Page Down:查看下一页 Page Up:查看上一页
向下方向键:查看下一行 向上方向键:查看上一行 q:退出
3. @#@
@cmd 执行cmd命令执行,不打印出cmd命令内容
@echo off 关闭后续的命令内容打印,另外不打印出echo off
!$ !$是一个特殊的环境变量,代表了上一个命令的最后一个字符串
例:
$mkdir mydir
$mv mydir yourdir
$cd yourdir
可以改成:
$mkdir mydir
$mv !$ yourdir
$cd !$
-----------
!cmd 执行上一条cmd命令
-----------
被反引号`或$括起来的命令,shell会返回其执行结果
例:tmVar=`date`
例:tmVar=$date
-----------
man ascii 显示ascci码表
uname 显示系统版本信息
clear 清理屏幕
su 输入root密码,切换到管理员控制台;
结束后可输入exit命令回到原来用户状态
sudo 以其他身份来执行指定命令,预设身份为root
sudo !! 以root身份执行上一条命令
source /home/game/cmd.txt 执行cmd.txt中命令(该文件可以不是bash脚本文件)
echo $PATH 查看环境变量
w/who 查看登录用户
例:w // 查看当前登陆用户
例:who //另一种查看当前登陆用户的方式, 两者显示内容有区别
例:whoami //查看当前是用哪个用户名登陆的
passwd 修改当前用户密码
getent passwd 显示所有用户
sleep 3 暂停3秒
read myvar 等待用户输入,按回车后输入内容保存到myvar变量中
date 系统日期
例:date // 查看当前系统时间
例:date MMDDhhmm[ [CC]YY] [.ss] //设置系统时间为CCYY年MM月DD日hh时mm分ss秒
history 显示在当前shell下命令历史
ssh 登录(ssh 用户名@IP -p/#端口号)
例:ssh game@10.6.221.70 -p36000
例:ssh game@10.6.221.70#36000
mysql 登录(mysql -h 主机地址 -u 用户名 -p密码)
例:mysql -h 192.168.1.23 -u test -p12345abc //p与密码间没有空格
ulimit 限制不同种类的系统资源(模拟各种资源受限的环境)
-H 设置硬资源限制,一旦设置不能增加。 例:ulimit –Hs 64;限制硬资源,线程栈大小为 64K。
-S 设置软资源限制,设置后可以增加,但是不能超过硬资源设置。 例:ulimit –Sn 32;限制软资源,32 个文件描述符。
-a 显示当前所有的 limit 信息。 例:ulimit –a;显示当前所有的 limit 信息。
-c 最大的 core 文件的大小, 以 blocks 为单位。 例:ulimit –c unlimited; 对生成的 core 文件的大小不进行限制。
-d 进程最大的数据段的大小,以 Kbytes 为单位。 例:ulimit -d unlimited;对进程的数据段大小不进行限制。
-f 进程可以创建文件的最大值,以 blocks 为单位。 例:ulimit –f 2048;限制进程可以创建的最大文件大小为 2048 blocks。
-l 最大可加锁内存大小,以 Kbytes 为单位。 例:ulimit –l 32;限制最大可加锁内存大小为 32 Kbytes。
-m 最大内存大小,以 Kbytes 为单位。 例:ulimit –m unlimited;对最大内存不进行限制。
-n 可以打开最大文件描述符的数量。 例:ulimit –n 128;限制最大可以使用 128 个文件描述符。
-p 管道缓冲区的大小,以 Kbytes 为单位。 例:ulimit –p 512;限制管道缓冲区的大小为 512 Kbytes。
-s 线程栈大小,以 Kbytes 为单位。 例:ulimit –s 512;限制线程栈的大小为 51 Kbytes。
-t 最大的 CPU 占用时间,以秒为单位。 例:ulimit -t unlimited;对最大的 CPU 占用时间不进行限制。
-u 用户最大可用的进程数。 例:ulimit –u 64;限制用户最多可以使用 64 个进程。
-v 进程最大可用的虚拟内存,以 Kbytes 为单位。 例:ulimit –v 200000;限制最大可用的虚拟内存为 200000 Kbytes。
1. 在用户的启动脚本中
如果用户使用的是bash,就可以在用户的目录下的 .bashrc 文件中,加入 ulimit –u 64,来限制用户最多可以使用64个进程。
此外,可以在与 .bashrc功能相当的启动脚本中加入ulimt。
2. 在应用程序的启动脚本中
如果用户要对某个应用程序myapp 进行限制,可以写一个简单的脚本startmyapp。
ulimit –s 512
myapp
以后只要通过脚本 startmyapp 来启动应用程序,就可以限制应用程序 myapp 的线程栈大小为512K。
3. 直接在控制台输入
user_me@chen-10-12-131-28:~> ulimit –p 256 限制管道的缓冲区为 256K。
* 有效范围
ulimit 作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?
事实上,ulimit 限制的是当前 shell 进程以及其派生的子进程。
举例来说,如果用户同时运行了两个shell 终端进程,只在其中一个环境中执行了 ulimit –s 100,
则该shell进程里创建文件的大小收到相应的限制,而同时另一个shell 终端包括其上运行的子程序都不会受其影响。
4. 进程操作
top 动态显示系统当前的进程和其它状况信息
--------------------------------------------
h:打印出帮助信息 空格:立即刷新 k:终止掉某个进程 q:退出top
free 查看内存使用情况
例:free // 查看当前内存使用状况, 单位 byte
例:free -m //查看当前内存使用状况, 单位 MB, 参数还可以是 -g, -k 等
ps 进程查看命令
例:ps -ux 查看当前用户运行进程信息
例:ps -aux //查看当前所有用户运行的进程
例:ps -elf //另一种常用的查看所有用户运行进程的指令
例:ps -ef | grep wnz | grep -v "grep" // 显示含有wnz字符串且不含有grep字符串的进程信息
例:ps axwef //以树状列出进程及子进程
例:ps aux | sort -nk +4 | tail 列出头十个最耗内存的进程
pidof 从进程名查询pid
例:pidof com.tencent.tmgp.pubgm 查询名为com.tencent.tmgp.pubgm进程的pid
kill 结束指定进程
例:kill -9 352 结束PID为352的进程
例:killall gamesvr // 终止所有名为gamesvr的进程
例:killall -9 gamesvr // 强制终止所有名为gamesvr的进程
pmap 查看内存映像信息
例:pmap 13455 // 查看进程ID为13455的内存映像信息(含内存使用情况,加载的so等)
5. 网络
ifconfig 显示网络接口以及相应的IP地址
iwconfig 显示无线网络接口
route 显示路由表
rz 从本地上传文件到服务器 SecureCRT命令
例:rz -bey 从弹出传文件对话框,选择文件进行上传即可
sz 从服务器下载文件到本地 SecureCRT命令
例:sz -bey file1.txt ../test/file2.txt ../test2/* 下载file1.txt、file2.txt以及test2目录中的所有文件(不含子目录)
rz上传于sz下载默认路径设置:
scp 跨服务器复制文件或目录
例:scp -P 3000 user@192.168.1.22:/root/test.tar.gz /home/test.tar.gz 获取远程服务器上的文件到本地
例:scp -r user@192.168.1.22#3000:/root/testDir /home/testDir 获取远程服务器上的目录到本地
例:scp /home/test.tar.gz user@192.168.1.22#3000:/root/test.tar.gz 将本地文件上传到远程服务器上
例:scp -r /home/testDir user@192.168.1.22#3000:/root/testDir 将本地目录上传到远程服务器上
---------------------
-P 指定ssh端口号
-r 递归复制(即复制该目录下面的文件和目录)
-v 和大多数 linux 命令中的 -v 意思一样 , 用来显示进度 . 可以用来查看连接 , 认证 , 或是配置错误 .
-C 使能压缩选项 .
-4 强行使用 IPV4 地址 .
-6 强行使用 IPV6 地址 .
---------------------
netstat
例:netstat –tlnp 列出本机进程监听的端口号
例:netstat -anop 可以显示侦听端口号的进程
例:netstat -anop | grep 10.6.221.70 当前主机连向10.6.221.70的信息
例:netstat -anop | grep 9005 当前主机连向9005端口的信息
tcpdump
例:tcpdump tcp port 7012 and host 172.25.34.88 -i eth1 -n 用tcpdump解析tcp连接建立和释放
1. 14:44:52.174122 IP 172.25.38.145.49563 > 172.25.34.88.7012: S 1986599379:1986599379(0) win 5840
2. 14:44:52.174249 IP 172.25.34.88.7012 > 172.25.38.145.49563: S 4294961892:4294961892(0) ack 1986599380 win 5792
3. 14:44:52.174228 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 1 win 1460
4. 14:44:52.174433 IP 172.25.38.145.49563 > 172.25.34.88.7012: P 1:109(108) ack 1 win 1460
5. 14:44:52.174443 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 109 win 1448
6. 14:44:52.186891 IP 172.25.34.88.7012 > 172.25.38.145.49563: P 1:857(856) ack 109 win 1448
7. 14:44:52.186914 IP 172.25.34.88.7012 > 172.25.38.145.49563: F 857:857(0) ack 109 win 1448
8. 14:44:52.187054 IP 172.25.38.145.49563 > 172.25.34.88.7012: . ack 857 win 1888
9. 14:44:52.195347 IP 172.25.38.145.49563 > 172.25.34.88.7012: F 109:109(0) ack 858 win 1888
10. 14:44:52.195355 IP 172.25.34.88.7012 > 172.25.38.145.49563: . ack 110 win 1448
每一行中间都有这个包所携带的标志:
S=SYN,发起连接标志。
P=PUSH,传送数据标志。
F=FIN,关闭连接标志。
. ack:表示响应确认包。
RST=RESET,异常关闭连接。
抓包的过程解析:
第1行:14:44:52,从172.25.38.145(client)的临时端口49563向172.25.34.88(server)的7012监听端口发起连接,
client初始包序号为1986599379,滑动窗口大小为5840字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),
mss大小为1460(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。
第2行:server响应连接,同时带上第一个包的ack信息,为client端的初始包序号加1,
即1986599380,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。
Server端的初始包序号为4294961892,mss也是1460。
第3行:client再次确认,tcp连接三次握手完成。
第4行:client发请求包,包长度108字节。
第5行:server响应ack。
第6行:server回包,包长度856字节。
第7行:client响应ack。
第8行:client发起关闭连接请求。
第9行:server响应ack,并且也发送FIN标志关闭。
第10行:客户端响应ack,关闭连接的四次握手完成。
--------------------------------------------------------------
指定源地址和目的地址
tcpdump -i eth1 src host 172.25.38.145
tcpdump -i eth1 dst host 172.25.34.88
>> tcpdump小结
6. 文本处理
grep 正则表达式文本搜索工具 --管道命令
参数说明:
-zz // 显示匹配行周围的上下zz行
-n // 打印该行所在的行数
-c // 打印出匹配到的总行数
-i // 忽略大小写
-v // 反检索,只显示不匹配的行
-a // 将二进制档案视为文本文件搜寻
-b // 搜索统计
-r // 递归目录搜索
-h // 在每个符合样式行前加上符合的文件名称,但不显示文件路径
-H // 在每个符合样式行前加上符合的文件名称,若有路径会显示路径
-l // 不显示平常一般的输出结果,只显示符合的文件名称
-L // 不显示平常一般的输出结果,反而显示出没有符合的文件名称
-f // 使用样式文件(一行一个样式)进行搜索
-w // 将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出
-x // 将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出
正则表达式语法:
^ // 匹配行首
$ // 匹配行尾
* // 匹配任意字符
. // 匹配一个非换行字符
[] // 匹配指定范围的字符
[^] // 匹配不在指定范围的字符
\(..\) // 标记匹配字符,如'\(love\)',love被标记为1
\< // 匹配单词的开始
\> // 匹配单词的结尾
x\{m\} // 重复字符x,m次
x\{m,\} // 重复字符x,至少m次
x\{m,n\} // 重复字符x,m到n次
\w // 匹配文字和数字字符,等价于[A-Za-z0-9]
\W // 匹配一个或多个非单词字符,如点号句号等
\b // 单词锁定符 如: \bgrep\b只匹配grep
例:grep "CRoom::OnUserEnterRoom" * // 当前目录下,在所有文件中搜索CRoom::OnUserEnterRoom字符串
egrep grep扩展命令
egrep "(DoEndAttack|SyncAIAttack)" room96.log | grep 10102002 | head -100 // 打印出当前目录下room96.log中包含“DoEndAttack”、“SyncAIAttack”或“10102002”字符串的前100行