Liunx学习

Linux Shell命令是Linux操作系统中用于控制和管理系统的文本指令。这些命令通过终端(Terminal)或Shell界面执行,允许用户执行文件管理、进程控制、网络配置、系统监控等各种任务。以下是Linux Shell中一些常用命令的概述:

文件和目录操作

  1. ls

    • 列出当前目录下的文件和目录。
    • 示例:ls -l 显示详细信息,包括权限、所有者、大小和时间戳。
  2. cd

    • 改变当前工作目录。
    • 示例:cd /etc 进入/etc目录。
  3. pwd

    • 显示当前工作目录的完整路径。
    • 示例:pwd 可能输出/home/yourusername.
  4. mkdir

    • 创建新的目录。
    • 示例:mkdir newdir 创建名为newdir的目录。
  5. rm

    • 删除文件或目录。
    • 示例:rm filename 删除文件,rm -r directory 删除目录及其内容。
  6. cp

    • 复制文件或目录。
    • 示例:cp sourcefile destfile 或 cp -r sourcedir destdir
  7. mv

    • 移动文件或目录,或重命名文件。
    • 示例:mv oldname newname 或 mv sourcefile targetdir.
  8. touch

    • 创建新文件或更新现有文件的时间戳。
    • 示例:touch newfile.
  9. cat

    • 显示文件内容。
    • 示例:cat filename.
  10. less

    • 分页查看文件内容。
    • 示例:less largefile.

进程管理

  1. ps

    • 显示当前运行的进程信息。
    • 示例:ps aux 显示所有进程的详细信息。
  2. top

    • 动态显示系统中各进程的资源占用状况。
    • 示例:top 启动后可实时查看CPU、内存使用情况及进程状态。
  3. kill

    • 向进程发送信号,通常是终止进程。
    • 示例:kill PID 终止指定PID的进程。
  4. bg

    • 将前台暂停的进程移至后台继续运行。
    • 示例:bg 当前暂停的作业。

系统信息

  1. uname

    • 显示系统信息,如内核版本。
    • 示例:uname -a 显示详细的系统信息。
  2. df

    • 显示磁盘分区的使用情况。
    • 示例:df -h 以人类易读的格式显示。
  3. du

    • 显示目录或文件的磁盘使用情况。
    • 示例:du -sh directory 显示目录的大小。

  4. free

    • 显示系统内存和交换空间的使用情况。
    • 示例:free -m 以MB为单位显示。

网络工具

  1. ping

    • 测试网络连通性。
    • 示例:ping www.example.com 向网站发送ICMP请求。
  2. ifconfig

    • 显示或配置网络接口。
    • 示例:ifconfig eth0 显示eth0接口的信息。
  3. traceroute

    • 跟踪到达目标主机的路径。
    • 示例:traceroute www.example.com.
  4. netstat

    • 显示网络连接、路由表、接口统计等信息。
    • 示例:netstat -tuln 显示所有监听的TCP/UDP端口。

用户和权限

  1. whoami

    • 显示当前登录用户名。
    • 示例:whoami 显示当前用户。
  2. su

    • 切换到另一个用户。
    • 示例:su username 或 su - username 进入新用户环境。
  3. chmod

    • 更改文件或目录的权限。
    • 示例:chmod 755 filename 或 chmod u+x filename.
  4. chown

    • 更改文件或目录的所有者和组。
    • 示例:chown user:group filename.

文本编辑器

  1. nano

    • 简单的文本编辑器。
    • 示例:nano filename 打开文件进行编辑。
  2. vim

    • 强大的文本编辑器,适合高级用户。
    • 示例:vim filename 打开文件进行编辑。

包管理

  1. apt (Debian/Ubuntu)

    • 安装、更新、卸载软件包。
    • 示例:sudo apt install package-name 或 sudo apt update.
  2. yum (RHEL/CentOS/Fedora)

    • 类似于apt,用于包管理。
    • 示例:sudo yum install package-name.
  3. dnf (Fedora)

    • DNF是YUM的替代品,用于包管理。
    • 示例:sudo dnf install package-name.

特殊字符:

在Unix/Linux Shell中,特殊字符扮演着重要的角色,它们用于控制命令的执行流程、文件名扩展、变量引用和命令的组合等。下面是一些Shell中最常见的特殊字符及其用途:

  1. #(井号)

    • 用于注释。在Shell脚本中,以#开始的行会被解释器忽略,不会执行。
  2. $(美元符号)

    • 用于变量引用。如$VAR会将变量VAR的值插入到命令中。
  3. &(和符号)

    • 用于后台运行命令。如command &会让command在后台执行。
  4. ;(分号)

    • 用于分隔命令。如command1; command2会先执行command1,不管其成功与否,都会执行command2
  5. &&(和符号与和符号)

    • 用于逻辑AND操作。如command1 && command2会先执行command1,只有当command1成功时,才会执行command2
  6. ||(管道符号或管道符号)

    • 用于逻辑OR操作。如command1 || command2会先执行command1,只有当command1失败时,才会执行command2
  7. |(管道符号)

    • 用于管道操作,将一个命令的输出作为下一个命令的输入。如command1 | command2
  8. <(小于符号)>(大于符号)

    • 用于重定向。<用于从文件读取输入,>用于将命令的输出重定向到文件。
  9. <<(双小于符号)

    • 用于heredoc,定义多行文本输入的结束标记。
  10. > >(双大于符号)

    • 用于追加重定向,将命令的输出附加到文件末尾。
  11. 2>

    • 这个符号用于重定向标准错误输出(stderr)。数字2表示标准错误流,将其重定向到指定的文件中,如果文件存在则会被覆盖。
  12. &>

    • 这是一个组合重定向操作符,它将标准输出和标准错误合并并重定向到同一个文件中。这意味着命令的所有输出(包括正常输出和错误信息)都会被发送到同一个地方。
  13. *(星号)

    • 用于通配符,匹配任何文件名。如ls *.txt会列出所有扩展名为.txt的文件。
  14. ?(问号)

    • 用于通配符,匹配单个字符。如ls file_?.txt会匹配file__1.txtfile__2.txt等。
  15. [ ](方括号)

    • 用于字符集匹配。匹配其中指定的一个字符 如ls f[lm]e会匹配flefme
    • 匹配指定的一个字符范围 ls f[a-b]e会匹配faefbe
    • 除了其中指定的字符,均可匹配 ls f[a-b]e会匹配faefbe
  16. !(感叹号)

    • 用于历史命令的引用。如!ls会重新执行上一次以ls开始的命令。
  17. { }(花括号)

    • 用于参数扩展。如echo {a,b,c}.txt会生成a.txt b.txt c.txt
  18. ~(波浪号)

    • 用于表示用户的主目录。如cd ~会切换到当前用户的家目录。
  19. '(单引号)

    • 用于字符串字面量,单引号内的特殊字符会被视为普通字符。
  20. "(双引号)

    • 用于字符串,双引号内的特殊字符如变量引用和命令替换会被展开。
  21. \(反斜杠)

    • 用于转义字符,取消下一个字符的特殊含义。
  22. ( )(圆括号)

    • 用于命令分组或子shell。
  23. `(反引号)

    • 用于命令替换,执行括号内的命令并将输出作为替换值。在现代Shell中,推荐使用$(command)

shell基本系统维护命令:

1. man

man 命令用于访问联机手册页,提供有关其他命令的详细使用说明。

  • 语法:
    man [选项] 命令名
  • 示例:
    man ls

2. passwd

passwd 命令用于更改用户的密码。

  • 语法:
    passwd [用户名]
  • 示例:
    passwd root

3. su

su 命令用于切换用户身份。

  • 语法:
    su [选项] [用户名]
  • 示例:
    su root

4. echo

echo 命令用于打印到标准输出。

  • 语法:
    echo [选项] [字符串]
    选项-n表示输出文字后不换行。
  • 示例:
  • echo Hello, World!

5. date

date 命令用于显示或设置系统日期和时间。

  • 语法:
    date [选项]
    
    date  [-d | -s|-u ]  datestr
    选项-s表示按照datestr日期显示格式设置日期;单独使用date命令,
    用于显示系统时钟中当前日期。时间的格式为:“hh:mm:ss”,日期格式为:“mm/dd/yy”。
    
  • 示例:
    date

6. clear

clear 命令用于清除终端屏幕。

  • 语法:
    clear
  • 示例:
    clear

7. df

df 命令用于报告文件系统的磁盘空间使用情况。

  • 语法:
    df [选项]
    df  [-a | -T | -h | -k ]  Filesystem
    其中,参数Filesystem表示物理文件系统。各选项的含义如表所示。
     -a :列出所有文件系统,显示所有物理文件系统的使用情况,包括虚拟文件系统,如/proc、/sys
     -k :列出磁盘的分配情况(KB),物理文件系统大小按千字节为单位显示
     -h :同-k, 但大小以G、M,K单位显示,物理文件系统大小按兆字节为单位显示
     -l :仅列出本地文件系统
     -T:显示物理文件系统的文件格式类型
  • 示例:
  • df -h

8. du

du 命令用于估算文件和目录的磁盘使用情况。

  • 语法:
    du [选项] [文件或目录]
    du命令,列出目录和文件所使用的磁盘块数,每块占512个字节。
    常用参数:
     -a :仅列出空闲的文件数 
     -h :列出磁盘的使用情况(KB) 
     -s :列出总的空闲空间(KB) 
    
  • 示例:
    du -sh /home/user

用户管理相关命令:

Linux用户管理涉及对系统中用户的创建、修改、删除以及权限的调整。以下是进行Linux用户管理的一些常见命令和操作:

  1. 创建用户

    • useradd [选项] 用户名:创建一个新的用户账户。
    • 示例:useradd john,这将创建一个名为john的新用户。
    • 也可以使用 -m 参数来自动创建用户的主目录,虽然这是默认行为。
  2. 设置密码

    • passwd 用户名:为指定用户设置密码。
    • 示例:passwd john,然后按照提示输入新密码。
  3. 查看用户信息

    • id 用户名:显示用户的UID、GID和所属组。
    • cat /etc/passwd:查看系统中所有的用户及其基本信息。
    • grep 用户名 /etc/passwd:查找特定用户的详细信息。
  4. 修改用户属性

    • usermod [选项] 用户名:修改用户账户的各种属性。
    • 示例:usermod -d /home/newdir john,这将把john用户的主目录更改为/home/newdir。
  5. 删除用户

    • userdel [选项] 用户名:删除用户账户。
    • 如果要同时删除用户的主目录,可以使用 -r 参数。
    • 示例:userdel -r john,这将删除john的账户和主目录。
  6. 用户组管理

    • groupadd 组名:创建一个新的用户组。
    • gpasswd [选项] 用户名 组名:将用户添加到或从用户组中移除。
    • groupdel 组名:删除一个用户组。
  7. 查看用户组信息

    • groups 用户名:查看用户所属的所有组。
    • cat /etc/group:查看系统中所有的用户组。
  8. 修改用户组

    • usermod -G 组名 用户名:更改用户的主要组。
    • usermod -aG 组名 用户名:将用户添加到附加组而不改变其主要组。
  9. 用户登录状态

    • last:显示最近的登录记录。
    • w 或 who:显示当前登录的用户列表。
  10. 权限管理

    • chown 用户名[:组名] 文件或目录:改变文件或目录的所有权。
    • chgrp 组名 文件或目录:改变文件或目录的组所有权。
    • chmod 模式 文件或目录:更改文件或目录的权限。

确保在执行上述命令时具有足够的权限,通常需要root权限才能进行用户和组的管理。如果在非交互式环境中批量处理用户管理任务,可以考虑使用/etc/adduser.conf配置文件和adduser命令。

用户管理相关文件:

在Linux系统中,用户和用户组的信息以及权限控制主要通过几个关键的配置文件进行管理。以下是一些与用户管理相关的文件:

  1. /etc/passwd

    • 这是一个纯文本文件,包含了系统中所有用户的基本信息,如用户名、经过加密的口令、用户ID(UID)、组ID(GID)、个人信息、用户主目录和shell等。每一行代表一个用户,字段由冒号分隔。用户登陆时,系统查询这个文件,确定用户的UID并验证用户口令
  2. /etc/shadow

    • 包含了用户的密码信息以及其他安全相关的数据,如密码最后一次修改的时间、密码过期日期等。这个文件只允许root用户读取,以增强安全性。
  3. /etc/group

    • 类似于/etc/passwd,但针对用户组。它列出了所有用户组以及属于每个组的成员列表。
    • 每一行代表一个组,包括4个字段:组名、加密的口令、GID号、成员列表,彼此用逗号隔开
  4. /etc/gshadow

    • 这个文件包含用户组的密码信息和其他安全细节,类似于/etc/shadow,但针对用户组。同样,只有root用户可以读取此文件。
  5. /etc/default/useradd

    • 这个文件包含了当使用useradd命令创建新用户时默认的设置,如用户的主目录、默认shell等。
  6. /etc/login.defs

    • 定义了登录过程中的各种参数,包括密码复杂性要求、用户ID和组ID的范围、密码有效期等。
  7. /etc/sudoers

    • 这个文件定义了哪些用户可以使用sudo命令,以及他们可以执行的命令。它通常由root用户编辑,使用visudo命令以防止编辑错误导致无法恢复的情况。
  8. /etc/skel

    • 这个目录包含了新用户主目录的模板文件,当使用useradd创建新用户时,该目录下的文件会被复制到新用户的主目录下。
    • /etc/skel目录是被 /usr/sbin/useradd使用,把想要新用户拥有的配置文件/etc/skel目录拷贝,常用的文件: .bash_profile   –.bashrc  –.bash_logout  – dircolors  –.inputrc.vimrc 
  9. /etc/pam.d/system-auth

    • PAM(Pluggable Authentication Modules)配置文件之一,用于控制用户认证过程,如密码策略。
  10. /etc/subuid 和 /etc/subgid

    • 这两个文件用于管理用户和组的辅助UID和GID,通常用于容器和沙箱环境

以上文件在Linux系统中起着至关重要的作用,确保了系统的安全性和用户管理的正确性。在修改这些文件时应格外小心,尤其是当涉及到用户权限和密码信息时,最好作为root用户操作,并且充分了解修改的后果。

/etc/adduser.conf

adduser命令是一个高级的用户添加工具,它不仅添加用户到系统,还处理了很多额外的任务,如设置用户的主目录、默认shell、用户组等。

/etc/adduser.conf 文件包含了多个配置项,可以用来调整adduser命令的行为。以下是一些常见的配置项:

  1. HOME_DIR

    • 设置新用户的主目录位置。默认通常是/home/%u,其中%u会被替换为用户名。
  2. SHELL

    • 指定新用户的默认shell。例如,/bin/bash
  3. GROUPS

    • 指定新用户应该自动加入的组。这可以是一个组名,也可以是多个组名的列表,组名间用空格分隔。
  4. USERGROUP

    • 控制是否为新用户创建同名的私有组。如果设置为yes,则会为每个新用户创建一个与用户名相同的组。
  5. SKELETON_DIR

    • 指定新用户主目录的骨架目录,即在创建用户主目录时要复制的模板目录。默认情况下,这通常是/etc/skel
  6. CREATE_HOME

    • 决定是否为新用户创建主目录。默认情况下,adduser会创建主目录,但如果不需要,可以通过将此选项设置为no来禁用。
  7. ENCRYPT_METHOD

    • 指定密码加密的方法。例如,可以设置为SHA512MD5
  8. USER_TEMPLATE

    • 指定一个模板文件,该文件包含用于新用户的默认.bashrc.profile等文件的内容。
  9. USER_SCRIPT

    • 指定一个脚本,在用户添加后运行,可以用于执行自定义的初始化任务。
  10. DEFAULT_EXPIRE_DATE

    • 设置用户账户的默认过期日期。

修改/etc/adduser.conf文件可以让你更加精细地控制新用户账户的创建过程,确保新用户符合你的系统策略和安全要求。然而,修改此文件时应谨慎,因为不正确的配置可能导致问题。在修改后,使用adduser命令创建新用户时,将遵循新的配置规则。

添加用户的过程:

在Linux系统中添加新用户通常涉及以下几个步骤,这里以命令行操作为例:

  1. 创建用户账户 使用useraddadduser命令创建用户账户。这两个命令在大多数Linux发行版中都是可用的,但具体使用哪个取决于你的发行版。adduser实际上是useradd的一个封装,提供了更多的交互性和错误检查。

    sudo useradd [选项] 用户名

    或者

    sudo adduser 用户名

    例如,创建一个名为johndoe的新用户:

    sudo useradd johndoe

    或者使用adduser

    sudo adduser johndoe

    使用adduser时,系统会提示你输入更多关于新用户的详细信息,如密码、用户信息、用户组等。

  2. 设置用户密码 新创建的用户账户最初是没有密码的,因此你需要使用passwd命令来设置密码:

    sudo passwd johndoe

    输入两次相同的密码来确认。

  3. 创建用户的主目录 默认情况下,useradd命令会创建用户的主目录,除非使用了--no-create-home选项。如果主目录未被创建,你可以手动创建:

    sudo mkdir /home/johndoe

    并且改变目录的所有权:

    sudo chown johndoe:johndoe /home/johndoe
  4. 设置用户的shell 如果你想更改用户默认使用的shell,可以在创建用户时使用-s选项,或者之后使用chsh命令:

    sudo usermod -s /bin/bash johndoe
  5. 添加用户到特定组 你可以使用usermod命令将用户添加到额外的组,或者在创建用户时使用-G-g选项:

    sudo usermod -aG wheel,admin johndoe
  6. 验证用户信息 可以使用cat /etc/passwdid命令查看新用户的详细信息:

    id johndoe

完成上述步骤后,你就成功添加了一个新用户到Linux系统中。请注意,执行这些命令时,通常需要root权限或使用sudo。如果在管理大量用户时,可以考虑编写脚本来自动化这个过程。

修改用户属性:

usermod命令在Linux中用于修改用户账户的各种属性。以下是usermod命令的一些常见选项和用法:

  1. 修改用户名

    sudo usermod -l 新用户名 旧用户名

    将旧用户名更改为新用户名。

  2. 修改用户的主目录

    sudo usermod -d 新目录路径 用户名

    更改用户的主目录。如果使用-m选项,还会移动用户的家目录文件到新的位置。

  3. 修改用户ID (UID)

    sudo usermod -u 新UID 用户名

    改变用户的UID。需要注意的是,改变UID可能会引起与系统上其他依赖于原UID的应用程序或服务的冲突。

  4. 修改用户的组ID (GID)

    sudo usermod -g 新GID 用户名

    更改用户的主组GID。

  5. 添加用户到附加组

    sudo usermod -aG 组名 用户名

    将用户添加到一个或多个附加组。

  6. 更改用户的登录Shell

    sudo usermod -s 新ShellPath 用户名

    更改用户登录时默认启动的Shell。

  7. 设置用户密码过期日期

    sudo usermod -e YYYY-MM-DD 用户名

    设置用户的密码过期日期。

  8. 锁定用户账户

    sudo usermod -L 用户名

    锁定用户账户,使其不能登录。

  9. 解锁用户账户

    sudo usermod -U 用户名

    解锁用户账户,允许其正常登录。

  10. 更改用户账户的备注信息

    sudo usermod -c "新备注信息" 用户名

    更改用户账户在/etc/passwd文件中的备注信息。

使用usermod命令时,通常需要root权限。如果缺少必要的权限,可以使用sudo命令来执行usermod

请记得,在修改用户的UID或主目录时,一定要确保用户当前没有正在运行的进程,否则可能会导致进程出现问题。在修改用户的UID时,还要确保没有文件或目录拥有这个UID,否则可能需要更新相应的文件和目录的所有权。

另外,当修改用户的主目录时,使用-m选项会移动用户的家目录文件,但如果目标目录已经存在,可能会覆盖或合并现有的文件,因此在执行之前需要谨慎考虑。

进程管理相关命令:

Linux进程概念

在Linux系统中,进程是操作系统资源分配和调度的基本单位,它是正在运行的程序的实例。每个进程都有唯一的进程标识符(PID),并且拥有自己的虚拟地址空间、内存段、打开文件列表、环境变量、当前工作目录、权限集、状态信息等。进程之间通过不同的通信机制(如管道、信号、共享内存、消息队列等)进行通信。

进程的状态包括:

D:    不可中断的静止        
R:    正在执行中
S:    阻塞状态
T:    暂停执行
Z:    不存在但暂时无法消除
<:    高优先级的进程
N:    低优先级的进程
L:    有内存分页分配并锁在内存中
  • 运行状态(Running):进程正在运行或等待CPU时间。
  • 就绪状态(Ready):进程在等待CPU时间,一旦分配到CPU时间,即可运行。
  • 阻塞状态(Blocked):进程正在等待某个事件发生(如I/O操作完成)。
  • 停止状态(Stopped):进程被暂停,等待外部信号恢复。
  • 僵尸状态(Zombie):进程已完成执行,但其父进程尚未读取其退出状态。
  • 退出状态(Exited):进程已完成执行,等待系统回收资源。

使用ps命令查看进程

ps命令用于报告当前系统的进程状态。基本语法如下:

ps [选项]

常用选项包括:

  • -A 或 aux:显示所有进程的信息。
  • -u:显示用户进程的信息。
  • -f:显示完整的命令行信息,包括执行命令的完整路径和参数。
  • -ef 或 -aux:结合使用,显示系统中所有进程的详细信息。
  • -w 显示加宽可以显示较多的资讯
  • -au 显示较详细的资讯

示例:

ps aux

这会列出系统中所有进程的详细信息,包括用户、CPU和内存使用情况、运行时间、命令等。

使用kill命令终止进程

kill命令用于向进程发送信号,最常用的信号是SIGTERM(终止信号,默认值)和SIGKILL(强制终止信号)。PID是进程号 ,kill 命令向指定的进程发出一个信号,在默认的情况下,kill 命令向指定进程发出信号15,正常情况下,将杀死那些不捕捉或不忽略这个信号的进程。

基本语法如下:

kill [信号] PID

kill [信号] PID

例如,要终止PID为1234的进程,可以使用:

kill 1234

kill -SIGTERM 1234

如果进程不响应SIGTERM信号,可以使用SIGKILL信号强制终止:

kill -SIGKILL 1234

但是,SIGKILL信号不会给进程留下任何清理的机会,因此在尝试SIGTERM失败后再使用SIGKILL

top命令是Linux系统中一个非常强大的实时系统监控工具,它可以动态地显示系统中各个进程的资源占用状况,包括CPU使用率、内存使用情况、运行时间和优先级等。top命令提供了一个交互式的界面,使用户能够实时观察系统中进程的动态变化,并进行一些简单的管理操作。

top命令:

 top - 11:05:29 up 2 days, 18:55,  1 user,  load average: 0.67, 0.56, 0.53
 Tasks: 177 total,   2 running, 175 sleeping,   0 stopped,   0 zombie
 %Cpu(s):  0.6 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
 KiB Mem : 16249236 total, 15397612 free,   330252 used,   521372 buff/cache
 KiB Swap:        0 total,        0 free,        0 used. 15731704 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND  
  1000 johndoe  20   0   12512   1480   1128 S   0.0  0.0   0:00.00 bash    
  2945 johndoe  20   0   14128   1612   1264 R   0.3  0.0   0:00.00 top     

输出解释

  • 系统信息行:显示系统运行时间、在线用户数、平均负载等信息。
  • 任务状态行:显示系统当前的进程总数、正在运行的进程数、睡眠中的进程数、停止的进程数和僵尸进程数。
  • CPU使用率行:显示CPU的使用情况,包括用户态、内核态、空闲、等待I/O等。
  • 内存使用情况行:显示物理内存和交换区的使用情况。
  • 进程列表:列出系统中每个进程的信息,包括PID、用户、优先级、虚拟内存大小、实际内存大小、共享内存大小、状态、CPU使用率、内存使用率、累计CPU时间以及命令名称。

交互式操作

top命令支持多种交互式操作,例如:

  • P:按CPU使用率排序进程列表。
  • M:按内存使用量排序进程列表。
  • N:按PID排序进程列表。
  • k:杀死选定的进程。
  • r:重新安排进程的优先级。
  • h:显示帮助信息。
  • q:退出top命令。

pstree命令:

pstree命令在Linux中用于以树状格式展示系统中所有进程的层次结构,树状图将会以 pid (如果有指定) 或是以init这个基本进程为根,如果有指定使用者id, 则树状图会只显示该使用者所拥有的进程。 它可以帮助你可视化地理解进程间的父子关系,这对于系统管理和故障排查非常有用。pstree命令通常会显示每个进程的PID(进程ID),以及进程的命令名称。

基本用法

运行pstree命令而不带任何参数,将显示当前系统中所有正在运行的进程的树状结构:

pstree

常用选项

pstree命令支持多种选项,以提供更多或更具体的输出:

  • -p:显示每个进程的PID。
  • -u:显示指定用户的进程。
  • -a:显示完整的命令行,包括参数。
  • -l:显示长格式的进程信息。
  • -c:显示进程的控制终端(TTY)。
  • -g:显示进程的GID(组ID)。
  • -h:高亮显示当前用户拥有的进程。
  • -r:递归显示子进程,这是默认行为,但如果系统中有大量进程,加上此选项可以确保所有子进程都被显示出来。
  • -s:显示线程信息(如果系统支持)。

示例

以下是一些pstree命令的示例用法:

  • 显示所有进程的树状结构,包括PID:

    pstree -p
  • 显示用户root的所有进程:

    stree -u root
  • 显示所有进程的完整命令行信息:

    pstree -a
    -a 显示该进程的完整指令及参数, 如果是被记忆体置换出去的进程则会加上括号 
    -c 如果有重覆的进程名, 则分开列出
  • 显示所有进程的PID和完整的命令行信息:

    pstree -ap

注意事项

  • pstree命令可能需要root权限才能查看某些进程的详细信息,特别是那些属于其他用户的进程。
  • 在某些Linux发行版中,pstree命令可能需要安装额外的包才能使用,比如procpssysvinit-utils

pstree是一个非常直观的工具,特别适合于理解和分析复杂的进程依赖关系,尤其是在大型服务器环境中。

linux文件系统的类型和结构:

linux是一种兼容性很高的操作系统,支持的文件系统格式很多,大体可分以下几类:
–磁盘文件系统:指本地主机中实际可以访问到的文件系统,包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:autofs、coda、Ext(Extended File sytem,扩展文件系统)、Ext3、Ext4、VFAT、ISO9660(通常是CD-ROM)、UFS(Unix File System,Unix文件系统)、FAT、FAT16、FAT32、NTFS等;
–网络文件系统:是可以远程访问的文件系统,这种文件系统在服务器端仍是本地的磁盘文件系统,客户机通过网络远程访问数据。常见文件系统格式有:NFS、Samba等;
–专有/虚拟文件系统:不驻留在磁盘上的文件系统。常见格式有:TMPFS(临时文件系统)、PROCFS(Process File System,进程文件系统)和LOOPBACKFS(Loopback File System,回送文件系统)。

ext2:早期的Linux文件系统,不支持日志记录。
ext3:在ext2的基础上增加了日志功能,提高了数据一致性。
ext4:进一步改进了ext3,支持更大的文件和卷大小,提高了性能,支持更高效的磁盘空间管理。
XFS:高性能的文件系统,特别适合大文件和大规模存储环境,具有优秀的并发性能和对大数据集的支持。
Btrfs:提供了先进的功能,如快照、透明压缩、校验和、重复数据删除等,具有良好的可扩展性和容错性。
ZFS:强大的数据完整性和可靠性,支持快照、数据镜像、压缩等,但需注意的是,虽然ZFS在某些Linux发行版中可用,但它源自Solaris,并且在某些方面可能与标准的Linux文件系统管理工具不兼容。
FAT/FAT32/exFAT:主要用于与Windows和其他操作系统之间的兼容性,如USB驱动器和SD卡。
NTFS:Windows的原生文件系统,Linux通过第三方驱动支持读写NTFS。
ReiserFS:一种日志文件系统,设计用于提高大文件的性能,但在一些Linux发行版中已被弃用。
JFS:IBM开发的日志文件系统,用于高性能服务器环境。
HFS/HFS+:苹果Mac OS的原生文件系统,Linux通过第三方驱动支持。
APFS:Apple File System,是苹果最新的文件系统,Linux通过实验性驱动支持。
NFS:网络文件系统,允许远程主机像访问本地文件系统一样访问文件系统。
CIFS/SMB:用于与Windows网络共享的文件系统协议。
tmpfs:一种基于RAM的临时文件系统,提供高速存储但断电后数据丢失。
ProcFS:提供关于运行中进程和系统内核的信息,用于调试和监控。
SysFS:提供关于系统硬件和设备树的信息。
Devtmpfs:动态生成设备节点的文件系统。
OverlayFS: 允许文件系统层次结构的叠加,用于容器技术中。
UnionFS/Aufs: 用于创建多个目录的组合视图,也用于容器技术。
SquashFS: 只读压缩文件系统,用于固件映像和嵌入式设备。
UBIFS/JFFS2/YAFFS: 专为闪存设备设计的文件系统,用于嵌入式系统。


目前Ext4是Linux系统广泛使用的一种文件格式。在Ext3基础上,对有效性保护、数据完整性、数据访问速度、向下兼容性等方面做了改进。
最大特点是日志文件系统:可将整个磁盘的写入动作完整地记录在磁盘的某个区域上,以便在必要时回溯追踪。

SCSI与IDE设备命名:
•sata硬盘的设备名称是“/dev/sda”
–/dev/sda1 
–/dev/sdb3 
•IDE硬盘的设备名称是“/dev/hda”
–/dev/hdc2 
•如果很在意系统的高性能和稳定性,应该使用SCSI硬盘
•cat /proc/partitions

Linux分区的命名方式 :

•字母和数字相结合
•前两个字母表示设备类型
–“hd”代表IDE硬盘
–“sd”表示SCSI或SATA硬盘
•第三个字母说明具体的设备
–“/dev/hda”表示第一个IDE硬盘
–“/dev/hdb”表示第二个IDE硬盘

交换分区:

将内存中的内容写入硬盘或从硬盘中读出,称为内存交换(swapping)
•交换分区最小必须等于计算机的内存
•可以创建多于一个的交换分区
•尽量把交换分区放在硬盘驱动器的起始位置

Linux文件系统结构:

是一个树形的分层组织结构。将根(/)作为整个文件系统的惟一起点,其他所有目录都从该点出发。将Linux的全部文件按照一定的用途归类,合理地挂载到这颗“大树”的“树枝”或“树叶”上,如图所示。而这些全不用考虑文件的实际存储位置,无论是存在硬盘上,还是在CD-ROM或USB存储器中,甚至是网络终端。

  • /:根目录,所有其他目录的起点。
  • /bin:基本的用户二进制文件。
  • /boot:存放引导加载程序和内核的文件。
  • /dev:设备文件。
  • /etc:系统配置文件。
  • /home:用户主目录。
  • /lib:库文件。
  • /media:媒体设备挂载点。
  • /mnt:临时挂载点。
  • /opt:可选应用软件包。
  • /proc:进程和系统信息的虚拟文件系统。
  • /root:超级用户(root)的主目录。
  • /sbin:系统管理员的二进制文件。
  • /srv:服务数据文件。
  • /sys:内核和硬件信息的虚拟文件系统。
  • /tmp:临时文件。
  • /usr:用户程序和数据。
  • /var:可变数据,如日志文件和邮件。

目录名

描述

/

Linux文件系统根目录

/bin

存放系统中最常用的可执行文件(二进制)

/boot

存放Linux内核和系统启动文件,包括Grublilo启动器程序

/dev

存放所有设备文件,包括硬盘、分区、键盘、鼠标、USBtty

/etc

存放系统的所有配置文件,例如passwd存放用户账户信息,hostname存放主机名等

/home

用户主目录的默认位置

/initrd

存放启动时挂载initrd.img映像文件的目录,以及载入所需设备模块的目录。

/lib

存放共享的库文件,包含许多被/bin/sbin中程序使用的库文件

/lost+found

存放由fsck放置的零散文件

/media

Ubuntu系统自动挂载CD-ROM、软驱、USB存储器后,存放临时读入的文件

/mnt

该目录通常用于作为被挂载的文件系统的挂载点

/opt

作为可选文件和程序的存放目录,主要被第三方开发者用来简易地安装和卸装他们的软件包

/proc

存放所有标志为文件的进程,它们是通过进程号或其他的系统动态信息进行标识,例如cpuinfo文件存放CPU当前工作状态的数据

/root

根用户(超级用户)的主目录

/sbin

存放更多的可执行文件(二进制),包括系统管理、目录查询等关键命令文件

/srv

/sys

/tmp

存放用户和程序的临时文件,所有用户对该目录都有读写权限

/usr

用于存放与系统用户直接有关的文件和目录,例如应用程序及支持它们的库文件。以下罗列了/usr中部分重要的目录。

/usr/X11R6

X Window系统

/usr/bin

用户和管理员的标准命令

/usr/include

c/c++等各种开发语言环境的标准include文件

/usr/lib

应用程序及程序包的连接库

/usr/local

系统管理员安装的应用程序目录

/usr/local/share

系统管理员安装的共享文件

/usr/sbin

用户和管理员的标准命令

/usr/share

存放使用手册等共享文件的目录

/usr/share/dict

存放词表的目录

/usr/share/man

系统使用手册

/usr/share/misc

一般数据

/usr/share/sgml

SGML数据

/usr/share/xml

XML数据

/var

通常用于存放长度可变的文件,例如日志文件和打印机文件。以下罗列了/var其中部分重要的目录。

/var/cache

应用程序缓存目录

/var/crash

系统错误信息

/var/games

游戏数据

/var/lib

各种状态数据

/var/lock

文件锁定纪录

/var/log

日志记录

/var/mail

电子邮件

/var/opt

/opt目录的变量数据

/var/run

进程的标示数据

/var/spool

存放电子邮件,打印任务等的队列目录。

/var/tmp

临时文件目录

Linux文件系统

Windows文件系统

文件格式

使用的主要文件格式有:EXT2EXT3RerserFSISO9660vfat

使用的主要文件格式有:FAT16

FAT32NTFS

存储结构

逻辑结构犹如一颗倒置的树。将每个硬件设备视为一个文件,置于树形的文件系统层次结构中。因此,Linux系统的某一个文件就可能占有一块硬盘,甚至是远端设备,用户访问时非常自然

逻辑结构犹如多颗树(森林)。将硬盘划分为若个分区,与存储设备一起(例如CD-ROMUSB存储器等),使用驱动器盘符标识,例如A:代表软驱、C:代表硬盘中的第一个分区等。

与硬盘分区的关系

分区在目录结构中

目录结构在分区中

文件命名

Linux文件系统中严格区分大小写,MyFile.txtmyfile.txt指不同的文件。区分文件类型不依赖于文件后缀,可以使用程序file命令判断文件类型。

windows文件系统中不区分大小写,MyFile.txtmyfile.txt是指同一个文件。使用文件后缀来标识文件类型。例如使用“.txt”表示文本文件。

路径分隔符

Linux使用斜杠“/”分隔目录名,例如“/home/usr/share”,其中第一个斜杠是根目录(/),绝对路径都是以根目录作为起点

Windows使用反斜杠“\”分隔目录名,例如“C:\program \username”,绝对路径都是以驱动器盘符作为起点

文件与目录权限

Linux最初的定位是多用户的操作系统,因而有完善文件授权机制,所有的文件和目录都有相应的访问权限

Windows最初的定位是单用户的操作系统,内建系统时没有文件权限的概念,后期的Windows逐渐增加了这方面的功能

文件系统相关命令:

在Linux中,file, mkdir, rmdirln 是处理文件和目录的基本命令。下面是每个命令的简要说明和用法:

1. file 命令

file 命令用于确定文件的类型。它通过检查文件的内部结构,而不是文件扩展名,来判断文件的种类。例如,它可以识别文本文件、二进制文件、图像文件、符号链接等。

语法:

file [选项] 文件名...

示例:

file example.txt

2. mkdir 命令

mkdir 命令用于创建新的目录。你可以一次创建多个目录,也可以创建嵌套的目录结构。

语法:

mkdir [选项] 目录名...

示例:

mkdir new_directory
mkdir -p path/to/new/directory

这里 -p 选项允许你递归创建目录,即使父目录不存在也会创建。

3. rmdir 命令

rmdir 命令用于删除空目录。如果目录不为空,你不能使用 rmdir 删除它;你需要先清空目录,或者使用 rm 命令带 -r 选项来递归删除。

语法:

rmdir [选项] 目录名...

示例:

rmdir empty_directory

创建链接文件:

Linux中有两种类型的链接:
硬链接是利用Linux中为每个文件分配的物理编号——inode建立链接。因此,硬链接不能跨越文件系统。
软链接(符号链接)是利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性。
需要注意的是,如果是修改硬链接的目标文件名,链接依然有效;如果修改软链接的目标文件名,则链接将断开;对一个已存在的链接文件执行移动或删除操作,有可能导致链接的断开。假如删除目标文件后,重新创建一个同名文件,软链接将恢复,硬链接不再有效,因为文件的inode已经改变。

4. ln 命令

ln 命令用于创建硬链接或符号链接(软链接)。硬链接指向文件的索引节点,而符号链接则指向文件的名字。

语法:

  • 创建硬链接:
    ln 源文件 目标文件
  • 创建符号链接:
    ln -s 源文件 目标文件

示例:

ln original_file link_to_original
ln -s original_file symbolic_link

使用示例

假设你在 /home/user 目录下工作,下面是一些实际的例子:

  • 使用 file 查看 example.txt 的类型:

    file /home/user/example.txt
  • 创建一个名为 notes 的新目录:

    mkdir /home/user/notes
  • 创建一个名为 documents 的目录,如果父目录不存在,则同时创建:

    mkdir -p /home/user/documents
  • 删除一个空目录 empty_folder

    rmdir /home/user/empty_folder
  • 创建一个指向 important_file 的硬链接 link1

    ln /home/user/important_file /home/user/link1
  • 创建一个指向 important_file 的符号链接 link2

    ln -s /home/user/important_file /home/user/link2

文件归档和压缩:

归档文件是将一组文件或目录保存在一个文件中。
压缩文件也是将一组文件或目录保存一个文件中,并按照某种存储格式保存在磁盘上,所占磁盘空间比其中所有文件总和要少。


gzip是Linux中最流行的压缩工具,具有很好的移植性,可在很多不同架构的系统中使用。bzip2在性能上优于gzip,提供了最大限度的压缩比率。如果用户需要经常在Linux和微软Windows间交换文件,建议使用zip。 

压缩工具

解压工具

文件扩展名

gzip

gunzip

.gz

bzip2

bunzip2

.bz2

zip

unzip

.zip

gzipgunzip 命令是在 Unix/Linux 系统中常用的用于文件压缩和解压缩的工具。尽管它们看似两个独立的命令,但实际上 gunzip 往往是 gzip 的一个别名或硬链接,这意味着它们实际上是同一个程序的不同调用方式。

gzip

gzip 命令用于将文件压缩成较小的体积,压缩后的文件通常会被追加 .gz 扩展名。它使用 Lempel-Ziv 编码(LZ77)的变体进行压缩。

常用选项:

  • -9:设置最高的压缩级别,压缩比率更高,但压缩速度较慢。
  • -k:保留原始文件,压缩后的新文件会被命名为 filename.gz
  • -v:显示详细的压缩过程信息。
  • -n:在压缩时,不保存文件名和时间戳。
  • -l:列出压缩文件的简要信息。

基本用法:

gzip [选项] 文件名
  •  压缩文件:
    gzip file.txt
  • 解压文件:
    gzip -d file.txt.gz
gunzip

gunzip 命令用于解压缩由 gzip 压缩的文件,即将 .gz 后缀的文件还原为其原始状态。

常用选项:

  • -f:强制解压缩,即使输出文件已经存在也会覆盖。
  • -k:保留压缩文件,不解压到原始文件名,而是解压到 filename.gz.orig
  • -v:显示详细的解压缩过程信息。
  • -c:将解压缩的数据输出到标准输出,而不是写入文件。

基本用法:

gunzip [选项] 文件名.gz

示例:

  • 解压缩文件 example.txt.gz
    gunzip example.txt.gz
    这将生成原始文件 example.txt

通用选项

除了上述特定于 gzipgunzip 的选项外,还有一些通用选项,如 -d,当使用 gzip 命令时,可以用来解压缩文件,这使得 gzipgunzip 实际上是可互换的。

示例:

  • 使用 gzip 解压缩文件:
    gzip -d example.txt.gz

管道操作

gzipgunzip 命令还支持管道操作,这使得可以在命令行中轻松地压缩或解压缩数据流。

示例:

  • 将标准输入压缩为标准输出:
    cat input.txt | gzip > output.txt.gz
  • 将标准输入解压缩为标准输出:
    gzip -dc input.txt.gz > output.txt

 tar (Tape ARchive)

tar 命令主要用于创建和操作归档文件,将若干文件或目录合并为一个文件,以便备份和压缩。tar 本身不提供压缩功能,但可以与压缩工具如gzip, bzip2, xz 结合使用。当然,之后出现tar程序的改进版本,可以实现在合并归档的同时进行压缩。tar命令符号模式的一般语法格式为:

常用选项:

  • -c: 创建新的归档文件。
  • -x: 解包或解压缩归档文件。
  • -t: 列出归档文件的内容。
  • -f: 指定归档文件的名称。
  • -z: 使用 gzip 压缩或解压缩。
  • -j: 使用 bzip2 压缩或解压缩。
  • -J: 使用 xz 压缩或解压缩。
  • -u: 更新归档文件
  • -v: 显示归档和释放的过程信息

示例:

  • 创建一个归档文件:
    tar -czvf archive.tar.gz directory/
  • 解压归档文件:
    tar -xzvf archive.tar.gz

​​​

	linux@ubuntu:~$ tar  –cf   myExamples.tar      myExamples
	linux@ubuntu:~$ tar  -cjf   myExamples.tar.bz   myExamples
	linux@ubuntu:~$ tar  -czf  myExamples.tar.gz    myExamples
	linux@ubuntu:~$ ls   -lh   myExamples.tar* 
	-rw-r--r-- 1  wdl  wdl  9.3M  2007-09-23 00:42  myExamples.tar
	-rw-r--r-- 1  wdl  wdl  8.6M  2007-09-23 00:43  myExamples.tar.bz
	-rw-r--r-- 1  wdl  wdl  8.5M  2007-09-23 00:44  myExamples.tar.gz
tar –cf myExamples.tar myExamples 这个命令创建了一个名为myExamples.tar的tar存档文件,
其中包含了myExamples目录下的所有文件和子目录。这里没有使用任何压缩,
所以这是未压缩的tar存档。

tar -cjf myExamples.tar.bz myExamples 这个命令创建了一个
名为myExamples.tar.bz的tar存档文件,并且使用了bzip2压缩算法对存档进行压缩。
结果是一个.bzip2或者.bz2扩展名的压缩存档文件。

tar -czf myExamples.tar.gz myExamples 这个命令创建了一个
名为myExamples.tar.gz的tar存档文件,并且使用了gzip压缩算法对存档进行压缩。
这是最常见的压缩格式之一。

最后,你使用ls -lh myExamples.tar*命令来查看所有以myExamples.tar开头的文件列表,
并以长格式(包含文件大小、权限等信息)展示。这个命令会显示三个文件的详细信息,即:

myExamples.tar (未压缩)
myExamples.tar.bz (bzip2压缩)
myExamples.tar.gz (gzip压缩)

如果想查看一下归档文件中的详细内容,使用类似以下命令:

linux@ubuntu~$ tar  –tvf   myExamples.tar.gz

使用以下命令完成tar文件的释放。其中,“tar -xjf”和“tar –xzf”等效与先解压缩后释放tar文件。

linux@ubuntu:~$ tar  –xvf   myExamples.tar
linux@ubuntu:~$ tar  -xvjf   myExamples.tar.bz
linux@ubuntu:~$ tar  -xvzf  myExamples.tar.gz
  • 3. bzip2

bzip2 命令提供比 gzip 更高的压缩比率,压缩后的文件通常以 .bz2 扩展名结尾。

示例:

  • 压缩文件:
    bzip2 file.txt
  • 解压文件:
    bzip2 -d file.txt.bz2
 xz

xz 命令提供极高的压缩比率,适用于长期存储,压缩后的文件通常以 .xz 扩展名结尾。

示例:

  • 压缩文件:
    xz file.txt
  • 解压文件:
    xz -d file.txt.xz
zip 和 unzip

zip 命令用于创建 zip 格式的压缩文件,unzip 命令用于解压 zip 文件。

示例:

  • 压缩文件:
    zip archive.zip file1 file2 directory/
  • 解压文件:
    unzip archive.zip

注意事项

  • 在压缩和解压文件时,确保有足够的磁盘空间。
  • 大多数归档和压缩工具支持管道操作,例如,可以直接从标准输入压缩到标准输出。
  • 不同的压缩工具在压缩速度和压缩比率之间有所权衡,选择合适的工具取决于具体需求。

网络配置管理:

实现Linux网络配置的惟一目标就是修改系统中众多的网络配置文件,如/etc/interfaces、/etc/hosts,/etc/resolv.conf 等等。

通常,用户可能使用普通以太网卡、无线网卡、调制解调器等不同类型的设备接入网络。不同类型的网络设备在主机中被映射为相应的网络接口,比如以太网卡映射为eth,无线网卡映射为wlan。
有时,用户还可能同时使用多个网络设备,就会出现eth0、eth1…,或wlan0、wlan1…的情况。

那么,如何标识每个连接到Internet的网络接口呢?
 解决办法是:为每个网络接口分配一个全世界范围内惟一的32bit的标识符。这个标识符就是IP(Internet Protocol)地址。 


配置IP地址:


   接入网络的计算机主机依靠IP地址,惟一地标识其在网络中的身份,因此为主机配置IP地址是接入网络的关键。
    配置IP地址的方法有两种:
     配置静态IP:在主机进入网络之前,事先为主机设置固定的IP地址;
     配置动态IP:选择DHCP网络服务,在主机进入网络之后,动态随机获取IP地址。


Ifconfig命令:


    ifconfig是GNU/Linux中配置网卡的基本命令,包含在net-tools软件包中。它可用于显示或设置网卡的配置,如IP地址、子网掩码、最大分组传输数、IO端口等,还可以启动或禁用网卡。
    ifconfig命令有以下两种格式:

 ifconfig  [interface]
 ifconfig  interface [aftype] option | address…

ifconfig的第一种格式用于查看当前系统的网络配置情况;
第二种格式用于配置网卡,包括添加、删除网卡,以及绑定多个IP地址等。

从下面的运行结果可以看出,主机有两个接口eth0、lo。lo代表主机本身,也称回送接口(Loopback),其IP地址约定为127.0.0.1。

如果主机安装了第二块、第三块网卡,则有eth1,eth2标识。常见的接口类型还有以下几种(N表示接口号):
 pppN表示调制解调设备
 wlanN表示无线网卡
 trN表示令牌环网卡

 如果只是关心某个网络设备,可以在ifconfig后面加上接口名称,则只显示该设备的相关信息,例如:

linux@ubuntu:~$ ifconfig   eth1


假设主机现有的IP地址为192.168.182.129,需要为其重新分配IP地址192.168.182.128,即。使用ipconfig命令设置主机的第一块网卡(eth0)的IP地址。

配置动态IP地址 :


在大型网络中,由于存在许多的移动计算机系统,随时都可能进入网络,在每次更换网络时,就不得不重新配置网络信息。
如果计算机在网络里能够自动获取IP地址、子网掩码、路由表、DNS服务器地址等网络信息,具有动态配置IP的能力,就可以大大简化客户端的网络配置难度。
动态主机配置协议(DHCP,Dynamic Host Configuration Protocol)可以实现动态分配IP资源。

只要在局域网中架设有DHCP服务器,在Ubuntu Linux中为主机配置DHCP客户端是非常容易的。需要说明的是,通常普通以太网卡和无线网卡可以配置动态IP,而调制解调器等网络设备不能配置动态IP。 
       

 linux@ubuntu:~$ dhclient

 动态IP的获取过程:
         可比作一个“租赁”过程。DHCP服务器好比是IP地址的出租方,用户主机(即DHCP客户端)好比是IP地址的临时租用者。  
        如果将用户主机设置为DHCP客户端之后,手动启动网络服务,就可以从执行结果中看出获取动态IP的过程。
        执行过程中包括以下四个阶段。
        a. 客户端寻找DHCP服务器(DHCPDISCOVER):客户端广播申请动态IP的请求;
        b. 服务器提供可分配的IP地址(DHCPOFFER):所有接收到请求的DHCP服务器都将向客户端提供一个IP地址;
        c. 客户端接受IP地址租借(DHCPREQUEST):客户端从多个IP选择中挑选一个,通知DHCP服务器,并标识出所选中的服务器;
        d. 服务器确认租借IP(DHCPACK):被选中的DHCP服务器最后发出一个确认信息,包含IP地址、子网掩码、默认网关、DNS服务器和租借期(客户端使用这个IP的这段时间,称为租借期)。
        最终客户端临时“租借”的IP地址为192.168.182.129。

wdl@ubuntuwdl:~$ sudo  /etc/init.d/networking   restart
Internet Systems Consortium DHCP Client V3.0.4
Copyright 2004-2006 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/
Listening on LPF/eth0/00:0c:29:7e:77:96
Sending on LPF/eth0/00:0c:29:7e:77:96
Sending on Socket/fallback
DHCPDISCOVER   on   eth0   to   255.255.255.255   port 67 interval 7
DHCPOFFER       from   192.168.182.254
DHCPREQUEST    on eth0 to 255.255.255.255 port 67
DHCPACK          from 192.168.182.254
bound to           192.168.182.129        -- renewal  in  808 seconds.

IP地址存放在哪里——interfaces配置文件 


      无论是配置静态IP还是动态IP,计算机系统将IP信息保存放在什么地方?答案是配置文件“/etc/network/interfaces”。
     在Ubuntu Linux启动时就能获得IP地址的配置信息。若是配置静态IP,就从配置文件中读取IP地址参数,直接配置网络接口设备;
     若是配置动态IP,就通知主机通过DHCP协议获取网络配置。
     以下分别为配置静态IP和动态IP时,配置文件“/etc/network/interfaces”的实例。

DNS客户端配置文件—resolv.conf


 Ubuntu Linux将DNS服务器地址保存在配置文件/etc/resolv.conf中。
依然延续上面的例子,添加DNS服务器IP地址后,查看配置文件/etc/hosts,如下所示。

      linux@ubuntu:~$ cat   /etc/resolv.conf
            nameserver  172.16.28.1
            nameserver  202.204.58.2
            nameserver  192.168.182.2


 ping命令:

ping(Packet Internet Groper)命令可能是最有名气的网络连接检测工具。
它使用了Internet控制报文协议(ICMP)回送请求与回送应答报文,测试两个主机之间的连通性。
ping命令测试的远程主机,既可用域名,也可用IP地址标识。

  ping  [DomainName | IP-address]


可以使用该命令来判断主机与远程主机是否可达,或之间的网络是否拥塞。min/avg/max/mdev是ping命令的完成测试后的统计结果,分别表示最小响应时间/平均响应时间/最大响应时间/响应时间方差。这些指标用于反应网络的联通程度。

    linux@ubuntu:~$ ping  www.ustb.edu.cn


ping命令执行时,会持续不断地向目的主机发送ICMP包。在得到对方的应答后,显示每次连接的统计数据,直到用Ctrl+C组合键中断执行。但是,目前很多主机通过设置防火墙,对ping命令不予应答。在这种情况下,ping命令由于不停地发送测试数据包,又得不到返回任何结果,而致使ping命令僵死。
       不过,使用-c参数设置发送测试数据包的次数,以便在有限时间内完成测试。    

linux@ubuntu:~$ ping  -c 3   www.google.com
            PING www-china.l.google.com (66.249.89.99) 56(84) bytes of data.
            --- www-china.l.google.com ping statistics ---
            3 packets transmitted, 0 received, 100% packet loss, time 2000ms


管理DNS服务器地址 


         DNS域名解析可以在更大范围的计算机网络、Internet,提供域名到IP地址的转换。
网络中的每台计算机都是一个DNS客户端,向DNS服务器提交域名解析的请求;DNS服务器完成域名到IP地址的映射。
        因此DNS客户端至少有一个DNS服务器地址,作为命名解析的开端。


nslookup命令:


   使用nslookup命令可以查看当前系统所使用的DNS服务器的IP地址。

   linux@ubuntu:~$ nslookup   www.google.com
        Server:   192.168.182.2
        Address:   192.168.182.2#53
        Non-authoritative answer:
        www.google.com canonical name = www.l.google.com.
        www.l.google.com canonical name = www-china.l.google.com.
        Name: www-china.l.google.com
        Address: 66.249.89.99


         服务器192.168.182.2完成了域名解析。Server表示提供服务的DNS服务器,Address中的#53表示TCP/UDP命名服务的端口号。若所有的DNS服务器都访问失败,则出现如下的执行结果。

        linux@ubuntu:~$ nslookup   www.google.com
        ;;   connection timed out;   no servers could be reached


    
shell编程:

Linux Shell编程是利用Shell脚本来自动化任务、处理文件和数据、以及控制和管理系统的重要手段。Shell脚本是由一系列命令和函数组成的脚本文件,可以在Shell环境中运行。下面是一些关键概念和技巧,帮助你入门Linux Shell编程:

shell 编程的基本过程:

step1. 建立 shell 文件
       包含任意多行操作系统命令或shell命令的文本文件;

$ cat  prog1.sh
      date

step2. 赋予shell文件执行权限
       用chmod命令修改权限;

      $ chmod  740  prog1.sh

step3. 执行shell文件
       直接在命令行上调用shell程序.

      $ prog1.sh
        prog1.sh: not found    
      (shell在标准搜索路径中找不到prog1.sh)

Step4: 指定路径或修改环境变量PATH后执行shell程序

      $ ./prog1.sh  
      2009年  12月  16日  星期二  14:52:57  CST

1. Shell 脚本基础

  • 脚本文件:创建一个文本文件,通常以.sh扩展名保存。
  • 执行权限:使用chmod +x filename.sh给脚本文件添加执行权限。
  • Shebang 行:脚本的第一行应该指定解释器路径,如#!/bin/bash#!/bin/sh

2. 变量

Bourne Shell有如下四种变量:

用户自定义变量:

在shell编程中通常使用全大写变量,方便识别 
$ COUNT=1

变量的调用:在变量前加$ 
$ echo $HOME 

Linux Shell/bash从右向左赋值
$Y=y
$ X=$Y
$ echo $X 
y 
使用unset命令删除变量的赋值 
$ Z=hello 
$ echo $Z 
hello 
$ unset Z 
$ echo $Z 

位置变量即命令行参数 :

$0   与键入的命令行一样,包含脚本文件名
$1,$2,……$9  分别包含第一个到第九个命令行参数
$#   包含命令行参数的个数
$@   包含所有命令行参数:“$1,$2,……$9”
$?   包含前一个命令的退出状态
$*   包含所有命令行参数:“$1,$2,……$9”
$$   包含正在执行进程的ID号

预定义变量 :

环境变量:

HOME: /etc/passwd文件中列出的用户主目录 
IFS:Internal Field Separator, 默认为空格,tab及换行符
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>) 
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等 
  • 声明变量:不需要显式声明类型,直接赋值即可,如VAR="Hello World",将任何赋给变量的值都解释为一串字符
  • 引用变量:使用${VAR}$VAR来引用变量。
  • 环境变量:可以在整个系统范围内定义的变量,如PATHHOME等。

3. 控制结构

  • 条件语句:使用ifelifelsefi关键字。
  • 语法结构:
             if    表达式
                     then  命令表
             fi     
    如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 
    if和fi是条件语句的语句括号, 必须成对使用;
    命令表中的命令可以是一条, 也可以是若干条。
     
  • if [ "$VAR" = "value" ]; then
        echo "Match found."
    else
        echo "No match."
    fi
  • 例子:
    shell程序prog2.sh(测试命令行参数是否为已存在的文件或目录)。用法为:
              ./prog2.sh   file
    
    代码如下:  
    #The statement of  if…then…fi                 (注释语句)
    if   [  -f   $1  ]         (测试参数是否为文件)
    then
    	echo "File  $1  exists"                     (引用变量值)
    fi
    if   [  -d   $HOME/$1  ]                    (测试参数是否为目录)
    then 
    	echo "File  $1 is  a  directory"       (引用变量值)
    
    执行prog2程序:
    $ ./prog2.sh   prog1.sh
    File  prog1.sh exists
          $0为prog2.sh;  $1为prog1.sh, 是一个已存在的文件.
    $ ./prog2.sh   backup
    File  backup is  a directory
          $0为prog2.sh;  $1为backup,是一个已存在的目录.
    
  • if…then…else…fi
    语法结构为:
            if      表达式
            then 命令表1
            else  命令表2
            fi
    如果表达式为真, 则执行命令表1中的命令, 再退出if语句; 否则执行命令表2中的语句, 再退出if语句.
     

  • case…esac 
    多路分支语句case用于多重条件测试, 语法结构清晰自然.  其语法为:
         case   字符串变量   in
                模式1)
                           命令表1
                            ;;
                模式2 | 模式3)   
                           命令表2
                            ;;
                 ……
                模式n)
                           命令表n
                            ;;
        esac

  • 实例.  程序prog4.sh检查用户输入的文件名, 用法为:
               ./prog4.sh    string_name
    # The statement of  case…esac
    if   [  $#  -eq  0  ]
    then
    		echo  "No argument is declared"
    		exit
    fi
    case  $1  in
    		file1)
    			echo  "User selects file1"
    			;;
    		file2)
    			echo  "User selects file2"
    			;;
    		*)
    			echo  "You must select either file1 or file2!"
    			;;
    esac

  • 循环语句forwhileuntil循环。
  • 当循环次数已知或确定时,使用for循环语句来多次执行一条或一组命令。  循环体由语句括号do和done来限定。格式为:                
        for   变量名   in   单词表
                  do
                          命令表
                   done
    变量依次取单词表中的各个单词,  每取一次单词, 就执行一次循环体中的命令.  循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
    如果单词表是命令行上的所有位置参数时, 可以在for语句中省略 “in  单词表” 部分。
    # The statement of for…do…done
    if  [  !  -d  $HOME/backup  ]
    then
    	mkdir  $HOME/backup
    fi
    flist=`ls`
    for  file  in  $flist
    do
    	if   [  $#  =  1  ]
    	then
    		if   [  $1  =  $file  ]
    		then
    			echo  "$file  found" ;  exit
    		fi
    	else
    		cp  $file  $HOME/backup
    		echo  "$file  copied"
    	fi
    done
    echo   ***Backup  Completed***
    
  • for i in {1..5}; do
        echo $i
    done

语法结构为:
                  while    命令或表达式
                        do
                           命令表
                        done
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
while语句的退出状态为命令表中被执行的最后一条命令的退出状态。

创建文件程序prog6,  批量生成空白文件,用法为:
              prog6   file   [number]  ./a.sh file  6
# The statement for  while
if [ $# = 2 ]
then
		loop=$2
else
		loop=5
fi
i=1
while  [  $i  -lt   $loop  ]
do
		> $1$i
		i=`expr  $i  +  1`
done

break 和 continue 
      break  n  则跳出n层;  
    continue语句则马上转到最近一层循环语句的下一轮循环上,  
    continue  n则转到最近n层循环语句的下一轮循环上.

实例.  程序prog7的用法为:
          prog7   整数   整数   整数 …
参数个数不确定, 范围为1~10个, 每个参数都是正整数。
 

if  [  $#  =  0  ]
then
		echo  "Numeric  arguments  required"
		exit
fi
if  [  $#  -gt   10  ]
then
		echo  "Only  ten  arguments  allowed"
		exit
fi
for  number
do
		count=`expr  $number  %  2`
		if  [  $count  -eq  1  ]
		then
			continue
		else
			output="$output   $number"
		fi
done
echo  "Even  numbers:  $output "

4. 函数

  • 定义函数:使用function_name(),并在其中编写命令序列。
    my_function() {
        echo "Hello from function"
    }

shell函数调用:

方式1:
value_name=`function_name  [arg1 arg2 … ]`
方式2:
function_name  [arg1  arg2  …  ]
echo   $?
例子:
check_user( )    {  #查找已登录的指定用户
	  user=`who  |  grep  $1 | wc -l`
        if [ $user –eq 0 ]
        then
               return  0       #未找到指定用户
        else
               return  1       #找到指定用户
        fi
}
while  true         # MAIN, Main, main:   program  begin  here
do
		echo  "Input username: \c"
		read   uname
		check_user  $uname       # 调用函数, 并传递参数uname
		if [ $? –eq  1 ]                 # $?为函数返回值
		then	echo  "user  $uname  online"
		else	echo  "user  $uname  offline"
		fi
done

函数变量作用域:

全局作用域:在脚本的其他任何地方都能够访问该变量。

局部作用域:只能在声明变量的作用域内访问。

声明局部变量的格式:
Local   variable_name =value

Scope()
{
Local lclvariable =1
Gblvariable = 2
echo “lclavariable in function = $ lclvariable ”
echo “Gblvariable in function = $ Gblvariable ”
}

Scope

echo “lclavariable in function = $ lclvariable ”
echo “Gblvariable in function = $ Gblvariable ”

5. 输入输出

  • 读取输入:使用read命令从标准输入读取数据。
    read -p "Enter your name: " NAME
    echo "Hello, $NAME!"
  • 重定向和管道:使用>>><|来控制输入输出。

6. 参数传递

  • 从命令行传递参数给脚本。
    #!/bin/bash
    echo "First argument is: $1"
    echo "Second argument is: $2"

7. 错误处理

  • 使用set -e来让脚本在遇到错误时立即退出。
  • 捕获错误码并采取行动:command || echo "Error occurred."

8. 特殊变量

  • $#:脚本接收到的参数数量。
  • $*:所有参数作为一个字符串。
  • $@:所有参数作为单独的字符串。
  • $0:脚本的名称。

9. 文本处理

  • 使用awksedgrep等工具处理文本文件。

10. 脚本调试

  • 使用set -x来打开调试模式,显示脚本执行的每一行命令。
  • 添加注释:使用#开始行注释。

11. 脚本优化

  • 使用局部变量和函数减少全局命名空间的污染。
  • 避免不必要的I/O操作,比如频繁读写文件。

示例脚本

#!/bin/bash

# Check if two arguments are provided
if [ $# -ne 2 ]; then
    echo "Usage: $0 arg1 arg2"
    exit 1
fi

# Assign arguments to variables
ARG1=$1
ARG2=$2

# Compare the arguments
if [ "$ARG1" = "$ARG2" ]; then
    echo "Arguments are equal."
else
    echo "Arguments are not equal."
fi

shell功能语句:

shell 程序由零或多条shell语句构成。 shell语句包括三类:说明性语句、功能性语句和结构性语句。
说明性语句:
以#号开始到该行结束,不被解释执行,注释行可以出现在程序中的任何位置,既可以单独占用一行,  也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如:

#! /bin/sh 
# 
# 本程序说明
#
command_1 
command_2                  # command_2的语句说明
……
# 下面程序段的说明
command_m
……
command_n                  # commandn_语句的说明
……

功能性语句: 
任意的shell命令、用户程序或其它shell程序。

read从标准输入读入一行, 并赋值给后面的变量,其语法为:
       read  var
     把读入的数据全部赋给var
       read  var1  var2  var3
   把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, 
……把其余所有的词赋给最后一个变量.如果执行read语句时标准输入无数据, 则程序在此停留等侯, 
直到数据的到来或被终止运行
# example1  for  read
echo  "Input  your  name: \c"
read  username
echo  "Your name is  $username"

#example2  for  read
echo "Input  date  with  format  yyyy  mm dd: \c"
read  year  month  day
echo  "Today  is  $year/$month/$day,  right?"
echo  "Press  enter  to  confirm  and  continue\c"
read  answer
echo "I  know  the  date,  bye!"

结构性语句:
条件测试语句、多路分支语句、循环语句、循环控制语句等。             

expr命令:

expr 命令在 Linux Shell 脚本中用于进行算术运算、字符串操作和比较表达式。它是一个非常基础但功能强大的命令,尤其在早期的 Shell 脚本中被广泛使用,尽管现代 Shell 如 Bash 提供了更简便的内置算术和字符串操作功能。以下是 expr 命令的一些主要用途和语法:

算术运算

expr 可以用于基本的数学运算,如加、减、乘、除和求模。

语法:

expr expression operator expression

示例:

result = $(expr 5 + 3)
echo $result  # 输出 8

字符串操作

expr 支持一些基本的字符串操作,如获取字符串长度、查找子字符串的位置和截取字符串。

语法:

  • 长度:expr length string
  • 查找:expr index "string" "substring"
  • 截取:expr substr "string" start end

示例:

len = $(expr length "Hello")
echo $len  # 输出 5

pos = $(expr index "Hello World" "World")
echo $pos  # 输出 7

substr = $(expr substr "Hello World" 7 5)
echo $substr  # 输出 World

比较表达式

expr 也可以用于比较数字和字符串,常用于条件语句中。

语法:

  • 数字比较:expr num1 operator num2
  • 字符串比较:expr str1 operator str2

示例:

num1 = 5
num2 = 3
result = $(expr $num1 \> $num2)
if [ $result -eq 1 ]; then
    echo "num1 is greater than num2"
fi

注意点

  • 在进行算术或比较运算时,操作符前后需要加空格。
  • 对于比较表达式,expr 返回的结果是数字,0 表示假,非0表示真。
  • 当使用 expr 进行字符串比较时,它会按照字典顺序进行比较。

现代 Shell 的替代方案

在现代 Shell 脚本中,如 Bash,通常推荐使用更简洁的语法进行算术和字符串操作:

  • 算术运算:$((expression))
  • 字符串长度:${#variable}
  • 查找子字符串:${string%%substring*}
  • 截取字符串:${string:start:end}

test语句:

在Linux中,test命令(也可以写作[[)用于测试表达式的真假,并返回一个退出状态(0表示真,非0表示假)。test命令可以用来比较文件属性、字符串、数值等,是条件判断和流程控制的基础。test语句可测试三种对象:  字符串     整数     文件属性

每种测试对象都有若干测试操作符      例如:

      test  "$answer"  =  "yes"
      变量answer的值是否为字符串yes
      test  $num –eq  18
      变量num的值是否为整数18
      test  -d  tmp    
      测试tmp是否为一个目录名

语法

test expression

[ expression ]

文件测试操作符:用于测试文件的各种属性,如文件是否存在、是否为目录、是否可读等。

  • -O 文件由当前用户拥有
  • -G 文件属于当前用户的主组
  • -z 字符串长度为0(用于字符串测试)
  • -d name    测试name 是否为一个目录
    -e name    测试一个文件是否存在
    -f name    测试name 是否为普通文件
    -L name    测试name 是否为符号链接
    -r name    测试name 文件是否存在且为可读
    -w name    测试name 文件是否存在且为可写
    -x name    测试name 文件是否存在且为可执行
    -s name    测试name 文件是否存在且其长度不为0
    f1 -nt f2  测试文件f1 是否比文件f2 更新
    f1 -ot f2  测试文件f1 是否比文件f2 更旧
     

字符串测试操作符:用于比较和测试字符串。

  • string1 = string2 字符串相等
  • string1 != string2 字符串不相等
  • -z string 字符串为空
  • -n string 字符串非空

数值测试操作符:用于数值比较。

  • num1 -eq num2 等于
  • num1 -ne num2 不等于
  • num1 -lt num2 小于
  • num1 -le num2 小于等于
  • num1 -gt num2 大于
  • num1 -ge num2 大于等于

组合使用逻辑操作符:可以使用逻辑操作符来组合多个测试。

  • -a 逻辑与(AND)
  • -o 逻辑或(OR)

示例

以下是一些使用test命令的示例:

  1. 检查文件是否存在:
if [ -e "myfile.txt" ]; then
    echo "File exists."
else
    echo "File does not exist."
fi
  1. 检查文件是否为目录并且可读:
if [ -d "mydir" ] && [ -r "mydir" ]; then
    echo "Directory is readable."
else
    echo "Directory is not readable or does not exist."
fi
  1. 比较两个字符串是否相等:
if [ "$var1" = "$var2" ]; then
    echo "Strings are equal."
else
    echo "Strings are not equal."
fi
  1. 检查数值是否大于另一个数值:
if [ "$num1" -gt "$num2" ]; then
    echo "num1 is greater than num2."
else
    echo "num1 is less than or equal to num2."
fi

注意,test命令的表达式中,操作符和操作数之间必须有空格。此外,[]也可以用于代替test命令,但是为了清晰和避免潜在的语法问题,建议使用test命令。

在编写脚本时,test命令是实现条件判断的关键工具,确保脚本能够根据不同的情况做出正确的响应。

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值