linux 常用命令:操作文件,重定向,展开和引用
权限管理,进程,软件包管理
键盘操作
存储,网络,查找文件,归档和备份

什么是shell

shell 就是一个程序,它接受从键盘输入的命令,然后把命令传递给操作系统去执行

shell是你(用户)和Linux(或者更准确的说,是你和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由shell先解释然后传给Linux内核。
shell 是一个命令语言解释器(command-language interpreter)。拥有自己内建的 shell 命令集。此外,shell也能被系统中其他有效的Linux 实用程序和应用程序(utilities and application programs)所调用。

文件系统中的跳转

  • 根目录
    /
  • 家目录
  • 绝对路径和相对路径
    绝对路径从根目录开始,直到它的目的地,而相对路径开始于工作目录
  • 快捷键
    快捷键 说明
    cd 更改工作目录到家目录
    cd - 更改工作目录到先前的工作目录
    cd ~username 更改工作目录到用户目录如cd ~monkeyjerry更改工作目录到用户monkeyjerry的家目录

探究操作系统

ls、file、less、linux系统中的目录

ls的乐趣

  • ls

  • ls /usr

  • ls ~ /usr

  • ls -l

    drwxr-xr-x   8 tina  staff   256B  7 10 19:22 Monkeyjerry
    
  • 其他

    选项 长选项 描述
    -a --all 列出所有文件,甚至包括文件名以圆点开头的默认会被隐藏的隐藏文件
    -d --directory 通常,如果指定了目录名,ls 命令会列出这个目录中的内容,而不是目录本身。把这个选项与 -l 选项结合使用,可以看到所指定目录的详细信息,而不是目录中的内容。
    -F --classify 这个选项会在每个所列出的名字后面加上一个指示符。例如,如果名字是目录名,则会加上一个’/’ 字符。
    -h --human-readable 当以长格式列出时,以人们可读的格式,而不是以字节数来显示文件的大小。
    -l 以长格式显示结果。
    -r --reverse 以相反的顺序来显示结果。通常,ls 命令的输出结果按照字母升序排列。
    -S 命令输出结果按照文件大小来排序。
    -t 按照修改时间来排序。

stat

是一款加大马力的 ls 命令版本。这个 stat 命令会展示系统对某个文件及其属性所知道的所有信息

file

  • file filename

less和more

  • less filename
    如果文件内容多于一页,那么我们可以上下滚动文件。按下“q”键,退出 less 程序
  • 几个常用命令
    • Page UP or b : 向上翻滚一页
    • Page Down or space : 向下翻滚一页
    • UP Arrow : 向上翻滚一行
    • Down Arrow : 向下翻滚一行
    • G : 移动到最后一行
    • 1G or g : 移动到开头一行
    • /charaters : 向前查找指定的字符串
    • n : 向前查找下一个出现的字符串,这个字符串是之前所指定查找的
    • h : 显示帮助屏幕
    • q : 退出 less 程序

    less 属于 “页面调度器” 类程序,这些程序允许以逐页方式轻松浏览长文本文档。more 程序只能向前翻页,而 less 程序允许前后翻页,此外还有很多其它的特性。

linux系统中的目录

目录 评论
/ 根目录,万物起源。
/bin 包含系统启动和运行所必须的二进制程序。
/boot 包含 Linux 内核,最初的 RMA 磁盘映像(系统启动时,由驱动程序所需),和 启动加载程序。有趣的文件: /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。注意,为了系统安全,在一些系统中, 你必须是超级用户才能查看这些日志文件。

操作文件和目录

cp mv mkdir rm ln

  • 通配符
    参考通配符
    类似正则,注意字符类的区别
通配符 意义
* 匹配任意多个字符(包括零个或一个)
? 匹配任意一个字符(不包括零个)
[characters] 匹配任意一个属于字符集中的字符
[!characters] 匹配任意一个不是字符集中的字符
[[:class:]] 匹配任意一个属于指定字符类中的字符(如下表格字符类)

你可能遇到过 [A-Z] 或 [a-z] 形式的字符范围表示法。这些都是传统的 Unix 表示法,并且在早期的 Linux版本中仍有效。虽然它们仍然起作用,但是你必须小心地使用它们,因为它们不会产生你期望的输出结果果,除非你合理地配置它们。从现在开始,你应该避免使用它们,并且用字符类来代替它们。

字符类 意义
[:alnum:] 匹配任意一个字母或数字
[:alpha:] 匹配任意一个字母
[:digit:] 匹配任意一个数字
[:lower:] 匹配任意一个小写字母
[:upper] 匹配任意一个大写字母
  • cp mv rm
    -r, --recursive选项 : 递归的
    
  • mkdir
  • ln
    • 创建硬链接:ln file link
      • 一个硬链接不能关联与链接本身不在同一个磁盘分区上的文件
      • 一个硬链接不能关联一个目录
    • 创建软链接:ln -s item link(其中item可以是一个文件或是一个目录)

使用命令

type which man apropos info whatis alias

  • readme

    许多安装在你系统中的软件,都有自己的文档文件,这些文件位于/usr/share/doc 目录下。这
    些文件大多数是以文本文件的形式存储的,可用 less 阅读器来浏览。一些文件是 HTML 格式,
    可用网页浏览器来阅读。我们可能遇到许多以 “.gz” 结尾的文件。这表示 gzip 压缩程序已经压
    缩了这些文件。gzip 软件包包括一个特殊的 less 版本,叫做 zless,zless 可以显示由 gzip 压缩
    的文本文件的内容。

  • command1;command2;command3

    cd /usr;ls;cd -
    
  • alias unalias

    alias towork="~/monkeyjerry/work"
    type towork
    towork
    
    unalias towork
    type towork
    

重定向

标准输入、输出和错误,shell 内部分别将其称为文件描述符 0、1 和 2

标准输出重定向

  • >
ls -l /usr/bin > output.txt
ls -l output.txt
less output.txt
ls -l /bin/usr > output.txt
  • >创建一个空文件
> output.txt
  • >>追加
ls -l /usr/bin >> output.txt

标准错误重定向

  • 2>
ls -l /bin/usr 2> output.txt

重定向标准输出和错误

  • &>
ls -l /bin/usr &> output.txt
  • 旧版shell支持
ls -l /bin/usr > output 2>&1

标准错误的重定向必须总是出现在标准输出重定向之后,要不然它不起作用

处理不需要的输出

系统通过重定向输出结果到一个叫做 “/dev/null” 的特殊文件,这个文件是系统设备,叫做位存储桶,它可以接受输入,并且对输入不做任何处理。

ls -l /usr/bin > /dev/null

相关命令

  • cat -连接文件,读取一个或多个文件,然后复制它们到标准输出
    • cat 经常被用来显示简短的文本文件。因为 cat 可以接受不只一个文件作为参数,所以它也可以用来把文件连接在一起
      cat *.txt
      
    • 如果 cat 没有给出任何参数,它会从标准输入读入数据,又因为标准输入默认情况下连接到键盘,它正在等待我们输入数据
    • 标准输入重定向<
    • 管道操作符 “|”(竖杠),一个命令的标准输出可以通过管道送至另一个命令的标准输入
  • sort -排序文本行

    过滤器

    ls -l /usr/bin /usr | sort | less
    
  • uniq -报道或省略重复行

    uniq 从标准输入或单个文件名参数接受数据有序列表,默认情况下,从数据列表中删除任何重复行

     ls /bin /usr/bin | sort | uniq | less
     ls /bin /usr/bin | sort | uniq -d | less # 想看到重复行加-d选项
    
  • grep -打印匹配行

    “-i” 使得 grep 在执行搜索时忽略大小写(通常,搜索是大小写敏感的),“-v” 选项会告诉 grep 只打印不匹配的行

  • wc -打印文件中换行符,字,和字节个数
  • head / tail - 打印文件开头部分/结尾部分

“-n” 选项来调整命令打印的行数
使用 “-f” 选项,tail 命令继续监测这个文件,当新的内容添加到文件后,它们会立即出现在
屏幕上。这会一直继续下去直到你输入 Ctrl-c

  • tee - 从标准输入读取数据,并同时写到标准输出和文件

    tee 程序从标准输入读入数据,并且同时复制数据到标准输出(允许数据继续随着管道线流动)和一个或多个文件

    ls /usr/bin | tee ls.txt | grep zip
    

展开和引用

展开

  • 字符展开
    echo *
    
  • 路径名展开
  • 波浪线展开
    echo ~
    
  • 算数表达式展开
    $((expression))
     echo $(($((5**2)) * 3))
     echo $(((5**2) * 3))
    
  • 花括号展开
    $ echo number_{1..5}
    number_1 number_2 number_3 number_4 number_5
    
  • 参数展开 - 变量
    echo $USER
    
  • 命令替换

    命令替换允许我们把一个命令的输出作为一个展开模式来使用

    echo ls $(which cp)
    
    • 旧版shell
      echo ls `which cp`
      

引用

shell 提供了一种叫做引用的机制,来有选择地禁止不需要的展开

  • 双引号
    shell 使用的特殊字符将失去特殊意义,除$ \ ',这意味着单词分割、路径名展开、波浪线展开和花括号展开都将失效,然而参数展开、算术展开和命令替换仍然执行
     ls -l "two words.txt"
     echo "$USER $((2+2)) $(cal)"
    
  • 单引号
    禁止所有的展开
    $ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
    text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
    
  • 转义字符
    经常在双引号中使用转义字符,来有选择地阻止展开
    $ echo "The balance for user $USER is: \$5.00"
    The balance for user me is: $5.00
    

权限

id chmod umask su sudo chown chgrp passwd

$ touch test.txt
$ ls -l test.txt
-rw-r--r--  1 tina  staff  0  7 15 09:54 test.txt

文件类型

属性 文件类型
- 一个普通文件
d 一个目录
l 一个符号链接。注意对于符号链接文件,剩余的文件属性总是"rwxrwxrwx",而且都是 虚拟值。真正的文件属性是指符号链接所指向的文件的属性。
c 一个字符设备文件。这种文件类型是指按照字节流,来处理数据的设备。 比如说终端机,或者调制解调器
b 一个块设备文件。这种文件类型是指按照数据块,来处理数据的设备,例如一个硬盘,或者 CD-ROM 盘。

读、写、执行

剩下的九个字符叫做文件模式,代表着文件所有者、文件组所有者和其他人的读、写和执行权限。

  • chmod - 更改文件权限(模式)

    只有文件的所有者或者超级用户才能更改文件或目录的模式
    chmod 命令支持两种不同的方法来改变文件模式:八进制数字表示法或符号表示法

    • 八进制数字表示法
      如: 7 (rwx),6 (rw-),5 (r-x),4 (r--),0(-–)

      $ touch test.txt
      $ ls -l test.txt
      -rw-r--r--  1 tina  staff  0  7 15 09:54 test.txt
      $ chmod 600 test.txt
      $ ls -l test.txt
      -rw-------  1 tina  staff  0  7 15 09:54 test.txt
      
    • 符号表示法
      符号表示法分为三部分:更改会影响谁,要执行哪个操作,要设置哪种权限。通过字符“u”、“g”、“o”和“a”的组合来指定要影响的对象

      符号 意义
      u "user"的简写,意思是文件或目录的所有者。
      g 用户组。
      o "others"的简写,意思是其他所有的人。
      a "all"的简写,是"u", "g"和“o”三者的联合。

      如果没有指定字符,则假定使用 “all”。执行的操作可能是一个“+”字符,表示加上一个权限,一个“-”,表示删掉一个权限,或者是一个“=”,表示只有指定的权限可用,其它所有的权限被删除

      $ touch test.txt
      $ ls -l test.txt
      -rw-r--r--  1 tina  staff  0  7 15 09:54 test.txt
      $ chmod u+x test.txt
      $ ls -l test.txt
      -rwxr--r--  1 tina  staff  0  7 15 10:24 test.txt
      
  • umask 设置默认权限

    umask 命令使用八进制表示法来表达从文件模式属性中删除一个位掩码

    大多数情况下,你不必修改掩码值,系统提供的默认掩码值就很好了

    掩码的二进制形式中,出现数字 1 的位置,相应地关掉一个文件模式属性

更改身份

  • su -以其他用户身份和组 ID 运行一个 shell

    su [-[l]] [user]
    

    包含 “-l” 选项,会为指定用户启动一个需要登录的 shell。这意味着会加载此用户的 shell 环境,并且工作目录会更改到这个用户的家目录
    如果不指定用户,那么就假定是超级用户
    选项 “-l” 可以缩写为”-”

    $ su -
    # exit
    $
    
  • sudo –以另一个用户的身份来执行命令

    sudo 命令在很多方面都相似于 su 命令
    管理员能够配置 sudo 命令,从而允许一个普通用户以不同的身份(通常是超级用户),通过一种非常可控的方式来执行命令
    sudo 命令不要求超级用户的密码
    sudo 不会重新启动一个 shell,也不会加载另一个用户的 shell 运行环境
    sudo 命令可以授予哪些权限,使用 “-l” 选项,列出所有权限

  • chown –更改文件所有者和用户组

    chown 命令被用来更改文件或目录的所有者和用户组。使用这个命令需要超级用户权限

    chown [owner][:[group]] file...
    
    • 参数示例
    参数 结果
    bob 把文件所有者从当前属主更改为用户 bob。
    bob:users 把文件所有者改为用户 bob,文件用户组改为用户组 users。
    :admins 把文件用户组改为组 admins,文件所有者不变。
    bob: 文件所有者改为用户 bob,文件用户组改为,用户 bob 登录系统时,所属的用户组。
  • chgrp –更改文件组所有权

    在旧版 Unix 系统中,chown 命令只能更改文件所有权,而不是用户组所有权。为了达到目的,
    使用一个独立的命令,chgrp 来完成。除了限制多一点之外,chgrp 命令与 chown 命令使用起
    来很相似。

  • passwd –更改用户密码

    passwd [user]
    

进程

ps top jobs bg fg kill killall shutdown

进程是怎么工作的

当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做 init 的程序。init,依次地,再运行一系列的称为 init 脚本的 shell 脚本(位于/etc),它们可以启动所有的系统服务。其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户接口 (User Interface)

  • PID
    一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程
    内核维护每个进程的信息,以此来保持事情有序。例如,系统分配给每个进程一个数字,这个数字叫做进程 (process) ID 或 PID
    PID 号按升序分配,init 进程的 PID 总是 1
    内核也对分配给每个进程的内存和就绪状态进行跟踪以便继续执行这个进程。像文件一样,进程也有所有者和用户 ID,有效用户 ID等

ps查看进程

  • 默认情况下,ps(process status)不会显示很多进程信息,只是列出与当前终端会话相关的进程
    $ ps
    PID TTY TIME CMD
    5198 pts/1 00:00:00 bash
    10129 pts/1 00:00:00 ps
    
    • TTY 是 “Teletype”(直译电传打字机) 的简写,是指进程的控制终端
    • TIME 字段表示进程所消耗的 CPU 时间数量
  • ps x
    展示所有进程,不管他们由什么终端控制,在tty一栏显示?表示没有控制终端
    $ ps x
    PID TTY STAT TIME COMMAND
    2799 ? Ssl 0:00 /usr/libexec/bonobo-activation-server –ac
    2820 ? Sl 0:01 /usr/libexec/evolution-data-server-1.10 --
    ....
    
    • STAT
      STAT 是 “state” 的简写,它揭示了进程当前状态

      状态 意义
      R 运行。这意味着,进程正在运行或准备运行。
      S 正在睡眠。 进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络数据包。
      D 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。
      T 已停止. 已经指示进程停止运行。稍后介绍更多。
      Z 一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除)
      < 一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。
      N 低优先级进程。 一个低优先级进程(一个“好”进程)只有当其它高优先级进程执行之后,才会得到处理器时间。
  • ps aux
    这个选项组合,能够显示属于每个用户的进程信息。使用这个选项,可以唤醒“BSD 风格”的输出结果
    标题 意思
    USER 用户 ID. 进程的所有者。
    %CPU 以百分比表示的 CPU 使用率
    %MEM 以百分比表示的内存使用率
    VSZ 虚拟内存大小
    RSS 进程占用的物理内存的大小,以千字节为单位。
    START 进程运行的起始时间。若超过24小时,则用天表示。

top动态查看进程

虽然 ps 命令能够展示许多计算机运行状态的信息,但是它只是提供 ps 命令执行时刻的机器状态快照。为了看到更多动态的信息,我们使用 top 命令

  • top 程序以进程活动顺序显示连续更新的系统进程列表
  • 默认情况下,每三秒钟更新一次
  • top 显示结果由两部分组成:最上面是系统概要,下面是进程列表,以 CPU 的使用率排序

把一个进程放在后台执行

  • 在程序命令之后,加上 “&” 字符

    $ xlogo &
    [1] 28236
    $
    $ ps
    PID TTY TIME CMD
    10603 pts/1 00:00:00 bash
    28236 pts/1 00:00:00 xlogo
    28239 pts/1 00:00:00 ps
    

    xlogo是一个小程序
    已经启动了任务号 (job number) 为 1(“[1]”),PID 为 28236 的程序

  • jobs 列出活跃的任务

    $ jobs
    [1]+ Running xlogo &
    
  • bg

    $ bg %1
    
    • 一个百分号和任务序号(叫做jobspec, 如此处的%1
    • 如果只有一个任务的话,jobspec参数是可选的

进程返回前台

一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它
使用fg(foreground)让那进程返回前台

$ jobs
[1]+ Running xlogo &
$ fg %1
xlogo
  • fg跟随着一个百分号和任务序号(叫做jobspec, 如此处的%1)就可以了
  • 如果我们只有一个后台任务,那么 jobspec(job specification)是可有可无的

停止一个进程

Ctrl-z可以停止一个前台进程

$ xlogo
[1]+ Stopped xlogo

信号

通过kill命令给进程发送信号

当终端接受了其中一个按键组合后,它会给在前端运行的程序发送一个信号。在使用 Ctrl-c 的情况下,会发送一个叫做 INT(Interrupt, 中断)的信号;当使用 Ctrl-z 时,则发送一个叫做 TSTP(Terminal Stop,终端停止)的信号。程序,相应地,监听信号的到来,当程序接到信号之后,则做出响应。

kill [-signal] PID...
  • 如果在命令行中没有指定信号,那么默认情况下,发送 TERM(Terminate,终止)信号
    编号 名字 含义
    1 HUP 挂起。这是美好往昔的痕迹,那时候终端机通过电话线和调制解调器连接到 远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂起”。 通过关闭一个终端会话,可以说明这个信号的作用。发送这个信号到终端机上的前台程序,程序会终止。许多守护进程也使用这个信号,来重新初始化。这意味着,当发送这个信号到一个守护进程后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。
    2 INT 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。
    9 KILL 杀死。这个信号很特别。鉴于进程可能会选择不同的方式,来处理发送给它的 信号,其中也包含忽略信号,这样呢,从不发送 Kill 信号到目标进程。而是内核立即终止 这个进程程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存劳动成果。 因为这个原因,把 KILL 信号看作杀手锏,当其它终止信号失败后,再使用它。
    15 TERM 终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个信号终止。
    18 CONT 继续。在停止一段时间后,进程恢复运行。
    19 STOP 停止。这个信号导致进程停止运行,而没有终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。
    $ xlogo &
    [1] 13546
    $ kill -1 13546
    [1]+ Hangup xlogo
    
    • 信号既可以用号码,也可以用名字来指定,包括在前面加上字母“SIG”的名字
      $ kill -INT 13601
      [1]+ Interrupt xlogo
      $ xlogo &
      [1] 13608
      kill -SIGINT 13608
      [1]+ Interrupt xlogo
      
    • 其他信号
      可使用kill -l查看
      $ kill -l
      

通过killall命令给多个进程发送信号

通过 killall 命令,给匹配特定程序或用户名的多个进程发送信号。

killall [-u user] [-signal] name...
  • 和 kill 命令一样,必须拥有超级用户权限才能给不属于你的进程发送信号

其他进程相关的命令

命令名 命令描述
pstree 输出一个树型结构的进程列表,这个列表展示了进程间父/子关系。
vmstat 输出一个系统资源使用快照,包括内存,交换分区和磁盘 I/O。 为了看到连续的显示结果,则在命令名后加上延时的时间(以秒为单位)。例如,“vmstat 5”。 终止输出,按下 Ctrl-c 组合键。
xload 一个图形界面程序,可以画出系统负载的图形。
tload 与 xload 程序相似,但是在终端中画出图形。使用 Ctrl-c,来终止输出。

键盘操作

效率提升

移动光标

按键 行动
Ctrl-a 移动光标到行首。
Ctrl-e 移动光标到行尾。
Ctrl-f 光标前移一个字符;和右箭头作用一样。
Ctrl-b 光标后移一个字符;和左箭头作用一样。
Alt-f 光标前移一个字。
Alt-b 光标后移一个字。
Ctrl-l 清空屏幕,移动光标到左上角。clear 命令完成同样的工作。

修改文本

按键 行动
Ctrl-d 删除光标位置的字符。
Ctrl-t 光标位置的字符和光标前面的字符互换位置。
Alt-t 光标位置的字和其前面的字互换位置。
Alt-l 把从光标位置到字尾的字符转换成小写字母。
Alt-u 把从光标位置到字尾的字符转换成大写字母。

剪切和粘贴文本

按键 行动
Ctrl-k 剪切从光标位置到行尾的文本。
Ctrl-u 剪切从光标位置到行首的文本。
Alt-d 剪切从光标位置到词尾的文本。
Alt-Backspace 剪切从光标位置到词头的文本。如果光标在一个单词的开头,剪切前一个单词。
Ctrl-y 把剪切环中的文本粘贴到光标位置。

剪切下来的本文被存储在一个叫做剪切环 (kill-ring) 的缓冲区中

补全

tab键

历史命令

bash 维护着一个已经执行过的命令的历史列表。这个命令列表被保存在你家目录下,一个叫做.bash_history 的文件里

  • 在默认情况下,bash 会存储你所输入的最后 500 个命令
    $ history | less
    $ history | grep /usr/bin
    ...
    88 ls -l /usr/bin > ls-output.txt
    ...
    
  • 使用另一种叫做历史命令展开的方式,来调用“88”所代表的这一行命令
    $ !88
    

    bash 也具有增量搜索历史列表的能力。意思是在字符输入的同时,bash 会去搜索历史列表(直接出结果,并高亮匹配的第一个字),每多输入一个字符都会使搜索结果更接近目标。
    输入 Ctrl-r 来启动增量搜索,接着输入你要寻找的字。当你找到它以后,你可以敲入Enter 来执行命令
    输入 Ctrl-j,从历史列表中复制这一行到当前命令行。
    输入 Ctrl-r,来找到下一个匹配项(历史列表中向上移动)。
    输入 Ctrl-g 或者 Ctrl-c,退出搜索。
    更多详细操作可参考参考文献

软件包管理

不同的 Linux 发行版使用不同的打包系统,一般而言,大多数发行版分别属于两大包管理技术阵营:Debian 的 “.deb”,和红帽的”.rpm”。

依赖性

程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。程序所共有的活动,如输入/输出,就是由一个被多个程序调用的子例程处理的。这些子例程存储在动态链接库中。动态链接库为多个程序提供基本服务。如果一个软件包需要一些共享的资源,如一个动态链接库,它就被称作有一个依赖。现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有的依赖也被安装。

上层和底层软件包工具

软件包管理系统通常由两种工具类型组成:底层工具用来处理这些任务,比方说安装和删除软件包文件,和上层工具,完成元数据搜索和依赖解析。

发行版 底层工具 上层工具
Debian-Style dpkg apt-get, aptitude
Fedora, Red Hat Enterprise Linux, CentOS rpm yum

查找资源库中的软件包

风格 命令
Debian apt-get update; apt-cache search search_string
Red Hat yum search search_string
yum search emacs

软件的安装、卸载、升级

  • 从资源库或者软件包文件安装
    风格 命令
    Debian apt-get update; apt-get install package_name 或 dpkg --install package_file
    Red Hat yum install package_name 或 rpm -i package_file
    apt-get update; apt-get install emacs
    rpm -i emacs-22.1-7.fc7-i386.rpm
    

    注意:rpm -i emacs-22.1-7.fc7-i386.rpm使用底层rpm来执行安装,所以没有运行依赖解析。如果rpm程序发现缺少了一个依赖,则会报错并退出。

  • 卸载软件
    风格 命令
    Debian apt-get remove package_name
    Red Hat yum erase package_name
  • 升级软件
    最常见的软件包管理任务是保持系统中的软件包都是最新的。
    风格 命令
    Debian apt-get update; apt-get upgrade 或 dpkg --install package_file
    Red Hat yum update 或 rpm -U package_file

软件包状态

  • 列出所安装的包
    风格 命令
    Debian dpkg --list
    Red Hat rpm -qa
  • 确定是否安装了某个软件包(软件包状态)
    风格 命令
    Debian dpkg --status package_name
    Red Hat rpm -q package_name
  • 显示所安装软件包的信息
    风格 命令
    Debian apt-cache show package_name
    Red Hat yum info package_name
  • 查找安装了某个文件的软件包
    如:在 Red Hat 系统中,查看哪个软件包安装了/usr/bin/vim 这个文件
    rpm -qf /usr/bin/vim
    
    风格 命令
    Debian dpkg --search file_name
    Red Hat rpm -qf file_name

存储媒介

mount挂载一个文件系统

“挂载” 的过程允许设备连接到操作系统中,有一个叫做/etc/fstab 的文件可以列出系统启动时要挂载的设备

$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)

不带任何参数的mount可查看挂载文件系统列表
设备 on 挂载点 type 文件系统类型(选项)。例如,第一行所示设备/dev/sda2 作为根文件系统被挂载,文件系统类型是 ext3,并且可读可写(这个“rw”选项)

umount 卸载一个文件系统

例子:卸载一张光盘,并把它重新挂载到文件系统树的另一个位置

$ su -
# umount /dev/hdc
# mkdir /mnt/cdrom
# mount -t iso9660 /dev/hdc /mnt/cdrom
# cd /mnt/cdrom
# umount /dev/hdc
umount: /mnt/cdrom: device is busy
# cd
# umount /dev/hdc

需要超级用户权限
如果把设备挂载到了一个非空目录上,将不能看到这个目录中原来的内容,直到你卸载这个设备
mount 中-t 选项用来指定文件系统类型
如果某个用户或进程正在使用这个设备的话,将不能卸载这个设备

其他

  • fsck –检查和修复一个文件系统
  • fdisk –分区表控制器
  • mkfs –创建文件系统
  • fdformat –格式化一张软盘
  • dd —把面向块的数据直接写入设备
  • genisoimage (mkisofs) –创建一个 ISO 9660 的映像文件
  • wodim (cdrecord) –把数据写入光存储媒介
  • md5sum –计算 MD5 检验码

详情可参考原文档

网络系统

检查和监测网络

  • ping
    ping 命令发送一个特殊的网络数据包,叫做 ICMP ECHO_REQUEST,到一台指定的主机。大多数接收这个包的网络设备将会回复它,来允许网络连接验证

    大多数网络设备(包括 Linux 主机)都可以被配置为忽略这些数据包。通常,这样做是出于网络安全原因,部分地遮蔽一台主机免受一个潜在攻击者地侵袭。配置防火墙来阻塞IMCP 流量也很普遍

  • traceroute
    这个 traceroute 程序(一些系统使用相似的 tracepath 程序来代替)会显示从本地到指定主机要经过的所有“跳数”的网络流量列表

  • netstat
    netstat 程序被用来检查各种各样的网络设置和统计数据

    • 使用“-ie”选项,我们能够查看系统中的网络接口

      如看到: eth0,是以太网接口; lo是内部回环网络接口,它是一个虚拟接口,系统用它来“自言自语”

      $ netstat -ie
      eth0 Link encap:Ethernet HWaddr 00:1d:09:9b:99:67
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
      inet6 addr: fe80::21d:9ff:fe9b:9967/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
      RX packets:238488 errors:0 dropped:0 overruns:0 frame:0
      TX packets:403217 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:100 RX bytes:153098921 (146.0 MB) TX
      bytes:261035246 (248.9 MB) Memory:fdfc0000-fdfe0000
      
      lo Link encap:Local Loopback
      inet addr:127.0.0.1 Mask:255.0.0.0
      

      当执行日常网络诊断时,要查看的重要信息是每个网络接口第四行开头出现的单词“UP”,说明这个网络接口已经生效,还要查看第二行中 inet addr 字段出现的有效 IP 地址。对于使用DHCP(动态主机配置协议)的系统,在这个字段中的一个有效 IP 地址则证明了 DHCP 工作正常

    • 使用这个“-r”选项会显示内核的网络路由表
      展示了系统是如何配置网络之间发送数据包的
      $ netstat -r
      Kernel IP routing table
      Destination  Gateway     Genmask     Flags  MSS  Window  irtt  Iface
      192.168.1.0    *      255.255.255.0     U     0     0      0     eth0
      default     192.168.1.1  0.0.0.0        UG    0     0      0     eth0
      
    • 其他选项请参考手册

网络中传输文件

  • ftp/lftp
  • wget
    用来下载文件的命令行程序

与远程主机安全通信

早些年,在因特网普遍推广之前,有一些受欢迎的程序被用来登录远程主机。它们是 rlogin 和 telnet 程序。然而这些程序,拥有和 ftp 程序一样的致命缺点;它们以明码形式来传输所有的交流信息(包括登录命令和密码)。这使它们完全不适合使用在因特网时代。

  • SSH
    Secure ssh :认证远端主机是否为它所知道的那台主机(这样就阻止了所谓的“中间人”的攻击),其次,它加密了本地与远程主机之间所有的通讯信息
    SSH 由两部分组成。SSH 服务端运行在远端主机上,在端口 22 上监听收到的外部连接,而SSH 客户端用在本地系统中,用来和远端服务器通信。
    大多数 Linux 发行版自带一个提供 SSH 功能的软件包,叫做 OpenSSH,来自于 BSD 项目。一些发行版默认包含客户端和服务端两个软件包(例如 Red Hat),而另一些(比方说Ubuntu)则只提供客户端。为了能让系统接受远端的连接,它必须安装 OpenSSH-server 软件包,配置,运行它,并且(如果系统正在运行,或者系统在防火墙之后)它必须允许在 TCP 端 口 22 上接收网络连接。
    $ ssh bob@remote-sys
    bob@remote-sys's password:
    Last login: Sat Aug 30 13:03:21 2008
    [bob@remote-sys ~]$
    
  • scp 和 sftp
    OpenSSH 软件包也包含两个程序,它们可以利用 SSH 加密通道在网络间复制文件
    • scp
      源或者目标路径名要以远端主机的名字,后跟一个冒号字符开头
      $ scp remote-sys:document.txt .
      me@remote-sys's password:
      document.txt
      100% 5581 5.5KB/s 00:00
      
      如果所需的远端主机帐户名与本地系统中的不一致,那么你可以把用户名添加到远端主机名的开头
      $ scp bob@remote-sys:document.txt .
      
    • sftp
      是 ftp 程序的安全替代品,这意味着任何一台能用 SSH 客户端连接的远端机器,也可当作类似
      于 FTP 的服务器来使用

查找文件

locate find xargs touch stat

  • locate

    $ locate bin/zip
    /usr/bin/zip
    /usr/bin/zipcloak
    /usr/bin/zipgrep
    /usr/bin/zipinfo
    /usr/bin/zipnote
    /usr/bin/zipsplit
    
    • 两个最常见的变体是 slocate 和 mlocate
  • find
    locate 程序只能依据文件名来查找文件,而 find 程序能基于各种各样的属性搜索一个给定目录以及它的子目录),来查找文件

    1. 测试条件
    • 在find中添加条件限定
      如搜索目录列表
      $ find ~ -type d | wc -l
      1695
      
    • find常见文件类型测试条件
      文件类型 描述
      b 块设备文件
      c 字符设备文件
      d 目录
      f 普通文件
      l 符号链接
    • 额外测试条件
      如:查找所有文件名匹配通配符模式“*.JPG”和文件大小大于 1M 的普通文件
      $ find ~ -type f -name "*.JPG" -size +1M | wc -l
      840
      

      字符串“+1M”。开头的加号表明我们正在寻找文件大小大于指定数的文件。若字符串以减号开头,则意味着查找小于指定数的文件。若没有符号意味着“精确匹配这个数”

    • 更多测试条件
    测试条件 描述
    -cmin n 匹配的文件和目录的内容或属性最后修改时间正好在 n 分钟之前。 指定少于 n 分钟之前,使用 -n,指定多于 n 分钟之前,使用 +n。
    -cnewer file 匹配的文件和目录的内容或属性最后修改时间早于那些文件。
    -ctime n 匹配的文件和目录的内容和属性最后修改时间在 n*24小时之前。
    -empty 匹配空文件和目录。
    -group name 匹配的文件和目录属于一个组。组可以用组名或组 ID 来表示。
    -iname pattern 就像-name 测试条件,但是不区分大小写。
    -inum n 匹配的文件的 inode 号是 n。这对于找到某个特殊 inode 的所有硬链接很有帮助。
    -mmin n 匹配的文件或目录的内容被修改于 n 分钟之前。
    -mtime n 匹配的文件或目录的内容被修改于 n*24小时之前。
    -name pattern 用指定的通配符模式匹配的文件和目录。
    -newer file 匹配的文件和目录的内容早于指定的文件。当编写 shell 脚本,做文件备份时,非常有帮助。 每次你制作一个备份,更新文件(比如说日志),然后使用 find 命令来决定自从上次更新,哪一个文件已经更改了。
    -nouser 匹配的文件和目录不属于一个有效用户。这可以用来查找 属于删除帐户的文件或监测攻击行为。
    -nogroup 匹配的文件和目录不属于一个有效的组。
    -perm mode 匹配的文件和目录的权限已经设置为指定的 mode。mode 可以用 八进制或符号表示法。
    -samefile name 相似于-inum 测试条件。匹配和文件 name 享有同样 inode 号的文件。
    -size n 匹配的文件大小为 n。
    -type c 匹配的文件类型是 c。
    -user name 匹配的文件或目录属于某个用户。这个用户可以通过用户名或用户 ID 来表示。
  1. 操作符
    来描述测试条件之间的逻辑关系,如

    $ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
    
    • find 命令的逻辑操作符
      操作符 描述
      -and 如果操作符两边的测试条件都是真,则匹配。可以简写为 -a。 注意若没有使用操作符,则默认使用 -and。
      -or 若操作符两边的任一个测试条件为真,则匹配。可以简写为 -o。
      -not 若操作符后面的测试条件是真,则匹配。可以简写为一个感叹号(!)。
      () 把测试条件和操作符组合起来形成更大的表达式。这用来控制逻辑计算的优先级。 默认情况下,find 命令按照从左到右的顺序计算。经常有必要重写默认的求值顺序,以得到期望的结果。 即使没有必要,有时候包括组合起来的字符,对提高命令的可读性是很有帮助的。注意 因为圆括号字符对于 shell 来说有特殊含义,所以在命令行中使用它们的时候,它们必须 用引号引起来,才能作为实参传递给 find 命令。通常反斜杠字符被用来转义圆括号字符。

      遵循短路,提高性能

  2. 预定义操作
    find 命令允许基于搜索结果来执行操作。有许多预定义的操作和几种方式来应用用户定义的操作。
    如:

    操作 描述
    -delete 删除当前匹配的文件。
    -ls 对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。
    -print 把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。
    -quit 一旦找到一个匹配,退出。
    find ~ -type f -name '*.BAK' -print
    

    在每个测试和操作之间会默认应用 -and 逻辑运算符
    如上命令等价于find ~ -type f -and -name '*.BAK' -and -print
    更改测试条件顺序,对结果有很多影响

  3. 用户定义的行为
    除了预定义的行为之外,我们也可以调用任意的命令。传统方式是通过 -exec 行为。

    -exec command {} ;
    

    command 就是指一个命令的名字,{} 是当前路径名的符号表示,分号是必要的分隔符表明命令的结束
    花括号和分号对于 shell 有特殊含义,所以它们必须被引起来或被转义。-exec command '{}' ';'
    也可以-ok 行为来代替 -exec,在执行每个指定的命令之前,会提示用户。
    如:

    find ~ -type f -name 'foo*' -ok ls -l '{}' ';'
    < ls ... /home/me/bin/foo > ? y
    -rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
    < ls ... /home/me/foo.txt > ? y
    -rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
    

    当 -exec 行为被使用的时候,若每次找到一个匹配的文件,它会启动一个新的指定命令的实例。我们可能更愿意把所有的搜索结果结合起来,再运行一个命令的实例

    • 分号改成加号

      find ~ -type f -name 'foo*' -exec ls -l '{}' +
      -rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
      -rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
      

      虽然我们得到一样的结果,但是系统只需要执行一次 ls 命令。

    • xargs
      xargs 命令会执行一个有趣的函数。它从标准输入接受输入,并把输入转换为一个特定命令的参数列表

      find ~ -type f -name 'foo*' -print | xargs ls -l
      -rwxr-xr-x 1 me me 224 2007-10-29 18:44 /home/me/bin/foo
      -rw-r--r-- 1 me me 0 2008-09-19 12:53 /home/me/foo.txt
      

      find 命令的输出被管道到 xargs 命令,之后,xargs 会为 ls 命令构建参数列表,然后执行 ls 命令。

归档和备份

压缩文件

无损压缩和有损压缩。无损压缩保留了原始文件的所有数据。有损压缩,执行压缩操作时会删除数据,允许更大的压缩。当一个有损文件被还原的时候,它与原文件不相匹配; 相反,它是一个近似值。
有损压缩的例子有 JPEG(图像)文件和 MP3(音频)文件。

  • gzip 和 gunzip

    $ ls -l /etc > foo.txt
    $ ls -l foo.*
    -rw-r--r-- 1 me me 15738 2008-10-14 07:15 foo.txt
    $ gzip foo.txt
    $ ls -l foo.*
    -rw-r--r-- 1 me me 3230 2008-10-14 07:15 foo.txt.gz
    $ gunzip foo.txt.gz
    $ ls -l foo.*
    -rw-r--r-- 1 me me 15738 2008-10-14 07:15 foo.txt
    
    • gzip选项
      选项 说明
      -c 把输出写入到标准输出,并且保留原始文件。也有可能用--stdout 和--to-stdout 选项来指定。
      -d 解压缩。正如 gunzip 命令一样。也可以用--decompress 或者--uncompress 选项来指定.
      -f 强制压缩,即使原始文件的压缩文件已经存在了,也要执行。也可以用--force 选项来指定。
      -h 显示用法信息。也可用--help 选项来指定。
      -l 列出每个被压缩文件的压缩数据。也可用--list 选项。
      -r 若命令的一个或多个参数是目录,则递归地压缩目录中的文件。也可用--recursive 选项来指定。
      -t 测试压缩文件的完整性。也可用--test 选项来指定。
      -v 显示压缩过程中的信息。也可用--verbose 选项来指定。
      -number 设置压缩指数。number 是一个在1(最快,最小压缩)到9(最慢,最大压缩)之间的整数。 数值1和9也可以各自用--fast 和--best 选项来表示。默认值是整数6。
  • bzip2 和 bunzip2
    这个 bzip2 程序,由 Julian Seward 开发,与 gzip 程序相似,但是使用了不同的压缩算法,舍弃了压缩速度,而实现了更高的压缩级别。在大多数情况下,它的工作模式等同于 gzip。由bzip2 压缩的文件,用扩展名.bz2 来表示。

归档文件

归档就是收集许多文件,并把它们捆绑成一个大文件的过程。归档经常作为系统备份的一部分来使用。当把旧数据从一个系统移到某种类型的长期存储设备中时,也会用到归档程序。

  • tar
    我们经常看到扩展名为.tar 或者.tgz 的文件,它们各自表示“普通”的 tar 包和被 gzip 程序压缩过的 tar 包。一个 tar 包可以由一组独立的文件,一个或者多个目录,或者两者混合体组成

    tar mode[options] pathname...
    
    • tar模式(部分)

      模式 说明
      c 为文件和/或目录列表创建归档文件。
      x 抽取归档文件。
      r 追加具体的路径到归档文件的末尾。
      t 列出归档文件的内容。
    • zip 和 unzip

    zip options zipfile file...
    

同步文件和目录

rsync这个程序能同步本地与远端的目录,通过使用rsync 远端更新协议,此协议允许 rsync 快速地检测两个目录的差异,执行最小量的复制来达到目录间的同步

rsync options source destination

这里 source 和 destination 是下列选项之一:

  • 一个本地文件或目录
  • 一个远端文件或目录,以 [user@]host:path 的形式存在
  • 一个远端 rsync 服务器,由 rsync://[user@]host[:port]/path 指定

注意 source 和 destination 两者之一必须是本地文件。rsync 不支持远端到远端的复制

参考及扩展学习