个人Linux学习持续更新中
提权命令
目录下所有,所有权限
chmod 777 [-R] [path]
执行权限
chmod +x [-R] [path]
识别命令
命令可以是下面四种形式之一:
1. 是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 属于这一类的程序,可以编译成二进制文件,诸如用 C 和 C++语言写成的程序, 也可以是由脚本语言写成的程序,比如说 shell,perl,python,ruby,等等。
2. 是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,cd 命令,就是一个 shell 内部命令。
3. 是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 在后续的章节里,我们将讨论配置环境变量以及书写 shell 函数。但是现在, 仅仅意识到它们的存在就可以了。
4. 是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。
type
显示命令的类型
type 命令是 shell 内部命令,它会显示命令的类别,给出一个特定的命令名(做为参数)。 它像这样工作:
type command
which
显示一个可执行程序的位置
该命令只对可执行程序有效
对程序别名和内部命令无效(例如cd)
help
得到 shell 内部命令的帮助文档
help 接shell内部命令
--help
显示用法信息
ls --help
man
显示程序手册页
man ls
man 5 passwd 指定章节
手册结构
章节 | 内容 |
---|---|
1 | 用户命令 |
2 | 程序接口内核系统调用 |
3 | C 库函数程序接口 |
4 | 特殊文件,比如说设备结点和驱动程序 |
5 | 文件格式 |
6 | 游戏娱乐,如屏幕保护程序 |
7 | 其他方面 |
8 | 系统管理员命令 |
apropos
显示适当的命令 (搜索命令)
$ apropos floppy
create_floppy_devices (8) - udev callout to create all possible
字段一: 手册页名字
字段二: 章节
man -k [program] 功能同此一样
whatis
显示非常简洁的命令说明
whatis cp
whereis
查看命令的目录
whereis iptables
info
显示程序info条目
命令程序手册的替代物,页面是超链接的形式, 属于GNU项目的“coreutils“包
info文件是树型结构,分化为各个节点,每一个包含一个题目
info ls
info 内命令
命令 | 行为 |
---|---|
? | 显示命令帮助 |
PgUp or Backspace | 显示上一页 |
PgDn or Space | 显示下一页 |
n | 下一个 - 显示下一个结点 |
p | 上一个 - 显示上一个结点 |
u | Up - 显示当前所显示结点的父结点,通常是个菜单 |
Enter | 激活光标位置下的超级链接 |
q | 退出 |
alias
创建自定义的命令
多个命令之间用‘;’ 号隔开
查看自定义命令是否已定义
alias 不带参数,查看所有定义在系统环境变量中的别名
type test
test is a shell builtin (test已经在shell内构建)
type as
bash: type: as: not found (as尚未被定义)
创建别名
结构: alias [name]='[string]'
示例:
alias foo='cd /usr; ls; cd -'
(可以使用 type查看别名)
删除别名
unalias [name]
I/O重定向
重定向标准输出
ls重定向默认将内容输出到屏幕文件,可以使用
>
重定向符号将内容重定向输出到其它文件
正常显示,重定向是重定向的`标准输出`
ls -l /usr/bin > ls_output.txt
错误目录,输出在屏幕上,是因为此输出到了`标准错误`
ls -l /aaausr/bin > ls_output.txt
>
可以快速删除一个文件内容或者创建一个新的文件
>>
重定向可以将内容新增到文件中,而不从开头重写文件
重定向标准错误
重定向标准错误没有专用的操作符。
但重定向文件有描述符, 0 1 2 表示输入,输出,错误 三种状态
输出标准错误(在重定向符号前加上文件描述符即可)
ls -l 2> ls_errOutput.txt
重定向标准输出和标准错误到同一个文件
传统方法
首先重定向标准输出到文件,然后重定向文件描述符2到文件描述符1,写法2>&1, 标准错误必须在标准输出之后否则不起作用
ls -l /bin/usr > ls-output.txt 2>&1
bash新方法
使用`&>`重定向标准输出和标准错误到文件中
ls -l /bin/usr &> ls-output.txt
处理不需要的输出
系统提供了处理不需要的输出的解决方法,将一个输出重定向到
/dev/null
, 这个文件时系统设备,叫做位存储桶,它可以接受输入,并对输入不做任何处理。
为了隐瞒命令错误信息,可以:
ls -l /bin/usr 2> /dev/null
重定向标准输入
cat-连接文件
cat命令读取一个或多个文件,然后复制到标准输出
cat 多数情况下 类似于dos命令中的type ,用cat显示文件而没有分页
cat [file]
cat可以连接拼接多个文件
cat [file1] [file2]
cat movie.mpeg.0* > movie.mpeg
cat 不跟参数时,是在等待输入。因为是将标准输入转到了标准输出
输入内容时 会出现重复列。 ctrl-d 结束输入
cat
cat 快速创建一个文件并输入内容到其中
可以在控制台输入内容 并保存
cat > catCache.txt
<
重定向操作符,重定向标准输入
cat的操作选项
管道操作符
管道线
命令可以从标准输入读取数据,然后把数据送到标准输出, 命令的这种能力被一个shell特性利用
这个特性就是管道线,使用管道操作符"|" ,一个命令的标准输出可以管道到另一个命令的标准输入
command1 | command2
less命令接受任何标准输出,可以:
ls -l /usr/bin | less
过滤器
管道线经常用来对数据完成复杂的操作,有时需要将多个命令联系在一起做成一条管道线
以这种方式使用的命令被称为过滤器。过滤器接受输入,以某种方式改变后输出.
sort 过滤器
将/bin /usr/bin 的可执行程序联合在一起排序后,在输出
ls /bin /usr/bin | sort | less
uniq-报道或忽略重复行
uniq 从标准输入或单个文件中接受数据有序列表,默认情况下从数据列表中删除重复行
添加uniq到管道线中,确保/usr/bin和/bin中不包含重复可执行程序
ls /bin /usr/bin | sort | uniq | less
如果想看到重复的数据列表 加上 -d 参数 (只显示重复列)
ls /bin /usr/bin | sort | uniq -d | less
<h4 id="wc">wc-打印行,字和字节数</h4>
wc [file]
行,字数,字节数
wc -l [file]
只输出行数
<h4 id="grep">grep - 打印匹配行</h4>
用来找到文件中的匹配行
grep pattern [file]
找到命令中zip的不重复项
ls /bin /usr/bin |sort |uniq| grep zip
grep -i 忽略大小写
grep -v 只打印不匹配的项
<h4 id="head/tail">head/tail - 打印文件的头部分/尾部分</h4>
默认 head 和 tail 打印文件的前十行后十行
-n 参数指定打印的行数
head /tail -n 5 [file]
应用在管道线中
ls /bin |tail -n 5
-f 允许实时检测文件变动 并展示在屏幕上
tail -f /var/log/log.txt
<h4 id="tee">tee -从stdin读取数据,并同时输出到stdout</h4>
tee命令是安装到数据管道,用于从标准输入读入数据,并输出到标准输出或一个或多个文件中
可以在管道线中的某个环节进行内容捕获
ls /usr/bin |tee ls.txt| grep zip
<h2 id="基础操作">基础操作</h2>
<h4 id="cp">cp</h4>
复制命令
选项 | 意义 |
---|---|
-a, --archive | 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操作文件的默认属性。 |
-i, --interactive | 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重写文件。 |
-r, --recursive | 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选项)。 |
-u, --update | 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在的文件。 |
-v, --verbose | 显示翔实的命令操作信息 |
dpkg
选项 | 意义 |
---|---|
-reconfigure [packeoption] | 通过apt-get install 的方式安装的软件包,通过此方式可以修复 |
<h4 id="mv">mv</h4>
移动命令
选项 | 意义 |
---|---|
-i --interactive | 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认重写文件内容。 |
-u --update | 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容。 |
-v --verbose | 当操作 mv 命令时,显示翔实的操作信息。 |
<h4 id="rm">rm</h4>
删除文件和目录
选项 | 意义 |
---|---|
-i, --interactive | 在删除已存在的文件前,提示用户确认信息。 如果不指定这个选项,rm 会默默地删除文件 |
-r, --recursive | 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项。 |
-f, --force | 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项。 |
-v, --verbose | 在执行 rm 命令时,显示翔实的操作信息。 |
<h4 id="ln">ln</h4>
可创建硬链接和符号链接(软连接)
ls -i 查看文件或文件夹inode值
硬链接
ln oldFile newFile
软链接:
ln -s item link
查找有相同的inode值的
find / -inum 1114
查找在路径 /home 下的文件 data.txt 的软链接
find /home -lname data.txt
查看路径 /home 有相同 inode 的所有硬链接
find /home -samefile /home/harris/debug/test3/old.file
列出路径 /home/harris/debug/ 下的所有软链接文件
find /home/harris/debug/ -type l -ls
查看磁盘分区 /dev/sda7 上的 inode 值
dumpe2fs -h /dev/sda7 | grep "Inode size"
tune2fs -l /dev/sda7 | grep "Inode size"
查看文件系统
df -i --print-type
<h4 id="ls">ls</h4>
选项 | 长选项 | 描述 |
---|---|---|
-a | --all | 列出所有文件,包含有(. .. ) |
-A | --all | 列出所有文件,不包含(. ..) |
-d | --directory | |
-f | --classify | 是目录时后缀加上/ |
-h | --human-readable | 显示大小时有单位,可读性强 |
-r | -reverse | 以逆序排列顺序展示 |
-S | 输出结果按照文件大小排序 | |
-t | 按照事件顺序排序 |
<h4 id="du">du</h4>
查看文件夹及其文件大小
字段 | 含义 |
---|---|
-a | 所有文件或子目录内存使用情况 |
-b | 以byte为单位 |
-D | 显示指定符号连接的源文件大小 |
-c | 除了显示目录或文件的大小外,同时也显示所有目录或文件的总和 |
-h | 以K,M,G为单位,提高信息的可读性 |
-H | 但是K,M,G是以1000为换算单位,而不是以1024为换算单位 |
-k | 以1024bytes为单位 |
-l | 重复计算硬件连接的文件 |
-L | 显示选项中所指定符号连接的源文件大小 |
-m | 以1MB为单位 |
-s | 仅显示总计,即当前目录的大小 |
-S | 显示每个目录的大小时,并不含其子目录的大小 |
-x | 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过 |
-X | 在<文件>指定目录或文件 |
-exclude | 略过指定的目录或文件 |
-max-depth | 超过指定层数的目录后,予以忽略 |
<h4 id="file">file</h4>
查看文件类型
file filename
<h4 id="less">less</h4>
预览文件内容
less filename
进阶操作
开机启动项设置
可先将脚本复制或者软连接到/etc/init.d/目录下,
然后用:update-rc.d xxx defaults NN命令(NN为启动顺序),
注意如果脚本需要用到网络,则NN需设置一个比较大的数字,如99。
1) 将你的启动脚本复制到 /etc/init.d目录下
以下假设你的脚本文件名为 test。
2) 设置脚本文件的权限
$ sudo chmod 755 /etc/init.d/test
3) 执行如下命令将脚本放到启动脚本中去:
$ cd /etc/init.d
$ sudo update-rc.d test defaults 95
linux概念
shell展开
字符展开
echo * 展开当前目录下所有
波浪线展开
echo ~ 家目录
算术表达式展开
echo $((expression)) 算术表达式展开
花括号展开
字符串展开
echo Front-{A,B,C}-Back
Front-A-Back Front-B-Back Front-C-Back
数字展开
echo Number_{1..5}
Number_1 Number_2 Number_3 Number_4 Number_5
倒序展开
echo a{g..a}
ag af ae ad ac ab aa
花括号嵌套
echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b
应用,创建两年月份的文件夹
mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12}
参数展开
用户名
echo $USER
djl
变量名查看
printenv | less
命令替换
命令替换允许我们把一个命令的输出作为一个展开模式来使用
echo $(ls)
ls -l $(which cp)
-rwxr-xr-x 1 root root 133336 3月 1 16:33 /bin/cp
参数也可以使用管道线
file $(ls /usr/bin/* | grep zip)
算术操作符
操作符 | 说明 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除(但是记住,因为展开只是支持整数除法,所以结果是整数。) |
% | 取余,只是简单的意味着,“余数” |
** | 取幂 |
shell引用
shell的引用机制可以避免一些不必须要的展开
$1 没有定义变量,shell会自动解析为空字符串
echo The total is $100.00
The total is 00.00
双引号
使用双引号,shell使用的特殊字符都讲失效,被当做普通字符看待。
例外: $ \ ` 三个特殊字符例外
意味着 单词分割,路径名展开,波浪线展开,都将失效,
然而 参数展开,算术展开,命令替换仍然执行
使用双引号可以处理含有空格的文件名的文件
单引号
禁止所有的展开,包括参数展开,算术展开,命令替换。
转义字符
使用转义字符消除特殊名字的影响
在单引号中 \ 失去意义
echo -e 可以解释转义字符
转义序列 | 含义 |
---|---|
\a | 响铃(”警告”-导致计算机嘟嘟响) |
\b | 退格符 |
\n | 新的一行。在类 Unix 系统中,产生换行。 |
\r | 回车符 |
\t | 制表符 |
长格式解析
-rw-r--r-- 1 root root 1186219 2007-04-03 11:05 kubuntu-leaflet.png
字段 | 含义 |
---|---|
-rw-r--r-- | 文件访问权限 |
1 | 文件的硬链接数目 |
root | 文件所属用户 |
root | 文件所属用户组 |
1186219 | 文件大小(默认字节) |
2007-04-03 | 文件上次修改日期 |
软链接
又名符号链接(symlink)
lrwxrwxrwx 1 root root 11 2007-08-11 07:34 libc.so.6 -> libc-2.6.so
硬链接
通配符相关
通配符
通配符 | 描述 |
---|---|
* | 匹配任意多个字符(包括零个或一个) |
? | 匹配任意一个字符(不包括零个) |
[characters] | 匹配任意一个属于字符集中的字符 |
[!characters] | 匹配任意一个不是字符集中的字符 |
[[:class:]] | 匹配任意一个属于指定字符类中的字符 |
字符类
字符类 | 描述 |
---|---|
[:alnum:] | 匹配任意一个字母或数字 |
[:alpha:] | 匹配任意一个字母 |
[:digit:] | 匹配任意一个数字 |
[:lower:] | 匹配任意一个小写字母 |
[:upper:] | 匹配任意一个大写字母 |
通配符范例
模式 | 匹配对象 |
---|---|
* | 所有文件 |
g* | 文件名以“g”开头的文件 |
b*.txt | 以"b"开头,中间有零个或任意多个字符,并以".txt"结尾的文件 |
Data??? | 以“Data”开头,其后紧接着3个字符的文件 |
[abc]* | 文件名以"a","b",或"c"开头的文件 |
BACKUP.[0-9][0-9][0-9] | 以"BACKUP."开头,并紧接着3个数字的文件 |
[[:upper:]]* | 以大写字母开头的文件 |
[![:digit:]]* | 不以数字开头的文件 |
*[[:lower:]123] | 文件名以小写字母结尾,或以 “1”,“2”,或 “3” 结尾的文件 |
linux VFS
Linux 有着极其丰富的文件系统,大体上可分如下几类:
网络文件系统,如 nfs、cifs 等;
磁盘文件系统,如 ext4、ext3 等;
特殊文件系统,如 proc、sysfs、ramfs、tmpfs 等。
linux目录结构
目录 | 描述 |
---|---|
/ | 根目录 |
/bin | 包含系统启动和运行所必须的二进制程序。 |
/boot | 包含 Linux 内核,最初的 RAM 磁盘映像(系统启动时,由驱动程序所需),和 启动加载程序。 有趣的文件: /boot/grub/grub.conf or menu.lst, 被用来配置启动加载程序。 /boot/vmlinuz,Linux 内核。 |
/dev | 这是一个包含设备结点的特殊目录。“一切都是文件”,也使用于设备。 在这个目录里,内核维护着它支持的设备。 |
/etc | 这个目录包含所有系统层面的配置文件。它也包含一系列的 shell 脚本, 在系统启动时,这些脚本会运行每个系统服务。这个目录中的任何文件应该是可读的文本文件。 有意思的文件:虽然/etc 目录中的任何文件都有趣,但这里只列出了一些我一直喜欢的文件: /etc/crontab, 定义自动运行的任务。 /etc/fstab,包含存储设备的列表,以及与他们相关的挂载点。 /etc/passwd,包含用户帐号列表。 |
/home | 通常的配置环境下,系统会在/home 下,给每个用户分配一个目录。普通只能 在他们自己的目录下创建文件。这个限制保护系统免受错误的用户活动破坏。 |
/lib | 包含核心系统程序所需的库文件。这些文件与 Windows 中的动态链接库相似。 |
/lost+found | 每个使用 Linux 文件系统的格式化分区或设备,例如 ext3文件系统, 都会有这个目录。当部分恢复一个损坏的文件系统时,会用到这个目录。除非文件系统 真正的损坏了,那么这个目录会是个空目录。 |
/media | 在现在的 Linux 系统中,/media 目录会包含可移除媒体设备的挂载点, 例如 USB 驱动器,CD-ROMs 等等。这些设备连接到计算机之后,会自动地挂载到这个目录结点下。 |
/mnt | 在早些的 Linux 系统中,/mnt 目录包含可移除设备的挂载点。 |
/opt | 这个/opt 目录被用来安装“可选的”软件。这个主要用来存储可能 安装在系统中的商业软件产品。 |
/proc | 这个/proc 目录很特殊。从存储在硬盘上的文件的意义上说,它不是真正的文件系统。 反而,它是一个由 Linux 内核维护的虚拟文件系统。它所包含的文件是内核的窥视孔。这些文件是可读的, 它们会告诉你内核是怎样监管计算机的。 |
/root | root 帐户的家目录。 |
/sbin | 这个目录包含“系统”二进制文件。它们是完成重大系统任务的程序,通常为超级用户保留。 |
/tmp | 这个/tmp 目录,是用来存储由各种程序创建的临时文件的地方。一些配置,导致系统每次 重新启动时,都会清空这个目录。 |
/usr | 在 Linux 系统中,/usr 目录可能是最大的一个。它包含普通用户所需要的所有程序和文件。 |
/usr/bin | /usr/bin 目录包含系统安装的可执行程序。通常,这个目录会包含许多程序。 |
/usr/lib | 包含由/usr/bin 目录中的程序所用的共享库。 |
/usr/local | 这个/usr/local 目录,是非系统发行版自带,却打算让系统使用的程序的安装目录。 通常,由源码编译的程序会安装在/usr/local/bin 目录下。新安装的 Linux 系统中,会存在这个目录, 但却是空目录,直到系统管理员放些东西到它里面。 |
/usr/sbin | 包含许多系统管理程序。 |
//usr/share | /usr/share 目录包含许多由/usr/bin 目录中的程序使用的共享数据。 其中包括像默认的配置文件,图标,桌面背景,音频文件等等。 |
/usr/share/doc | 大多数安装在系统中的软件包会包含一些文档。在/usr/share/doc 目录下, 我们可以找到按照软件包分类的文档。 |
/var | 除了/tmp 和/home 目录之外,相对来说,目前我们看到的目录是静态的,这是说, 它们的内容不会改变。/var 目录是可能需要改动的文件存储的地方。各种数据库,假脱机文件, 用户邮件等等,都驻扎在这里。 |
/var/log | 这个/var/log 目录包含日志文件,各种系统活动的记录。这些文件非常重要,并且 应该时时监测它们。其中最重要的一个文件是/var/log/messages。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。 |
Linux日志系统结构
文件名 | 描述 |
---|---|
alternatives.log | 更新替代信息都记录在这个文件中 |
apport.log | 应用程序崩溃记录 |
/var/log/apt | 用apt-get安装卸载软件的信息 |
/var/log/alternatives.log | -更新替代信息都记录在这个文件中 |
/var/log/apport.log | -应用程序崩溃记录 |
/var/log/apt/ | -用apt-get安装卸载软件的信息 |
/var/log/auth.log | -登录认证log |
/var/log/boot.log | -包含系统启动时的日志。 |
/var/log/btmp | -记录所有失败启动信息 |
/var/log/Consolekit | - 记录控制台信息 |
/var/log/cpus | - 涉及所有打印信息的日志 |
/var/log/dist-upgrade | - dist-upgrade这种更新方式的信息 |
/var/log/dmesg | -包含内核缓冲信息(kernel ringbuffer)。在系统启动时,显示屏幕上的与硬件有关的信息 |
/var/log/dpkg.log | - 包括安装或dpkg命令清除软件包的日志。 |
/var/log/faillog | - 包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。 |
/var/log/fontconfig.log | -与字体配置有关的log。 |
/var/log/fsck | - 文件系统日志 |
/var/log/faillog | -包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。 |
/var/log/hp/ | |
/var/log/install/ | |
/var/log/jokey.log | |
/var/log/kern.log | - 包含内核产生的日志,有助于在定制内核时解决问题。 |
/var/log/lastlog | - 记录所有用户的最近信息。这不是一个ASCII文件,因此需要用lastlog命令查看内容。 |
/var/log/faillog | - 包含用户登录失败信息。此外,错误登录命令也会记录在本文件中。 |
/var/log/lightdm/ | |
/var/log/mail/ | - 这个子目录包含邮件服务器的额外日志。 |
/var/log/mail.err | -类似于上面的 |
/var/log/news/ | |
/var/log/pm-powersave.log | |
/var/log/samba/ | - 包含由samba存储的信息。 |
/var/log/syss.log | |
/var/log/speech-dispacher/ | |
/var/log/udev | |
/var/log/ufw.log | |
/var/log/upstart/ | |
/var/log/uattended-upgrades/ | |
/var/log/wtmp | - 包含登录信息。使用wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等。 |
/var/log/xorg.*.log | - 来自X的日志信息。 |