《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)

第一章   Linux shell入门


一、Linux操作系统一般包括四个主要部分:

linux内核;

GNU实用程序;

图形桌面环境;

应用软件;



二、内核的主要功能:

1、系统内存管理

2、软件程序管理

3、硬件管理

4、文件系统管理


三、系统内存管理

1、内存管理是操作系统内核的主要功能之一,内核不仅可以管理服务器上可用的物理内存,而且能够创建并管理虚拟内存,或者说非实际存在的内存。

2、内存管理必须要使用硬盘空间,该空间称为交换空间swap space,内核不断的在交换空间和实际物理内存之间交换虚拟内存位置的内容,这样系统认为可用的内存比实际存在的内存多。

3、将内存位置分组为多个数据块,此操作称为分页;内核定位物理内存或交换空间中的每个内存分页,然后维护一个内存分页表,此表说明位于物理内存的分页和交换到磁盘的分页。

4、内核跟踪使用的内存分页,并自动将一段时间没有访问的内存分页复制到交换空间区域,称为换出,即使内存仍然够用也会这样做;程序需要访问已经换出的内存分页时,内核必须换出另一个内存分页,以在物理内存中为该内存分页腾出空间,然后从交换空间换入需要的分页;显然,该过程比较耗时,可能会降低运行速度。


/proc/meminfo,可以看出Linux系统中虚拟内存的当前状态。/proc/meminfo项的实例为:

hangma@ubuntu:~$ cat /proc/meminfo
MemTotal:        1026624 kB   :物理内存空间
MemFree:          361240 kB    :物理内存空间的空闲空间
Buffers:           57400 kB
Cached:           291488 kB
SwapCached:            0 kB
Active:           328060 kB
Inactive:         242940 kB
Active(anon):     229988 kB
Inactive(anon):      180 kB
Active(file):      98072 kB
Inactive(file):   242760 kB
Unevictable:       32680 kB
Mlocked:           32680 kB
HighTotal:        135048 kB
HighFree:           1768 kB
LowTotal:         891576 kB
LowFree:          359472 kB
SwapTotal:       1046524 kB          :  交换空间
SwapFree:        1046524 kB
Dirty:               496 kB
Writeback:             0 kB
AnonPages:        254808 kB
Mapped:           108472 kB
Shmem:               968 kB
Slab:              24940 kB
SReclaimable:      12956 kB
SUnreclaim:        11984 kB
KernelStack:        2848 kB
PageTables:         6464 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1559836 kB
Committed_AS:    2249904 kB
VmallocTotal:     122880 kB
VmallocUsed:       22016 kB
VmallocChunk:      98812 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       28664 kB
DirectMap2M:      884736 kB


5、默认情况下,在Linux系统上运行的每个进程都有自己专用的内存分页,一个进程不能访问另一个进程正在使用的内存分页;内核也有自己的内存区域,任何其他进程不能访问内核进程使用的内存;

要促进数据共享,可以创建共享内存分页,通用共享内存区域可以供多个进程读取和写入,内核维护和管理共享内存区域,并允许单个进程访问共享区域。


6、使用特殊命令ipcs可以查看系统当前的共享内存分页:

hangma@ubuntu:~$ ipcs -m


------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status 


四、软件程序管理

、ps命令查看Linux系统中当前运行的进程。使用ps命令得到输出:

hangma@ubuntu:~$ ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init
    2 ?        S      0:00 [kthreadd]
    3 ?        S      0:00 [ksoftirqd/0]
    6 ?        S      0:00 [migration/0]
    7 ?        S      0:00 [watchdog/0]
    8 ?        S<     0:00 [cpuset]
    9 ?        S<     0:00 [khelper]
   10 ?        S      0:00 [kdevtmpfs]
   11 ?        S<     0:00 [netns]
   12 ?        S      0:00 [sync_supers]
   13 ?        S      0:00 [bdi-default]
   14 ?        S<     0:00 [kintegrityd]
   15 ?        S<     0:00 [kblockd]
   16 ?        S<     0:00 [ata_sff]
   17 ?        S      0:00 [khubd]
   18 ?        S<     0:00 [md]
   21 ?        S      0:00 [khungtaskd]
   22 ?        S      0:00 [kswapd0]
   23 ?        SN     0:00 [ksmd]
   24 ?        SN     0:00 [khugepaged]
   25 ?        S      0:00 [fsnotify_mark]
   26 ?        S      0:00 [ecryptfs-kthrea]
   27 ?        S<     0:00 [crypto]
   36 ?        S<     0:00 [kthrotld]
   38 ?        S      0:00 [kworker/u:2]
   39 ?        S      0:00 [scsi_eh_0]
   40 ?        S      0:00 [scsi_eh_1]
   41 ?        S      0:00 [kworker/u:3]
   43 ?        S<     0:00 [binder]
   62 ?        S<     0:00 [deferwq]
   63 ?        S<     0:00 [charger_manager]
   64 ?        S<     0:00 [devfreq_wq]
   66 ?        S      0:00 [kworker/0:2]
  202 ?        S<     0:00 [mpt_poll_0]
  203 ?        S<     0:00 [mpt/0]
  219 ?        S      0:00 [scsi_eh_2]
  234 ?        S      0:00 [jbd2/sda1-8]
  235 ?        S<     0:00 [ext4-dio-unwrit]
  336 ?        S      0:00 upstart-udev-bridge --daemon
  342 ?        Ss     0:00 /sbin/udevd --daemon
  426 ?        Ss     0:00 dbus-daemon --system --fork
  482 ?        Ss     0:00 /usr/sbin/bluetoothd
  496 ?        Sl     0:00 rsyslogd -c5
  503 ?        S      0:00 avahi-daemon: running [ubuntu.local]
  504 ?        S      0:00 avahi-daemon: chroot helper
  517 ?        S<     0:00 [krfcommd]
  555 ?        S<     0:00 [ttm_swap]
  565 ?        S      0:00 /sbin/udevd --daemon
  566 ?        S      0:00 /sbin/udevd --daemon
  572 ?        Ss     0:00 /usr/sbin/cupsd -F
  603 ?        Sl     0:00 /usr/lib/i386-linux-gnu/colord/colord
  656 ?        S<     0:00 [kpsmoused]
  745 ?        S      0:00 [kworker/0:4]
  809 ?        S      0:00 upstart-socket-bridge --daemon
  891 ?        Ss     0:00 tpvmlpd2
  987 ?        Ss     0:00 /usr/sbin/sshd -D
 1016 ?        Ss     0:00 /usr/sbin/modem-manager
 1029 ?        Ssl    0:00 NetworkManager
 1032 ?        Sl     0:00 /usr/lib/policykit-1/polkitd --no-debug
 1089 tty4     Ss+    0:00 /sbin/getty -8 38400 tty4
 1100 tty5     Ss+    0:00 /sbin/getty -8 38400 tty5
 1114 tty2     Ss+    0:00 /sbin/getty -8 38400 tty2
 1115 tty3     Ss+    0:00 /sbin/getty -8 38400 tty3
 1120 tty6     Ss+    0:00 /sbin/getty -8 38400 tty6
 1134 ?        Ss     0:00 anacron -s
 1136 ?        Ss     0:00 acpid -c /etc/acpi/events -s /var/run/acpid.socket
 1137 ?        Ss     0:00 cron
 1138 ?        Ss     0:00 atd
 1141 ?        Ssl    0:00 whoopsie
 1143 ?        SLsl   0:00 lightdm
 1173 tty7     Rs+    4:17 /usr/bin/X :0 -core -auth /var/run/lightdm/root/:0 -n
 1341 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
 1365 ?        Sl     0:00 /usr/lib/accountsservice/accounts-daemon
 1399 ?        Sl     0:00 /usr/sbin/console-kit-daemon --no-daemon
 1752 ?        Sl     0:00 /usr/lib/upower/upowerd
 1805 ?        Ssl    0:00 /usr/sbin/vmware-vmblock-fuse -o subtype=vmware-vmblo
 1856 ?        S      0:13 /usr/sbin/vmtoolsd
 2035 ?        SNl    0:00 /usr/lib/rtkit/rtkit-daemon
 2075 ?        Sl     0:00 lightdm --session-child 12 23
 2112 ?        Sl     0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
 2123 ?        Ssl    0:00 gnome-session --session=ubuntu
 2158 ?        Ss     0:00 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-s
 2161 ?        S      0:00 /usr/bin/dbus-launch --exit-with-session gnome-sessio
 2162 ?        Ss     0:00 //bin/dbus-daemon --fork --print-pid 5 --print-addres
 2165 ?        Sl     0:00 /usr/lib/at-spi2-core/at-spi-bus-launcher
 2169 ?        S      0:00 /bin/dbus-daemon --config-file=/etc/at-spi2/accessibi
 2172 ?        Sl     0:00 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-s
 2182 ?        Sl     0:01 /usr/lib/gnome-settings-daemon/gnome-settings-daemon
 2192 ?        Sl     0:00 /usr/lib/gvfs/gvfsd
 2196 ?        Sl     0:00 /usr/lib/gvfs//gvfsd-fuse -f /run/user/hangma/gvfs
 2203 ?        Sl     2:37 compiz
 2214 ?        S  2217 ?        S      0:00 /usr/lib/pulseaudio/pulse/gconf-helper
 2219 ?        S      0:00 /usr/lib/i386-linux-gnu/gconf/gconfd-2
 2223 ?        Sl     0:00 /usr/lib/dconf/dconf-service
 2226 ?        Sl     0:01 nautilus -n
 2228 ?        Sl     0:00 bluetooth-applet
 2229 ?        Sl     0:00 /usr/lib/policykit-1-gnome/polkit-gnome-authenticatio
 2230 ?        Sl     0:00 nm-applet
 2232 ?        Sl     0:00 /usr/lib/gnome-settings-daemon/gnome-fallback-mount-h
 2234 ?        Sl     0:14 /usr/lib/vmware-tools/sbin32/vmtoolsd -n vmusr --bloc
 2253 ?        Sl     0:00 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
 2259 ?        Sl     0:00 /usr/lib/udisks2/udisksd --no-debug
 2272 ?        Sl     0:00 /usr/lib/gvfs/gvfs-afc-volume-monitor
 2277 ?        Sl     0:00 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
 2289 ?        Sl     0:00 /usr/lib/gvfs/gvfsd-trash --spawner :1.7 /org/gtk/gvf
 2295 ?        Sl     0:00 /usr/lib/gvfs/gvfsd-burn --spawner :1.7 /org/gtk/gvfs
 2332 ?        Sl     0:00 /usr/lib/bamf/bamfdaemon
 2341 ?        Ss     0:00 /bin/sh -c /usr/bin/gtk-window-decorator
 2342 ?        Sl     0:00 /usr/bin/gtk-window-decorator
 2353 ?        Sl     0:00 /usr/lib/unity/unity-panel-service
 2355 ?        Sl     0:00 /usr/lib/indicator-appmenu/hud-service
 2372 ?        Sl     0:00 /usr/lib/indicator-messages/indicator-messages-servic
 2373 ?        Sl     0:00 /usr/lib/indicator-datetime/indicator-datetime-servic
 2376 ?        Sl     0:00 /usr/lib/indicator-sound/indicator-sound-service
 2378 ?        Sl     0:00 /usr/lib/indicator-session/indicator-session-service
 2379 ?        Sl     0:00 /usr/lib/indicator-printers/indicator-printers-servic
 2381 ?        Sl     0:00 /usr/lib/i386-linux-gnu/indicator-application-service
 2407 ?        Sl     0:00 /usr/lib/evolution/evolution-source-registry
 2417 ?        Sl     0:00 /usr/lib/unity-lens-files/unity-files-daemon
 2418 ?        Sl     0:00 /usr/lib/gwibber/unity-gwibber-daemon
 2419 ?        Sl     0:00 /usr/lib/unity-lens-applications/unity-applications-d
 2421 ?        Sl     0:00 /usr/lib/i386-linux-gnu/unity-music-daemon
 2423 ?        Sl     0:00 /usr/bin/python3 /usr/lib/unity-lens-photos/unity-len
 2427 ?        Sl     0:00 /usr/lib/i386-linux-gnu/unity-shopping-daemon
 2428 ?        Sl     0:00 /usr/bin/python /usr/lib/unity-lens-video/unity-lens-
 2477 ?        Sl     0:00 /usr/lib/geoclue/geoclue-master
 2479 ?        Sl     0:00 /usr/bin/zeitgeist-daemon
 2498 ?        Sl     0:00 /usr/lib/ubuntu-geoip/ubuntu-geoip-provider
 2506 ?        Sl     0:00 /usr/lib/zeitgeist/zeitgeist-fts
 2507 ?        Sl     0:00 zeitgeist-datahub
 2514 ?        S      0:00 /bin/cat
 2545 ?        Sl     0:00 /usr/bin/python3 /usr/lib/unity-lens-files/unity-scop
 2559 ?        Sl     0:00 telepathy-indicator
 2562 ?        Sl     0:00 /usr/bin/python /usr/lib/unity-scope-video-remote/uni
 2563 ?        Sl     0:00 /usr/lib/i386-linux-gnu/unity-musicstore-daemon
 2600 ?        Sl     0:00 /usr/lib/telepathy/mission-control-5
 2605 ?        Sl     0:00 /usr/bin/signon-ui
 2609 ?        Ss     0:00 /bin/sh -c gnome-terminal
 2610 ?        Sl     0:02 gnome-terminal
 2615 ?        S      0:00 gnome-pty-helper
 2616 pts/0    Ss     0:00 bash
 2674 ?        Sl     0:00 update-notifier
 2694 ?        S      0:00 /usr/bin/python /usr/lib/system-service/system-servic
 2698 ?        SNl    0:02 /usr/bin/python3 /usr/bin/update-manager --no-update 
 2723 ?        Sl     0:00 /usr/lib/i386-linux-gnu/deja-dup/deja-dup-monitor
 2741 ?        S      0:00 [kworker/0:0]
 3455 ?        S      0:00 [flush-8:0]
 3551 ?        S      0:00 /usr/lib/cups/notifier/dbus dbus:// 
 3734 pts/0    R+     0:00 ps ax


第三列是进程的当前状态,S表示休眠,SW表示休眠并等待,R表示运行;进程名在最后一列显示;方括号中的进程表示该进程不活动,因而已经从内存换出到磁盘交换空间中。可以看出大部分进程已经换出。



五、硬件管理

linux系统需要与之通信的设备都必须在内核代码中插入驱动程序代码;驱动程序代码使内核能够向设备传输数据,它的作用就像是应用程序与硬件之间的中间人。

在Linux内核中插入设备驱动程序代码有两种方法:

1、在内核中编译驱动程序;

2、向内核中添加驱动程序模块;


开发人员开发了内核模块,可以在运行内核中插入驱动程序代码而无需重新编译内核,此外,当设备使用完毕后,可以从内核中移除内核模块,这极大的简化并扩展了linux对硬件的使用;


Linux将硬件设备标识为特殊文件,称为设备文件,设备文件分为3类:

字符

网络

1、字符设备文件用于哪些一次仅处理一个字符的设备;大部分调制解调器和终端类型都识别为字符文件;

2、块文件用于那些一次可处理大量数据块的设备,如磁盘驱动器

3、网络文件类型用于那些使用数据包发送和接收数据的设备;包括网卡和特殊回路设备;



Llinux为系统的每个设备创建特殊文件,称为节点;所有与设备的通信都设通过设备节点完成的;每个节点都有唯一的数字对,Linux内核使用数字对标识该节点;数字对包含主设备号和次设备号;


六、文件系统管理

《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第1张图片


          Linux内核使用虚拟文件系统与每个文件系统进行链接,这为内核与其他文件系统类型的通信提供了一个标准接口,挂载和使用每个文件系统时,VFS在内存中缓存相关信息。



七、GNU使用程序

1、核心GNU实用程序

GNU项目的目的主要是使UNIX系统管理员有一个类似Unix环境;提供给Linux系统的核心实用程序包称为coreutils软件包,由3部分组成:

处理文件的实用程序;

操作文本的实用程序;

管理进程的实用程序;



第三章 基本的bash shell命令

一、/etc/passwd文件包含了一个所有系统用户账户组成的列表,以及一些关于每个用户的基本配置信息;例如:

angma:x:1000:1000:video-hadoop,,,:/home/hangma:/bin/bash

每个条目都有7个数据字段,使用冒号分隔;系统使用这些字段中的数据向用户分配具体的特性;这些字段由:

用户名;用户密码;用户系统用户ID编号;用户的系统组ID编号;用户的全名;用户默认的主目录;用户默认的shell程序;


二、控制命令行提示符的环境变量有两个:

1:PS1:控制默认命令行提示符的格式:

hangma@ubuntu:~$ echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

2:PS2:控制第二层命令行提示符的格式

hangma@ubuntu:~$ echo $PS2
>

man  bash可以查看bash shell的整个手册页面


三、文件系统

1、Linux在一个目录结构中存储文件,该目录称为虚拟目录;虚拟目录包含PC上安装的所有存储设备的文件路径,它们都合并为一个目录结构;

2、Linux虚拟目录结构包含一个基本目录,称为根目录;根目录以下的目录和文件根据到达它们的目录路径列出;

3、Linux虚拟目录最神奇的地方在于结合每个存储设备的方式;安装在Linux PC中的第一个硬盘称为根驱动器;跟驱动器包含虚拟目录的核心,其他目录都是从这里开始创建的。

4、在根驱动器中,Linux创建的一些名为挂载点的特殊目录,挂载点是虚拟目录中用于分配额外存储设备的目录;

5、虚拟目录使文件和目录都出现在这些挂载点目录中,即使它们实际上存储在另一个驱动器中;

系统文件往往存储在根驱动器中,而用户文件则存储在其他驱动器中;


四、通用Linux目录名称

目录 用法
/ 虚拟目录的根目录,通常此处没有文件,
/bin 二进制目录,存储许多GNU用户级别的使用程序
/boot 引导目录,存储引导文件
/dev 设备目录,Linux在该目录中创建设备节点
/etc 系统配置文件目录
/home 主目录,lInux在该目录中创建用户目录
/lib 库目录,存储系统和应用程序库文件
/media 媒体目录,可移动媒体设备常用的挂载点
/mnt 挂在目录,另一个可移动媒体设备常用的挂载点:是不是就是mount命令映射磁盘时
/opt 可选目录,常用存储可选软件包
/root 根主目录
/sbin 系统二进制目录,存储许多GNU管理级别的使用程序
/tmp 临时目录,可以在该目录中创建和销毁临时工作文件
/usr 用户安装软件的目录
/var 可变目录,用户经常更改的文件,比如日志文件
   



五、linux终端显示文件不同颜色代表的含义:

1、白色:表示普通文件

2、蓝色:表示目录

3、绿色:表示可执行文件

4、红色:表示压缩文件

5、浅蓝色:链接文件

6、红色闪烁:表示链接文件有问题

7、黄色:表示设备文件

8、灰色:表示其他文件


LS_COLORS环境变量控制该特性;


六、ls命令相关

1、也可以用-F参数与ls命令配置实用,轻松区分文件和目录;

ls -F

ffmpeg-1.2.1/  ffmpeg-1.2.1.tar.bz2  yasm-1.2.0/  yasm-1.2.0.tar.gz

要将隐藏的文件和普通文件和目录一起显示,可以使用-a参数:

hangma@ubuntu:~/test$ ls -a
.  ..  ffmpeg-1.2.1  ffmpeg-1.2.1.tar.bz2  yasm-1.2.0  yasm-1.2.0.tar.gz


2、-R参数:显示包含在当前目录的所有目录中的文件:

ls  -F  -R


3、-l参数生成长列表格式,提供目录中的每个文件的详细信息:

ls -l

hangma@ubuntu:~/test$ ls -l
total 7244
drwxr-xr-x 16 hangma hangma    4096 Jun  3 10:08 ffmpeg-1.2.1
-rw-rw-r--  1 hangma hangma 5968378 Jun  3 10:02 ffmpeg-1.2.1.tar.bz2
drwxrwxr-x 11 hangma hangma    4096 Jun  3 10:04 yasm-1.2.0
-rw-rw-r--  1 hangma hangma 1436502 Jun  3 10:02 yasm-1.2.0.tar.gz


输出的第一行显示目录中所包含的数据块总数;之后每一行都包含每个文件的一下信息:

(1)文件类型:比如:d:目录;-:文件;c:字符设备;b:块设备

(2)文件权限:

(3)指向该文件的硬链接数量

(4)文件所有者的用户名称

(5)文件所属的组的名称

(6)文件的字节大小

(7)上次修改文件的时间

(8)文件或目录名称


4、组合选项:

-a:列出所有文件

-i:列出每个文件的索引节点

-l:列出长列表

-s:列出文件的块大小

hangma@ubuntu:~/test$ ls -sail
total 7252
1848642    4 drwxrwxr-x  4 hangma hangma    4096 Jun  3 10:03 .
1848609    4 drwxr-xr-x 21 hangma hangma    4096 Jun 27 14:23 ..
1848776    4 drwxr-xr-x 16 hangma hangma    4096 Jun  3 10:08 ffmpeg-1.2.1
1848765 5832 -rw-rw-r--  1 hangma hangma 5968378 Jun  3 10:02 ffmpeg-1.2.1.tar.bz2
1852266    4 drwxrwxr-x 11 hangma hangma    4096 Jun  3 10:04 yasm-1.2.0
1848775 1404 -rw-rw-r--  1 hangma hangma 1436502 Jun  3 10:02 yasm-1.2.0.tar.gz


第一个数字是文件或目录的索引节点编号;第二个数字是文件的块大小;第三个目录是文件类型以及文件的权限


5、过滤列表输出:

ls命令还提供一种在命令行定义过滤器的方法,它使用过滤器确定应该在输出中显示哪些文件或目录:

如果将特定文件的名称指定为过滤器,则ls命令将仅仅显示该文件的信息

hangma@ubuntu:~/test/ffmpeg-1.2.1$ ls -l ffmpeg
-rwxr-xr-x 1 root root 3606964 Jun  3 10:08 ffmpeg



当你可能还不知道要查找的文件的确切名称,这是ls命令可以使用标准的通配符字符,并使用它们匹配过滤器中的模式:

(1)问号表示一个字符

hangma@ubuntu:~/test/ffmpeg-1.2.1$ ls -l ffmpe?
-rwxr-xr-x 1 root root 3606964 Jun  3 10:08 ffmpeg

(2)星号表示零个或多个字符

hangma@ubuntu:~/test/ffmpeg-1.2.1$ ls -l ffmpeg*
-rwxr-xr-x 1 root   root    3606964 Jun  3 10:08 ffmpeg
-rw-r--r-- 1 hangma hangma   119760 May 10 08:16 ffmpeg.c
-rw-r--r-- 1 root   root       1878 Jun  3 10:08 ffmpeg.d
-rw-r--r-- 1 hangma hangma    33074 May 10 08:16 ffmpeg_filter.c
-rw-r--r-- 1 root   root       1530 Jun  3 10:08 ffmpeg_filter.d
-rw-r--r-- 1 root   root     126660 Jun  3 10:08 ffmpeg_filter.o
-rwxr-xr-x 1 root   root   14788248 Jun  3 10:08 ffmpeg_g
-rw-r--r-- 1 hangma hangma    13260 May 10 08:16 ffmpeg.h
-rw-r--r-- 1 root   root     335596 Jun  3 10:08 ffmpeg.o
-rw-r--r-- 1 hangma hangma   102278 May 10 08:16 ffmpeg_opt.c
-rw-r--r-- 1 root   root       1452 Jun  3 10:08 ffmpeg_opt.d
-rw-r--r-- 1 root   root     269552 Jun  3 10:08 ffmpeg_opt.o

五、复制文件

1、cp命令形式:

cp  source  destination


-R:这个参数很强大,可以递归复制整个目录的内容


-f:强制覆盖现有文件,没有提示

-i:覆盖文件前有提示

-l:创建文件链接而不是复制文件,这里创建的文件链接是硬链接

-s:创建符号链接而不是复制文件,即软连接


2、链接文件

如果需要在系统中维护同一个文件的两个副本,你不一定要使用两个物理副本,可以使用一个物理副本和多个虚拟副本,这种虚拟副本称为链接。

链接是目录中的占位符,指向文件的真实位置。


linux中有两种不同的文件链接类型:

(1)符号链接:

-s创建一个符号链接即软连接

cp -s test  test3

ls -il

1854450 -rw-rw-r--  2 hangma hangma       9 Jun 28 14:13 test
1856332 lrwxrwxrwx  1 hangma hangma       4 Jul  1 20:19 test3 -> test

注意:首先,新的文件test3的索引节点号和test不同,这表示linux系统将test和test3视为不同的文件;其次,文件大小不同;

链接文件只需要存储有关源文件的信息,而不是文件中的实际数据;列表的文件名部分实际显示了连个文件的关系:test3->test表示test3是test的符号链接。


最好不要创建符号链接的符号链接,因为这会创建一个连接链条,不仅会导致混淆,而且很容易遭到破。


(2)硬链接:

硬链接是创建一个单独的文件,其中包括有关源文件的信息和位置,引用该硬链接文件的效果和引用源文件一样:

cp -l test1 test2

这就是给文件test1创建一个硬链接test2

$cp -l test  test2

$ls -il

1854450 -rw-rw-r--  2 hangma hangma       9 Jun 28 14:13 test
1850977 -rw-rw-r--  1 hangma hangma       9 Jun 28 14:15 test1
1854450 -rw-rw-r--  2 hangma hangma       9 Jun 28 14:13 test2

可以发现test和test2的文件节点相同,这就表示它们是同一个文件,第三行即链接编号显示这两个文件都有两个链接。

注意:在同一物理介质的文件之间只能创建一个硬链接,不能在不同的挂载点下的文件之间创建硬链接,在这种情况下,你必须使用软连接。



3、重命名文件

重命名文件的过程称为移动:mv命令可以将文件和目录移动到另一个位置:

(1)mv  test test4

移动文件将更改文件名但保留原来的索引节点号和时间戳;

移动带有软连接的文件存在问题:

1856332 lrwxrwxrwx  1 hangma hangma       4 Jul  1 20:19 test3 -> test

此时test3指向一个无效文件,不再是一个有效连接,当你再次引用test3时,系统会提示你找不到该文件:

cp test3 test5
cp: cannot stat `test3': No such file or directory


(2)还可以使用mv命令移动目录:

整个目录的内容都没有变化,唯一改变的是目录的名称


4、删除文件

硬链接文件使用的索引节点编号与源文件相同,在移除了最后一个链接文件之前,硬链接将一直维护索引节点编号,并保留数据;

而软连接的处理方式是:底层文件不在了,那么链接指向内容自然也消失了;


rm -i  文件名

使用参数-i是可以提示是否删除,防止误删。


rm的命令的另一个特性是:如果需要移出很多文件并且不希望收到提示,则可以使用-f参数强制移出


rm -f test

强制移出文件test


删除目录的命令需要加上-r参数:

rm -r test

或者是

rmdir test



rm -rf test

shell允许使用组合参数并且只要添加一个-



5、查看文件内容

(1)stat命令提供文件系统中文件状态的完整摘要:

hangma@ubuntu:~/test$ mkdir testtest
hangma@ubuntu:~/test$ stat testtest/
  File: `testtest/'
  Size: 4096       Blocks: 8          IO Block: 4096   directory
Device: 801h/2049d Inode: 1850977     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/  hangma)   Gid: ( 1000/  hangma)
Access: 2013-07-01 20:40:29.617938701 +0800
Modify: 2013-07-01 20:40:29.617938701 +0800
Change: 2013-07-01 20:40:29.617938701 +0800
 Birth: -



stat命令的结果可以显示目标文件的所有信息,甚至包括存储该文件的设备的主设备号和次级设备号


(2)查看文件类型

file命令是一个方便的使用程序,它可以查看文件内部并确定文件的类型:

file命令将文件分为以下3类:

文本文件:包含可打印字符的文件;

可执行文件:可以在系统运行的文件;

数据文件:包括不可打印的二进制字符的文件,但也不可以在系统运行;

《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第2张图片


(3)查看整个文件

cat命令

-n参数为所有行编号

hangma@ubuntu:~/test$ cat -n test1
     1 djfkdsjfkldsjfkdsjjfdsjfkdlsjf
     2 sdjfds
     3 sdfjklfdg
     4 dsfgjks
     5 dsjfkds
     6 werjksdf
     7 fjkefj
     8
hangma@ubuntu:~/test$ cat test1
djfkdsjfkldsjfkdsjjfdsjfkdlsjf
sdjfds
sdfjklfdg
dsfgjks
dsjfkds
werjksdf
fjkefj



-b只显示带文本的行编号:

hangma@ubuntu:~/test$ cat -b test1
     1 djfkdsjfkldsjfkdsjjfdsjfkdlsjf
     2 sdjfds
     3 sdfjklfdg
     4 dsfgjks
     5 dsjfkds
     6 werjksdf
     7 fjkef






     8 j


     9 dsf
    10 sdf


    11 sdf
    12 grf


若不希望出现跳格字符,则用-t

hangma@ubuntu:~/test$ cat -t test1
djfkdsjfkldsjfkdsjjfdsjfkdlsjf
sdjfds
sdfjklfdg
dsfgjks
dsjfkds
werjksdf
fjkef






j


dsf
sdf


sdf
grf



cat命令的缺点主要是在于启动后无法控制,为了剞劂这个问题,可以使用more命令:


more命令显示文本文件,但是在显示完每页数据时停止;

q:退出程序

s:向后

f:向后

b:向前

/expression:在文件中搜索expression代表的文本



less命令:显示文件的总行数以及当前显示的行数范围:

less命令可以识别向上和向下方向键,以及向上翻页和向下翻页





tail:tail命令显示最后一组文件行:默认情况下,它显示文件的最后一行,但是也可以使用命令行参数更改该数字:

-f参数是tail命令中一个很好的特性,它允许你在其他进程使用文件时查看该文件,比如当文件追加更新时,可以使用tail查看最新更新的内容



head命令:显示文件开头的一组文件行,默认情况下,他显示文件的前10行。





第四章   更多的bash  shell命令

一、监控程序

1、进程查看

ps命令:

$ps

PID TTY          TIME CMD
 5574 pts/1    00:00:00 bash
 8629 pts/1    00:00:00 tail
 8692 pts/1    00:00:00 ps

默认情况下,ps命令只显示属于当前用户并正在终端中运行的进程;

ps命令的基本暑促显示了程序的进程ID即PID,进程运行的终端TTY,进程使用cpu时间。



--forest:用于显式进程的层次结构信息,但是会使用ASCII字符来绘制图表。

ps --forest

PID TTY          TIME CMD
 5574 pts/1    00:00:00 bash
 8629 pts/1    00:00:00 \_tail
 8692 pts/1    00:00:00 \_ps


2、实时进程监控:

ps命令对于收集在系统中运行的进程的信息非常实用,但同时也有一个缺点;ps命令只能显示特定时间点的信息,如果你需要查明经常在内存中换进换出的进程的趋势,那么ps命令就无能为力了。


top命令可以解决此问题:

top命令用于显示与ps命令相似的进程信息,不过它采用的是实时模式:

输出的第一部分显示了一般的系统信息,

(1)第一行显示:当前时间,系统已正常运行的时间,已登录的用户数量,以及系统的平均负载:

平均负载包含三个值,分别是1分钟平均负载值、5分钟平均负载值、15分钟平均负载值。值越高则系统负载越大;短期活动促使1分钟负载值冲高是很常见的,如果15分钟负载值处于高位,则系统可能遇到了麻烦。

注:负载值依赖于平时在系统中运行的程序和硬件配置。

(2)第二行显示一般进程信息,在top中称为任务:有多少进程正在进行、睡眠、已停止和僵死(已经运行完毕,但父进程未响应)。

(3)第三行显示CPU一般信息,top命令会根据进程所有者(用户或系统进程)和进程的状态(运行、空闲或等待)将CPU利用率划分成若干个类别。

(4)第四行和第五行详细给出系统内存的状态,第四行显示系统物理内存的状态,内存总量、当前使用的内存量和空闲内存量。第五行显示系统交换内存区域的转台,和前面相同

(5)下面的信息就是当前正在运行的进程的详细列表:

PID:进程的ID

USER:进程所有者的用户名

PR:进程的优先级

NI:进程的nice value

VIRT:进程所使用的虚拟内存总量

RES:进程当前正使用的物理内存量

SHR:进程与其他进程共享的内存量

S:进程状态:D=可中断睡眠,R=运行中,S=睡眠,T=已跟踪或已停止,Z=僵死

%CPU:进程正使用的CPU时间份额

%MEM:进程正使用的可用物理内存份额

TIME:进程启动后已使用的总CPU时间

COMMAND:进程的命令行名称


注:当启动top命令时,它会根据%CPU的值对进城进行排序,可以运行top时使用交互式命令来更改排序

例如:

hangma@ubuntu:~$ top
top - 20:53:52 up 14 min,  3 users,  load average: 0.02, 0.13, 0.13           //表明时间是20:53:52,系统运行的时间为14min,已有3个用户登录,平均负载:一分钟为0.02,五分钟为0.13,十五分钟为0.13
Tasks: 166 total,   1 running, 158 sleeping,   7 stopped,   0 zombie        //表明共有166个任务正在运行,158个休眠,7个停止,0个僵死
%Cpu(s):  5.4 us,  4.4 sy,  0.0 ni, 89.9 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   1026624 total,   676884 used,   349740 free,    50252 buffers
KiB Swap:  1046524 total,        0 used,  1046524 free,   295364 cached


  PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND           
 1161 root      20   0 98.1m  34m 6496 S   7.0  3.4   0:43.11 Xorg              
 2206 hangma    20   0  249m  68m  30m S   2.3  6.8   0:16.96 compiz            
 2878 hangma    20   0 91652  15m  11m S   0.7  1.5   0:00.78 gnome-terminal    
 2956 hangma    20   0  5204 1376 1012 R   0.3  0.1   0:00.03 top               
    1 root      20   0  3628 1992 1284 S   0.0  0.2   0:01.30 init              
    2 root      20   0     0    0    0 S   0.0  0.0   0:00.00 kthreadd          
    3 root      20   0     0    0    0 S   0.0  0.0   0:00.11 ksoftirqd/0       
    4 root      20   0     0    0    0 S   0.0  0.0   0:00.08 kworker/0:0       
    6 root      rt   0     0    0    0 S   0.0  0.0   0:00.00 migration/0       
    7 root      rt   0     0    0    0 S   0.0  0.0   0:00.00 watchdog/0        
    8 root       0 -20     0    0    0 S   0.0  0.0   0:00.00 cpuset            
    9 root       0 -20     0    0    0 S   0.0  0.0   0:00.00 khelper           
   10 root      20   0     0    0    0 S   0.0  0.0   0:00.00 kdevtmpfs         
   11 root       0 -20     0    0    0 S   0.0  0.0   0:00.00 netns             
   12 root      20   0     0    0    0 S   0.0  0.0   0:00.00 sync_supers       
   13 root      20   0     0    0    0 S   0.0  0.0   0:00.00 bdi-default       
   14 root       0 -20     0    0    0 S   0.0  0.0   0:00.00 kintegrityd 





3、停止进程

linux提供了两个命令用于发送进程信号给运行中的进程

(1)kill命令

kill命令允许根据进程的ID即PID将信号发送给相关进程:

kill命令只能使用进程ID


(2)killall命令

killall命令非常强大,可以根据进程的名称而非PID来停止进程,killall命令还允许使用通配符,它对于处理出错的系统非常有用;

注:若通配符使用不当,可能会停止重要的系统进程,导致文件系统受损。



二、监控磁盘空间

系统管理员的另一个重要任务是跟踪系统的磁盘使用情况。

挂载介质:linux文件系统将所有介质磁盘合并到一个虚拟目录中,使用新介质磁盘之前,需要将它放在一个虚拟目录中,这项任务 称为挂载。

如果你未使用支持自动挂载和卸载可移动介质的发行版,则需要手动完成这些操作。


1.mout命令,需要root权限

Mount和unmount

 

一个文件系统可以使用之前,必须mount。 操作系统然后做一些记录以确认正常。因为UNIX所有的文件在一个目录树中, mount操作的结果使新的文件系统的内容好象在某个已经mount的文件系统的 一个已经存在的子目录中。

例如,图 4.3显示3个单独的文件系统,每个有其自己的根目录。 当后2个文件系统被mount到第一个文件系统的/home 和 /usr , 我们得到一个目录树,如图  4.4.

  figure1226
图4.3: 3个单独的文件系统。

  《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第3张图片
图4.4: /home 和/usr 已经mount上。

上面的mount可能使用如下命令:

mount /dev/hda2 /home 
mount /dev/hda3 /usr 
$
mount   命令使用2个参数。 第一个是与包括文件系统的磁盘或分区相关的设备文件。第二个是要mount到的目录。 mount以后,这2个文件系统的内容好象是 /home    和 /usr   目录。 这样就可以说: /dev/hda2     被mount到   /home   /usr   也同样。 要看每个文件系统,就看其被安装的目录,好象它就是在那里。 注意设备文件的区别, /dev/hda2   , 和安装到的目录 /home   。 设备文件给出硬盘原始内容的存取,安装到的目录给出磁盘上文件的存取。安装到的目录叫 安装点



mount命令用于挂载介质。默认情况下,mount命令显示系统当前挂载的介质设备列表

hangma@ubuntu:~$ mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)            //介质的设备位置为/dev/sda1;介质在虚拟目录中的挂载点:on /即挂载在根目录下;文件系统类型:type ext4;已挂在介质的访问状态:(rw,errors=remount-ro)  
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
vmware-vmblock on /run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
gvfsd-fuse on /run/user/hangma/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=hangma)
/dev/sr0 on /media/hangma/ICBC Ebanking type iso9660 (ro,nosuid,nodev,uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500,uhelper=udisks2)

mount命令提供了4条信息:

介质的设备位置;

介质在虚拟目录中的挂载点;

文件系统类型;

已挂在介质的访问状态;


要手动在虚拟目录中挂载介质设备,需要使用根目录登录;用于手动挂载介质设备的基本命令如下:

mount   [-t  type]  [-o options]  device   dir

type:这个参数定义格式化磁盘的文件系统类型;

device:需要挂载的设备

dir:挂载目录


-o选项

-o允许使用一列逗号分隔额外选项挂载文件系统。常用的选项包括:

ro:以只读形式挂载

rw:以读写形式挂载

user=xxxx:允许普通用户挂载文件系统

check=none:挂载文件系统,而不执行完整检查

loop:挂载某个文件,用来把一个文件当成硬盘分区挂街上系统

iocharset:指定访问文件系统所用字符集。简体中文一般用gb2312或者cp936

codepage:指定文件系统的代码页:简体中文代码时936


使用mount命令将samba分区挂载到某个目录下:

mount -t cifs -o username=root,password=abctest    //192.88.88.11/www      /home/www

或者是

mount -t smbfs -o username=root,password=abctest    //192.88.88.11/www      /home/www

如果-t smbfs这条命令不能用,有可能内核将smbfs换成cifs了。


注:

(1)mount命令不能mount  ntfs分区

这是因为内核不支持NTFS文件系统的原因,需要安装内核的NTFS文件系统支持包,以使内核支持NTFS文件系统

(2)如何挂载U盘和mp3

如果计算机没有其他SCSI设备和usb外设的情况下,插入U盘的设备路径是/dev/sda1,用命令:

mkdir   /mnt/udisk

mount  /dev/sda1   /mnt/udisk

这样就挂载好了

(3).iso文件是CD在单个文件中的完整映像,可以直接将.iso文件挂载到Linux虚拟目录中,而无需将其刻录到CD中,这可以使用loop选项中使用-o参数来完成:

例如:

mount  -t  iso9660  -o loop xxx.iso   mnt

这就把xxx.iso挂载到当前目录下的mnt目录下了

(4)mount  --bind

是将一个目录中的内容挂载到另一个目录中,用法是:

mount  --bind   olddir  newdir

这个命令在自己搭建FTP要共享某个目录的时候变得特别方便,如果取消这个mount命令:

mount   --move  olddir  newdir

(5)卸载mount命令,使用unmount命令

可使用三条命令:

unmount   设备名

unmount   挂在目录

unmount  设备名  挂在目录


(6)为什么unmount的时候老显示device busy:

因为有程序正在访问这个设备,最简单的办法就是让访问该设备的程序退出以后在unmount,可能有时候用户搞不清楚什么设备在访问设备;

unmount  -l   设备名

这个命令的意思是指并不马上unmount ,而是在该目录空闲后在unmount:

可以先用命令ps aux来查看占用设备的程序PID,再用kill命令杀死占用设备的进程。




2、使用df命令

df命令允许我们方便的查看所有已挂载磁盘的使用情况:

hangma@ubuntu:~$ df
Filesystem     1K-blocks      Used             Available        Use%               Mounted on
/dev/sda1       40251776    4307316      33899788       12%                       /
udev              505572          4               505568           1%                        /dev
tmpfs             205328        780              204548          1%                        /run
none                5120           0                 5120             0%                        /run/lock
none              513312        152             513160           1%                        /run/shm
none              102400         40              102360           1%                        /run/user


df命令显示每个包含数据的已挂载文件系统,从之前的mount命令可以看出,一些挂载设备用于内部系统目的;该命令显示:

----设备位置:

----能保存的数据块总量,每块1024字节

----已使用的数据块总量,每块1024字节

----可用的数据块数量,每块1024字节

----已使用的空间的百分比,设备挂载点


参数:

-h:用于以可读形式显示磁盘空间,通常使用M表示兆字节,用G表示吉字节:

hangma@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        39G  4.2G   33G  12% /
udev            494M  4.0K  494M   1% /dev
tmpfs           201M  780K  200M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            502M  152K  502M   1% /run/shm
none            100M   40K  100M   1% /run/user

注意:df命令对于排除系统中的磁盘空间问题非常有用;记住,Linux系统始终会在后台运行一些处理文件的进程,df命令提供的值反映Linux系统认可的该时间点的当前值,运行中的进程可能已创建或删除了某个文件,只是还没有释放它;这个数值将不会包含在空闲空间计算中。



3、使用du命令

默认情况下,du命令显示当前目录下的所有文件、目录和子目录,并显示各文件或目录占用了多大空间;

----各行右侧的数字显示各文件或目录占用的数据块数量,注意,是数据块数量即单位是K


参数:

-c:生成所有已列出文件的总计;

-h:以可读形式输出大小;

-s:汇总输出各自变量



三、操作数据文件

1、数据排序

在操作大量数据时,一个常用的命令就是sort命令,sort命令的作用就是对数据进行排序。

在默认情况下,sort命令使用您为会话指定的默认语言的标准排序规则对文本文件中的数据行进行排序。

hangma@ubuntu:~/test/test/linux_shell$ cat file1 
ndf
we
cnvk
weir
we
op
jlk
nn
jhih
opw
s.a
l
owe
a
d
b
edf
we
r
wettre
tyt
cbm


hangma@ubuntu:~/test/test/linux_shell$ sort file1


a
b
cbm
cnvk
d
edf
jhih
jlk
l
ndf
nn
op
opw
owe
r
s.a
tyt
we
we
we
weir
wettre

如果对数字文件使用sort:

hangma@ubuntu:~/test/test/linux_shell$ sort file2


1
213
23
232
23456
235
345
387
4
43
5
5
56
56
657
67
7
78
8
83
84
8764
8765
9765

这是因为默认情况下,sort命令将数字解释为字符,并执行标准的字符排序,因此生成的输出可能不是你所期望的;要解决这个问题,可以使用-n参数,它会通知sort命令将数字识别为数字,并根据数值大小对它们进行排序。

即 :

-n:用于对数值输出进行排序。
hangma@ubuntu:~/test/test/linux_shell$ sort -n file2


1
4
5
5
7
8
23
43
56
56
67
78
83
84
213
232
235
345
387
657
8764
8765
9765
23456


其他有用 参数:

-k   (--key=POS1[,POS2]) 根据POS1位置进行排序,并在POS2位置结束(如果指定了该参数)
-M 使用由3个字符组成的月份缩写按月份排序
-r 反转排序:降序,而不是升序
-t 指定用于区分关键位置的字符


2、搜索数据

           经常需要查找大文件中的特定数据行,可以使用grep命令完成搜索任务,而不必在整个文件手动查找。

grep命令的命令行格式如下:

grep  [options]   pattern   [file]

             grep命令将在输入或者你指定的文件中搜索包含与指定模式(pattern)匹配的字符的数据行;输出是包含匹配模式的数据行。


下面的例子:

grep   pattern  [file]

hangma@ubuntu:~/test/test/linux_shell$ grep we file1
we
weir
we
owe
we
wettre


grep的一些参数:

-v:执行反转搜索,输出不匹配模式的数据行:

hangma@ubuntu:~/test/test/linux_shell$ grep -v w file1
ndf
cnvk
op
jlk
nn
jhih
s.a
l
a
d
b
edf
r
tyt
cbm


-n:如果你希望获取与模式匹配的数据所在的行号:

hangma@ubuntu:~/test/test/linux_shell$ grep -n w file1
2:we
4:weir
5:we
10:opw
13:owe
18:we
20:wettre


-c:有多少行包含匹配模式:

hangma@ubuntu:~/test/test/linux_shell$ grep -c w file1
7


-e:如果需要指定多个匹配模式,可以使用-e参数指定:

hangma@ubuntu:~/test/test/linux_shell$ grep -e w -e t file1
we
weir
we
opw
owe
we
wettre
tyt

输出包含w或者t的行。


grep搜索中使用正则表达式的例子:

hangma@ubuntu:~/test/test/linux_shell$ grep [wf] file1
ndf
we
weir
we
opw
owe
edf
we
wettre

正则表达式中的方括号表明grep命令查找包含w或者f字符的数据,如果未使用正则表达式,则grep将搜索与字符串wf匹配的文本。


3、压缩数据


《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第4张图片

(1)bzip2:

如果需要压缩某个文件,注意是某个文件,文件夹不可以;

格式:

bzip2   文件名

文件经过bzip2压缩后的名字比压缩前增加了文件扩展名.bz2:


hangma@ubuntu:~/test/test/linux_shell$ ls -l
total 16
-rw-rw-r-- 1 hangma hangma    80 Aug 12 13:55 file1
-rw-rw-r-- 1 hangma hangma 11674 Aug 12 14:59 file2

hangma@ubuntu:~/test/test/linux_shell$ bzip2 file2
hangma@ubuntu:~/test/test/linux_shell$ ls
file1  file2.bz2
hangma@ubuntu:~/test/test/linux_shell$ ls -l
total 8
-rw-rw-r-- 1 hangma hangma  80 Aug 12 13:55 file1
-rw-rw-r-- 1 hangma hangma 186 Aug 12 14:59 file2.bz2


如果需要解压:

bunzip2  文件名

hangma@ubuntu:~/test/test/linux_shell$ bunzip2 file2.bz2 
hangma@ubuntu:~/test/test/linux_shell$ ls
file1  file2
hangma@ubuntu:~/test/test/linux_shell$ ls -l
total 16
-rw-rw-r-- 1 hangma hangma    80 Aug 12 13:55 file1
-rw-rw-r-- 1 hangma hangma 11674 Aug 12 14:59 file2


如你所见,解压后的文件将和压缩前文件大小一样,压缩文本文件之后,你将无法使用标准的cat、more或less命令来查看数据;相反,你需要使用bzcat命令:

bzcat  文件名

注:bzcat命令用于显示压缩文件内部的文本,而无需解压实际的文件。


(2)gzip工具:

目前为止,gzip工具是linux中最流行的文件压缩工具;gzip是由GNU创建的:

----gzip:用于压缩文件

----gzcat:用于显示压缩后的文本文件的内容

----gunzip:用于解压文件


hangma@ubuntu:~/test/test/linux_shell$ ls -l
total 8
-rw-rw-r-- 1 hangma hangma  80 Aug 12 13:55 file1
-rw-rw-r-- 1 hangma hangma 186 Aug 12 14:59 file2.gz
hangma@ubuntu:~/test/test/linux_shell$ gunzip file2.gz 
hangma@ubuntu:~/test/test/linux_shell$ ls -l
total 16
-rw-rw-r-- 1 hangma hangma    80 Aug 12 13:55 file1
-rw-rw-r-- 1 hangma hangma 11674 Aug 12 14:59 file2


显示压缩后的文本文件内容,不一定是gzcat,我的ubuntu版本就是zcat


注:gzip也只能压缩文件,而不能压缩文件夹;



(3)zip

----zip:用于创建包含列出文件和目录的压缩文件

----zipcloak:用于创建包含列出文件和目录的加密压缩文件

----zippnote:用于提取zip文件中的注释

----zipsplit:用于将zip文件分割成指定大小的多个小文件

----unzip:用于提取压缩zip文件中的文件和目录


zip  -r   压缩后文件名    压缩前文件名或者目录名

例如:

hangma@ubuntu:~/test/test$ zip -r  k linux_shell/
  adding: linux_shell/ (stored 0%)
  adding: linux_shell/file1 (deflated 19%)
  adding: linux_shell/file2.gz (deflated 8%)



4、归档数据

当前UNIX和linux中最流行的归档工具是tar命令

tar命令格式:

tart  function  [options]  object1  object2 ......................

参数:

----c:创建一个新tar归档文件

----x:解压现有归档文件

----f file:输出结果到文件(或者设备)file

----v:在处理过程中列出文件

----z:将输出重定向到gzip命令进行压缩

----t:列出现有tart归档文件的内容


常用组合选项:

-cvf:

tar  -cvf   test.tar   test/        test2/

创建一个名字为test.tar 的归档文件,其中包含test1目录和test2目录的内容


-xvf:

tart  -xvf   test.tar

解压test.tar文件的内容。



-tf:

tart  -tf  test.tar

这将列出test.tar的内容,但不解压








第五章   使用LINUX环境变量



一、环境变量

                 bash  shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息(环境变量的名称由此而来);该特性还允许你将数据存储在内存中,以便于在shell中运行或脚本访问它们。这是一种便捷的、用于存储持久性数据的方式,这些数据可以标识用户账户、系统、shell或任何需要存储的内容的特性。


                bash  shell中共有两种类型的环境变量:

全局变量;

本地变量。


1、全局环境变量

               全局环境变量在shell会话和该shell产生的任何子进程中都可见;本地变量只在创建它们的shell中可见;在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用。

要查看全局环境变量:

$printenv

SSH_AGENT_PID=2129
GPG_AGENT_INFO=/run/user/hangma/keyring-eRs0ua/gpg:0:1
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=47db415746487c18fe298e4751a8e8a3-1375771767.20272-424743910
WINDOWID=48319635
GNOME_KEYRING_CONTROL=/run/user/hangma/keyring-eRs0ua
GTK_MODULES=overlay-scrollbar
USER=hangma
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/run/user/hangma/keyring-eRs0ua/ssh
SESSION_MANAGER=local/ubuntu:@/tmp/.ICE-unix/2094,unix/ubuntu:/tmp/.ICE-unix/2094
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
DESKTOP_SESSION=ubuntu
PWD=/home/hangma/test/test
GNOME_KEYRING_PID=2083
LANG=en_US.UTF-8
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
UBUNTU_MENUPROXY=libappmenu.so
COMPIZ_CONFIG_PROFILE=ubuntu
GDMSESSION=ubuntu
SHLVL=1
HOME=/home/hangma
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=hangma
COMPIZ_BIN_PATH=/usr/bin/
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-75Q87OBcfU,guid=663c2980a2c4f86041a9cbc752009c77
LESSOPEN=| /usr/bin/lesspipe %s
XDG_RUNTIME_DIR=/run/user/hangma
DISPLAY=:0.0
XDG_CURRENT_DESKTOP=Unity
LESSCLOSE=/usr/bin/lesspipe %s %s
COLORTERM=gnome-terminal
XAUTHORITY=/home/hangma/.Xauthority
_=/usr/bin/printenv
OLDPWD=/home/hangma/test/test/linux_shell


2、本地环境变量

               本地环境变量只在定义它们的本地进程中可见。

还没有命令可以只显示本地环境变量,set命令显示特定进程的所有环境变量集,但是,这其中也包括了全局环境变量。



二、设置环境变量

1、设置本地环境变量

            启动bash  shell之后,可以在shell进程中可见的本地变量;可以为环境变量分配一个数值或字符串,方法是使用等号将变量指定为具体值。

            如果需要指定的字符串包含空格,则需要使用单引号来指示字符的起始位置;如果没有单引号,bash  shell将假定下一个字符是另一个要处理的命令;

              注意:系统环境变量都使用了大写字母,这是bash  shell中的一个标准约定,如果创建新环境变量,建议使用小写字母,这将有助于区分个人环境变量和系统环境变量。

           设置本地变量之后,可以在当前shell进程的任何地方使用它,但是如果产生了另外一个shell,则不能在子shell中使用它。


2、设置全局环境变量

全局环境变量在任何由设置全局环境变量的进程创建的子进程中都可见,创建全局环境变量的方法是创建一个本地环境变量,然后再将它导出到全局环境中。

hangma@ubuntu:~/test/test/pipe_test$ test=tesnxsdfhkls
hangma@ubuntu:~/test/test/pipe_test$ export test
hangma@ubuntu:~/test/test/pipe_test$ bash
hangma@ubuntu:~/test/test/pipe_test$ echo $test 
tesnxsdfhkls

在shell创建的子进程中可见,这是因为export让它具有全局性



3、移除全局变量

unset命令可以移除全局变量,记住在unset中引用环境变量时,记住不要使用美元符号。

如果在子进程中unset移除全局变量,则该操作只对子进程有效,全局环境变量在父进程中仍然可用:

hangma@ubuntu:~/test/test/pipe_test$ export test
hangma@ubuntu:~/test/test/pipe_test$ echo $test 
wejrkljsdkljf
hangma@ubuntu:~/test/test/pipe_test$ bash
hangma@ubuntu:~/test/test/pipe_test$ echo $test
wejrkljsdkljf
hangma@ubuntu:~/test/test/pipe_test$ unset test 
hangma@ubuntu:~/test/test/pipe_test$ echo $test


hangma@ubuntu:~/test/test/pipe_test$ exit
exit
hangma@ubuntu:~/test/test/pipe_test$ echo $test 
wejrkljsdkljf
hangma@ubuntu:~/test/test/pipe_test$ unset test 
hangma@ubuntu:~/test/test/pipe_test$ echo $test



4、默认的shell环境变量

              bash  shell默认将使用一些特定的环境变量来定义系统环境,你可以随时都可以依靠这些在Linux系统中设置的变量。



三、设置PATH环境变量

             当你在shell命令行界面中输入命令时,shell必须搜索系统已找到程序,PATH环境变量定义了它搜索命令的目录;

            PATH中的每个目录都由冒号分隔,PATH变量的末尾没有任何标记指示目录清单结束,你可以在PATH中加入其它目录,只需在其后添加一个冒号和新目录,PATH还显示了shell查找命令的顺序。


              似乎linux系统上发生的最大命令是由PATH环境变量造成的,它定义了shell在哪里查找命令行输入的命令,如果无法找到命令,则会生成一个错误信息:

hangma@ubuntu:~/test/test/pipe_test$ myprogram
myprogram: command not found

问题是:应用程序经常将它们的可执行程序放置在PATH环境变量以外的目录中;技巧是确保你的PATH环境变量包含应用程序所在的所有目录。

解决方式:

                    你可以在现有的PATH环境变量中添加新搜索目录,而不用重新构建它,PATH中列出的各目录由冒号分隔,你只需引用原始PATH值,并在字符串中添加任何新目录:

hangma@ubuntu:~/test/test/pipe_test$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

例如在PATH中添加:/home/hangma/test目录:

hangma@ubuntu:~/test/test/pipe_test$ PATH=$PATH:/home/hangma/test
hangma@ubuntu:~/test/test/pipe_test$ echo $PATH
/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/hangma/test


注意:

                程序员经常用的一个技巧就是在他们的PATH环境变量中包含一个点符号,单个点符号代表当前目录。



四、定位系统环境变量:

              linux系统使用环境变量在程序和脚本中标识自己,这为获取程序的系统信息提供了一种简便的方法,如何设置环境变量需要一定的技巧。

              通过登录linux系统启动bash  shell时,bash默认将检查一些文件以执行命令,这些文件被称为启动文件,bash处理的启动文件依赖于启动bash  shell的方法,可采用三种方法来启动bash  shell:

---------在登录时作为默认登录shell;

---------作为非登录shell的交互式shell;

---------作为非交互式shell运行脚本。

1、登录shell

              当登录linux系统时,bash shell将作为登录shell启动;登录shell将查找4个不同的启动文件来处理其中的命令,bash  shell处理文件的顺序如下:

----/etc/profile

----$HOME/.bash_profile

----$HOME/.bash_login

----$HOME/.profile

          其中/etc/profile文件是bash  shell在系统上的主默认启动文件,系统上的每一个用户在登录时都将执行启动文件,另3个启动文件特定于各个用户,并且可以根据各用户的需求自定义它们。


(1)/etc/profile文件

               /etc/profile文件是bash  shell的主默认启动文件,当登录linux系统时,bash将执行/etc/profile启动文件中的命令,为用户设置工作环境,每一个用户登录时,操作系统首先执行这个文件,然后再讲控制权交给用户主目录下的.profile文件,当系统给出主提示符($PS1)后,用户就可以开始自己的工作量。

/etc/profile文件的主要功能包括:显示UNIX版本信息、系统专用应用程序的提示信息、设置掩码umask、对终端和邮箱进行处理、对非root用户禁止使用news命令等。

hangma@ubuntu:~/test/test/pipe_test$ cat /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).


if [ "$PS1" ]; then
  if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi


# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.


if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi


(2)$HOME启动文件

           其余3个启动文件具备相同的功能-----提供特定于用户的启动文件,用于定义特定于用户的环境变量。大多数linux发行版本都只使用这3者之一:

-----$HOME/.bash_profile

-----$HOME/.bash_login

-----$HOME/.profile

            由于这些文件位于用户的HOME目录中,因此各用户可以编辑这些文件并添加自己的、对于他们启动的每一个bash  shell会话都为活动状态的环境变量。


hangma@ubuntu:~$ ls -a
.              .dmrc                  .local            Templates
..             Documents              .mission-control  test
.bash_history  Downloads              .mozilla          Videos
.bash_logout   examples.desktop       Music             .viminfo
.bashrc        .gconf                 Pictures          .Xauthority
.cache         .gnome2                .profile          .xsession-errors
.compiz        .goutputstream-J542ZW  Public            .xsession-errors.old
.config        .gstreamer-0.10        .pulse
.dbus          .gtk-bookmarks         .pulse-cookie
Desktop        .ICEauthority          .ssh


我的系统里没有.bash_profile文件,只有.profile文件:

hangma@ubuntu:~$ cat .profile 
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.


# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022


# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
    fi
fi


# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

注:文件的最后以前没注意过,以后想把自己的可执行文件放在一个自己私有的文件下,可以考虑在$HOME下建立bin目录,这样系统会自动将这个目录加入PATH环境变量,就不用自己再添加了,很好,这个得记住,很实用


.profile启动文件首先检查HOME目录中是否存在另一个名为.bashrc的启动文件,如果存在,则启动文件将执行该文件;最后启动文件将添加一个目录到PATH环境变量中,目的是提供在HOME目录中放置可执行文件的位置。



2、交互式shell

如果启动了一个bash  shell而没有登录 系统,则您启动的就是一个交互式shell,交互式shell与登录shell的行为不同,但它仍然提供了一个CLI提示符以供你输入命令。

hangma@ubuntu:~$ cat .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples


# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac


# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth


# append to the history file, don't overwrite it
shopt -s histappend


# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000


# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize


# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar


# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"


# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi


# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac


# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes


if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
    else
color_prompt=
    fi
fi


if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt


# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac


# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
    test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
    alias ls='ls --color=auto'
    #alias dir='dir --color=auto'
    #alias vdir='vdir --color=auto'


    alias grep='grep --color=auto'
    alias fgrep='fgrep --color=auto'
    alias egrep='egrep --color=auto'
fi


# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'


# Add an "alert" alias for long running commands.  Use like so:
#   sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'


# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.


if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi


# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
  if [ -f /usr/share/bash-completion/bash_completion ]; then
    . /usr/share/bash-completion/bash_completion
  elif [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
  fi
fi


注:请记住,每次启动新交互式shell时都会运行交互式shell启动文件,因此,任何子shell都将自动执行交互式shell启动文件。



3、非交互式shell

     这是系统开始执行shell脚本的shell,它的不同之处在于不同担心CLI提示符,但是你仍然希望在每次启动系统中的脚本时运行特定的启动命令。

     为了适应这种情况,bash  shell提供了BASH_ENV环境变量,当shell开始一个非交互式shell进程时,它将检查该环境变量表示的待执行启动文件的名称;如果该变量有值,则shell将执行文件中的命令。


五、使用命令别名

命名别名允许您为公共命令创建别名,以尽可能减少录入工作

查看活动别名的列表:

hangma@ubuntu:~$ alias -p
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias li='ls -l'
alias ll='ls -alF'
alias ls='ls --color=auto'


我在我自己的系统中使用


alias  li='ls -il'

命名别名与本地环境变量行为相似,它们只对定义范围内的shell进程有效:

hangma@ubuntu:~$ li
li: command not found
hangma@ubuntu:~$ alias li='ls -il'
hangma@ubuntu:~$ li
total 48
1837649 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Desktop
1837653 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Documents
1837650 drwxr-xr-x  2 hangma hangma 4096 Jun  3 10:01 Downloads
1848611 -rw-r--r--  1 hangma hangma 8445 Jun  1 01:41 examples.desktop
1837654 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Music
1837655 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Pictures
1837652 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Public
1837651 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Templates
1848642 drwxrwxr-x 10 hangma hangma 4096 Aug 12 14:58 test
1837656 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Videos
hangma@ubuntu:~$ bash
hangma@ubuntu:~$ li
li: command not found


当然要想解决这个问题,在启动新的交互式shell时,bash  shell始终会读取$HOME/.bashrc启动文件,这是放置命名别名语句的绝佳位置。

hangma@ubuntu:~$ li
total 48
1837649 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Desktop
1837653 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Documents
1837650 drwxr-xr-x  2 hangma hangma 4096 Jun  3 10:01 Downloads
1848611 -rw-r--r--  1 hangma hangma 8445 Jun  1 01:41 examples.desktop
1837654 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Music
1837655 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Pictures
1837652 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Public
1837651 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Templates
1848642 drwxrwxr-x 10 hangma hangma 4096 Aug 12 14:58 test
1837656 drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Videos




第六章  理解LINUX文件权限


一、linux安全性

          linux安全系统的核心是用户账户;访问linux系统的每个人都应该拥有已分配的、唯一的用户账户;用户拥有的对系统中对象的权限依赖于它们登录的用户账户。

          可以使用用户ID来跟踪用户权限,账户将在创建时被分配UID;UID是针对每个用户的唯一数值,但是却不能使用UID登录linux系统,相反,需要使用登录名,登录名是由不多于8个字符组成。


1、/etc/passwd

               linux系统中使用/etc/passwd文件将登录名与相应的UID值匹配,此文件包含几条关于用户的信息。

/etc/passwd文件中包含以下信息

----登录用户名

----用户密码

----用户账户的数值UID

----用户账户的数值用户组ID(GID)

----用户账户的文本描述(称为注释字段)

----用户HOME目录位置

----用户的默认shell

hangma@ubuntu:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
syslog:x:101:103::/home/syslog:/bin/false
messagebus:x:102:105::/var/run/dbus:/bin/false
avahi-autoipd:x:103:106:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false
usbmux:x:104:46:usbmux daemon,,,:/home/usbmux:/bin/false
whoopsie:x:105:110::/nonexistent:/bin/false
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false
rtkit:x:107:114:RealtimeKit,,,:/proc:/bin/false
speech-dispatcher:x:108:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh
colord:x:109:117:colord colour management daemon,,,:/var/lib/colord:/bin/false
lightdm:x:110:118:Light Display Manager:/var/lib/lightdm:/bin/false
avahi:x:111:120:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false
hplip:x:112:7:HPLIP system user,,,:/var/run/hplip:/bin/false
pulse:x:113:121:PulseAudio daemon,,,:/var/run/pulse:/bin/false
saned:x:114:123::/home/saned:/bin/false
hangma:x:1000:1000:video-hadoop,,,:/home/hangma:/bin/bash
sshd:x:115:65534::/var/run/sshd:/usr/sbin/nologin

根用户账户是linux系统的管理员,它的UID始终为0;

Linux系统为各种非实际用户的函数创建了大量用户账户,称为系统账户,系统账户是一个特殊的账户,在系统中运行的服务使用它们访问系统资源,在后台模式中运行的所有服务都需要作为系统用户账户登录linux系统


为什么系统要创建大量的系统账户呢

                 为了防止入侵者可以获取像跟用户那样对系统的访问权限,在后台运行的每一个服务都有自己的用户账户用于登录,这样的话,即使入侵者获取了某个服务,那么他也不能获得对整个系统的访问权限。


             linux将500以下的UID保留用作系统账户,一些服务甚至需要特定的UID才能正常工作,当你为普通用户创建账户时,大多数系统都会从500开始分配第一个可用的UID(不过并非所有的LINUX发行版都是这样)。

            

            现在大多数linux系统都将用户密码保存在一个单独的文件中(称为影子文件,位于/etc/shadow),只有一些特殊程序(如登录程序)才允许访问该文件。

     

             /etc/passwd文件是一个标准的文本文件,可以使用任何文本编辑器直接在/etc/passwd文件中手动执行用户管理函数(如添加、修改或删除用户账户),但是这是一种非常危险的操作;如果/etc/passwd文件被破坏,则系统将不能读取它,并且它将阻止任何人(甚至是根用户)登录系统,相反,使用标准的linux用户管理实用工具来执行所有的用户管理功能则相对比较安全。

 

            



2、/etc/shadow文件

              /etc/shadow文件为linux系统管理密码的方式提供了更多的控制,只有根用户才能访问/etc/shadow文件,这比/etc/passwd文件更加安全

           例如:

hangma:$1$V87x8tY$kVPSuwpsc2zWIInFC04Qk/:15856:0:99999:7:::

每个/etc/shadow文件记录中都有9个字段:

----与/etc/passwd文件中的登录名相对应的登录名

----经过加密的密码

----密码上次修改时距1970年1月1日的天数

----距能够修改密码时的最少天数

----距必须修改密码时的天数

----距密码逾期并警告用户修改密码的天数

----从密码逾期开始到账户被禁用的天数

----用户账户已被禁用的天数(存储为自1970年1月1日开始的天数)

----保留供未来使用的字段


          /etc/shadow可以控制用户必须多久修改一次密码,以及当密码未修改时何时禁用账户。


3、添加新用户

            useradd是用户将新用户添加到linux中的主要工具,此命令为创建新用户账户并同时建立用户的HOME目录结构提供了一种简便的方法。

            useradd名里那个使用系统默认值结合命令行参数来定义用户账户

            要查看linux发行版所使用的系统默认值,请输入带-D参数useradd命令

hangma@ubuntu:~$ useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

              如果在创建新用户账户时未在命令行中指定各属性,则-D参数将显示useradd命令所使用的默认值:

上述例子中显示:

----新用户将被添加到用户组ID为100的公共用户组中;

----新用户将在/home/loginname目录下创建一个HOME账户;

----当密码逾期时,账户将不会被禁用;

----新账户不会在设定日期被设置为逾期;

----新账户将使用sh  shell作为默认shell

----系统会将/etc/skel目中的内容复制到用户的HOME目录

----系统不会在邮件目录中创建一个文件用于用户账户接收邮件


hangma@ubuntu:/home$ ls -al /etc/skel
total 40
drwxr-xr-x   2 root root  4096 Oct 17  2012 .
drwxr-xr-x 133 root root 12288 Aug 13 10:35 ..
-rw-r--r--   1 root root   220 Sep 19  2012 .bash_logout
-rw-r--r--   1 root root  3637 Sep 19  2012 .bashrc
-rw-r--r--   1 root root  8445 Apr 17  2012 examples.desktop
-rw-r--r--   1 root root   675 Sep 19  2012 .profile




在我的系统上这样设置才行:

hangma@ubuntu:/home$ sudo useradd test -p 123456 -m -d /home/test
hangma@ubuntu:/home$ ls -al /home/test/
total 32
drwxr-xr-x 2 test test 4096 Aug 13 10:16 .
drwxr-xr-x 4 root root 4096 Aug 13 10:16 ..
-rw-r--r-- 1 test test  220 Sep 19  2012 .bash_logout
-rw-r--r-- 1 test test 3637 Sep 19  2012 .bashrc
-rw-r--r-- 1 test test 8445 Apr 17  2012 examples.desktop
-rw-r--r-- 1 test test  675 Sep 19  2012 .profile

可以看出,系统使用/etc/skel中文件创建了一个主目录



useradd的参数

-d :指定主目录

-G:指定用户属于的一个或多个补充用户组

-m:创建用户的HOME目录

-p:为用户指定一个默认密码

-s:指定shell版本

-e:指定用户将要过期的日期

-r:创建一个系统账户


常用的格式:

sudo   useradd   新增用户名  -m  -d   主目录绝对路径  -p 用户密码  -G  用户组  -s shell版本

例子:

sudo  useradd  test   -m -d  /home/testhome -p 123456  -G testgroup   -s /bin/bash



如果不想每次创建新用户时都这样写一遍可以:

useradd  -D [参数]

参数包括:

-b   defualt_home:修改用户的HOME目录被创建的位置;原始的是/home下创建各个用户的HOME目录

-e  date:修改新账户的逾期日期

-f  inactive:修改逾期到禁用的天数;原始这个选项没有使用

-g group:修改所使用用户组

-s  shell:修改默认的shell版本

修改方式:例如:

useradd  -D  -s  /bin/bash -b  /home/test

这样就是指,修改shell的版本默认为bash shell,HOME目录创建的位置为/home/test



4、删除用户

        删除用户使用userdel命令,默认情况下,userdel只删除/etc/passwd文件中的用户信息,不会删除用户在系统中拥有的任何文件。

       如果你使用-r参数,则userdel将删除用户的HOME目录和用户的邮件目录。但是,在系统中删除的用户账户可能仍然拥有其他文件。

(1)这是添加账户,并删除账户,但是没有加参数-r,所以只删除了用户信息,但是没有删除用户在系统的中主目录

hangma@ubuntu:/home$ sudo useradd test -p 123456 -m -d /home/hhh -s /bin/bash
hangma@ubuntu:/home$ ls
hangma  hhh
hangma@ubuntu:/home$ sudo userdel test
hangma@ubuntu:/home$ ls
hangma  hhh

(2)这是添加账户test,并使用-r删除账户

hangma@ubuntu:/home$ sudo useradd test -p 123456 -m -d /home/hhh -s /bin/bash
hangma@ubuntu:/home$ sudo userdel -r test
hangma@ubuntu:/home$ ls
hangma


注:当拥有大量用户的环境中使用-r参数时需要格外小心,你可能不知道某个用户是否在它的HOME目录中 存储其他人或者其他程序中需要使用的重要文件,再删除用户HOME目录之前,务必进行检查。



5、修改用户

用户账户修改使用工具

usermod 编辑用户账户字段,以及指定主要和次要用户组成员
passwd 修改已有用户的密码
chpasswd 读取登录名和密码对文件,并更新密码
chage 修改密码的逾期日期
chfn 修改用户账户的注释信息
chsh 修改用户账户的默认shell
   


(1)usermod

usermod是最强大的用户账户修改实用工具,它提供了各种选项用于修改/etc/passwd文件中的大多数字段,这些参数大多与useradd参数相同,

参数:

-l:用于修改用户账户的登录名

-L:用于锁定账户,使用户无法登陆

-p:用于修改账户密码

-U:用于解除账户锁定,使用户可以登陆


-L尤为实用,使用它锁定账户之后,用户将无法登陆,而不需要删除账户和用户的数据,要使账户返回正常,只需使用-U参数。

例子:

sudo   usermod   -l   修改后的用户名   修改前的用户名

sudo usermod -l tes test

将test用户名修改为tes



(2)passwd和chpasswd

passwd命令可用于快速修改用户的密码:

格式:passwd  用户名

系统中的任何用户都可以修改自己的密码,但是只有根用户可以修改其他人的密码。


(3)chsh:修改用户的默认登录shell,必须使用shell的完全路径名,而不能仅是shell的名称:

chsh  -s  /bin/sh tes

例如:

hangma@ubuntu:/home$ sudo chsh -s /bin/sh tes
hangma@ubuntu:/home$ grep tes /etc/passwd
tes:x:1003:1003::/home/ddddd:/bin/sh
hangma@ubuntu:/home$ sudo chsh -s /bin/bash tes
hangma@ubuntu:/home$ grep tes /etc/passwd
tes:x:1003:1003::/home/ddddd:/bin/bash





二、使用linux用户组

               用户账户对于控制各用户的安全性极为有效,但是它们在允许用户共享资源方面则稍有欠缺;为实现这个目的,linux系统使用了另一个安全概念,即用户组

               用户组权限允许多个用户共享系统上某个对象的公共权限集,例如文件、目录或设备。

                每个用户组都有唯一的GID,与UID类似,GID是系统上独一无二的数值,除了GID之外,每个用户组还有一个唯一的用户组名称。

1、/etc/group文件

                与用户账户相同,用户组信息存储在系统上的某个文件中;/etc/group文件包含关于系统所使用的各用户组的信息:

root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:hangma
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:hangma
floppy:x:25:
tape:x:26:
sudo:x:27:hangma
audio:x:29:pulse
dip:x:30:hangma
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:hangma
staff:x:50:
games:x:60:
users:x:100:
nogroup:x:65534:
libuuid:x:101:
crontab:x:102:
syslog:x:103:
fuse:x:104:
messagebus:x:105:
avahi-autoipd:x:106:
lpadmin:x:107:hangma
ssl-cert:x:108:
netdev:x:109:
whoopsie:x:110:
mlocate:x:111:
ssh:x:112:
utempter:x:113:
rtkit:x:114:
bluetooth:x:115:
scanner:x:116:
colord:x:117:
lightdm:x:118:
nopasswdlogin:x:119:
avahi:x:120:
pulse:x:121:
pulse-access:x:122:
saned:x:123:
hangma:x:1000:
sambashare:x:124:hangma
test:x:1003:

/etc/group文件使用4个字段:

----用户组名称

----用户组密码

----GID

----属于用户组账户列表


注意:通过使用用户组密码,用户组密码将允许非用户组临时成为用户组的成员;

            不应该采取编辑/etc/group文件的方式来将用户添加到用户组中,相反,你应该使用usermod命令将用户账户添加到用户组中,在能够将用户添加到不同用户组之前,必须创建用户组;

            用户账户列表可能会造成误导,列表中的一些用户组并没有拥有任何用户,这不是因为它们没有任何成员,当用户使用某个用户组作为/etc/passwd文件里的默认用户组,用户账户不会作为成员出现在/etc/group文件中。



2、创建新用户组

       groupadd命令允许你在系统中创建新用户组。

groupadd   shared

这样就创建了一个用户组shared,但是系统默认不会为它分配任何用户;所以,要添加新用户,需使用usermod命令。

usermod  -G shared  test

这样就把用户test加到了用户组shared中

-G参数:如果使用了-G参数,则制定的用户组名称将替代用户账户的默认用户组,


3、修改用户组:

groupmod命令可以修改用户组的GID或者用户组名称

参数:

-g:修改用户组的GID

-n:修改用户组名称

groupmod  -n  sharing  shard

修改用户组的名称时,GID和用户组 成员将仍然保持不变,仅由用户组名称发生变化;

由于所有的安全性权限都基于GID,因此您可以随时修改用户组的名称,而不会对文件的安全性造成不利的影响。



三、解码文件权限


1、使用文件权限符号

hangma@ubuntu:~$ ls -l
total 48
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Desktop
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Documents
drwxr-xr-x  2 hangma hangma 4096 Jun  3 10:01 Downloads
-rw-r--r--  1 hangma hangma 8445 Jun  1 01:41 examples.desktop
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Music
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Pictures
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Public
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Templates
drwxrwxr-x 10 hangma hangma 4096 Aug 12 14:58 test
drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Videos

输出清单上的第一个字段是描述文件和目录的权限的代码,字段中的第一个字符定义了对象的类型:

-表示文件

d表示目录

l表示链接

c表示字符设备

b表示块设备

n表示网络设备

在它后面的3组字符,每组的3个字符都定义了一个访问权限:

r表示对象读权限

w表示对象写权限

x表示对象执行权限

如果拒绝了某个权限,则在该位置会出现一个破折号。这3组字符分别于3种级别的对象安全性相关:

对象的所有者;

拥有对象的用户组

系统上的其他任何人

《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第5张图片



例如:

drwxr-xr-x  2 hangma hangma 4096 May 31 18:17 Videos

rwx是针对文件所有者,r-x是针对文件用户组所有者,r-x是针对系统上的其他任何人。



2、默认文件权限:

            这些文件权限从何而来:答案是umask。

             umask命令为您创建的任何文件或目录设置默认权限:

hangma@ubuntu:~/test/test$ touch newfile
hangma@ubuntu:~/test/test$ ls -l newfile 
-rw-rw-r-- 1 hangma hangma 0 Aug 13 15:41 newfile

touch命令使用分配给我得账户的默认权限创建了文件,umask命令显示并设置默认权限:

hangma@ubuntu:~/test/test$ umask
0002

umask:第一个数字表示一种特殊的安全特性,称为粘着位;随后的3个数字表示文件或目录的八进制umask值。

八进制模式安全设置将3个rwx权限值转换为一个3位的二进制值,有一个八进制值表示。


《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第6张图片

             八进制模式使用八进制权限并依次列出了3中安全级别(用户、用户组和任何人)的权限值;因此,八进制模式值664表示用户和用户组拥有读取和写入的权限,而其他任何人都只拥有读取权限。

           umask只是一个掩码,umask值是从对象完整权限集中减去的值,文件的完整权限是模式666(所有人都有读取/写入权限),而目录的完整权限是777(所有人都有读取/写入/执行权限)

            例如,在我的系统中,umask值是0002,文件的初始权限是666,减去0002之后编程0664,用权限表示就是rw-rw-r--.

 

umask还可以设置新目录,由于目录的默认权限是777,因此通过umask生成的权限和新文件不同,

mkdir  newdir

drwxrwxr-x 2 hangma hangma 4096 Aug 13 16:00 newdir

777-umask之后变为0775,用权限表示就是:rwxrwxr-x



四、修改安全设置

1、修改权限

chmod命令允许修改文件和目录的安全设置

chmod命令的格式:

chmod  options  mode  file

mode参数允许您使用八进制或符号模式来设定安全设置

《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第7张图片


2、修改所有者

chown可以方便的修改文件的所有者,chgrp可以修改文件的默认用户组。

chown  options   owner[.group]  file

将file按照参数options的要求修改为owner所有,如果要修改文件的分组,则要在分组前面加上点    .

chown的参数:

           -R:允许你使用通配符对子目录和文件执行递归式修改

           -h:还可以修改任何与文件具有符号关联的文件的所有者。




五、共享文件

                       创建用户组是在linux系统上共享文件访问的一种方法;

                linux为每个文件和目录都存储了3个额外的信息位:

-------set  user id(SUID):当文件由用户执行时,程序将在文件所有者的权限下运行;

-------set  group id(SGID):对于文件,程序酱紫啊文件用户组的权限下运行;对于目录,目录中创建的新文件使用目录用户组作为默认用户组;

-------粘着位:进程结束后,文件仍然保留(粘着)在内存中。


            SGID位对于共享文件非常重要,通过启用SGID位,你可以强制在共享目录中创建所有新文件都由目录的用户组和现在各个用户的用户组拥有;


可以用chmod命令设置SGID;

《linux命令行和shell脚本编程宝典》学习笔记1(第一章至第六章)_第8张图片

因此,要创建一个始终为所有新文件设置了目录用户组的共享目录,只需要为目录设置SGID:

步骤:

(1)创建一个共享目录,此目录为以后创建共享文件的目录

hangma@ubuntu:~$ mkdir testdir

hangma@ubuntu:~$ ls -l
drwxrwxr-x  2 hangma hangma 4096 Aug 13 20:25 testdir


(2)使用chgrp命令将该目录的默认用户组修改为包含需要共享文件的成员的用户组(此用户组包含了所有需要共享文件的用户账户,这样就不用一个一个的修改文件了,只需在此共享目录中创建新文件即可使所有用户共享这些新文件)

hangma@ubuntu:~$ chgrp sharing testdir

hangma@ubuntu:~$ chmod  g+s  testdir                 -----------------------使用chmod命令设置SGID,在符号模式中使用符号s

hangma@ubuntu:~$ ls -l
drwxrwxr-x  2 hangma sharing 4096 Aug 13 20:25 testdir

可以发现,testdir目录的用户组变成sharing


(3)为目录设置SGID,以确保在该目录中创建的任何文件都是用共享用户组名称为默认用户组。

$ cd  testdir

$  touch aaaa

$ ls -l
total 0
-rw-rw-r-- 1 test sharing 0 Aug 13 20:44 aaaa

      进入共享目录创建新文件,新文件使用目录的默认用户组,而不是当前账户的默认用户组,现在共享用户组中的任何用户都可以访问这个文件。
































































你可能感兴趣的:(linux相关)