筆記六(11.6)

###########################node

#####第四單元.管理系統存儲####mysql

###########################linux


@@注意:主分區+邏輯分區總個數不能超過15git

@@注意:通常分區時,分三個主分區,第四個爲擴展分區(容器),給其分配剩餘全部空間正則表達式


###1.分區的劃分####sql


fdisk /dev/vdb ##進入分區劃分shell

partprobe ##加載分區表vim

cat /proc/partitions ##查看分區信息數組

mkfs.xfs ##格式化分區=建立xfs文件系統bash

blkid ##查看文件系統類型


mount  /dev/vdb1  掛載點  ##分區掛載

umount  /dev/vdb1  掛載點  ##卸載掛載

vim /etc/fstab ##實現永久掛載

/dev/vdb1   掛載點   文件系統類型(xfs)  defaults  0  0

mount  -a

df ##查看已掛載的分區


####2.swap分區管理####


swapon -s ##查看系統中的swap分區

創建swap分區

mkswap  /dev/vdb1 ##把/dev/vdb1格式化爲swap分區

swapon  -a  /dev/vdb1 ##激活

上述激活方式,重啓後激活消失,如需永久激活,須要修改配置文件

vim /etc/fstab ##開機自動激活

/dev/vdb1 swap swap defaults  0  0

設備 掛載點 文件系統類型      


swapoff  /dev/vdb1 ##關閉激活的swap分區


添加臨時swap分區

dd if=/dev/zero of=/mnt/swapfilename  bs=1M count=1000 ##在/mnt中劃分一塊名爲swapfile的分區,塊大小爲1M,數量爲1000

mkswap /dev/vdb1 ##格式化swap格式

swapon -a /dev/vdb1 ##激活




@@!!!實例:

[root@station mnt]# fdisk /dev/vdb

Welcome to fdisk (util-linux 2.23.2).


Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.


Device does not contain a recognized partition table

Building a new DOS disklabel with disk identifier 0xa1575c6c.


Command (m for help): m

Command action

   a   toggle a bootable flag

   b   edit bsd disklabel

   c   toggle the dos compatibility flag

   d   delete a partition ##刪除分區

   g   create a new empty GPT partition table

   G   create an IRIX (SGI) partition table

   l   list known partition types ##列出系統可用的分區類型

   m   print this menu

   n   add a new partition ##新建分區

   o   create a new empty DOS partition table

   p   print the partition table ##顯示分區

   q   quit without saving changes ##退出

   s   create a new empty Sun disklabel

   t   change a partition's system id

   u   change display/entry units

   v   verify the partition table

   w   write table to disk and exit ##保存更改到分區表中

   x   extra functionality (experts only)


Command (m for help): n ##選擇新建分區

Partition type:

   p   primary (0 primary, 0 extended, 4 free) ##分區類型爲主分區

   e   extended ##分區類型爲擴展分區

Select (default p): ##默認爲主分區

Using default response p

Partition number (1-4, default 1): 1 ##主分區id

First sector (2048-20971519, default 2048): ##此分區起始位置(通常爲默認)

Using default value 2048

Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +100M ##分區大小

Partition 1 of type Linux and of size 100 MiB is set


Command (m for help): p


Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0xa1575c6c


   Device Boot      Start         End      Blocks   Id  System

/dev/vdb1            2048      206847      102400   83  Linux


Command (m for help): wq ##保存退出,若輸入爲q表示放棄更改退出

The partition table has been altered!


[root@station mnt]# partprobe

[root@station mnt]# cat /proc/partitions ##同步分區表

major minor  #blocks  name


 253        0   10485760 vda

 253        1   10484142 vda1

 253       16   10485760 vdb

 253       17     102400 vdb1


文件類型:

vfat

ntfs

ext:日誌文件系統,最大分區爲32T

xfs:最大分區爲18eb,1eb=1024t,最快吞吐速度可達8G/s

後二者Windows不識別


mkfs.xfs /dev/vdb5 ##格式化

mount /dev/vdb5 /mnt ##掛載

例子:

[root@station mnt]# mkfs.xfs /dev/vdb5

meta-data=/dev/vdb5              isize=256    agcount=4, agsize=6400 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0

data     =                       bsize=4096   blocks=25600, imaxpct=25

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal log           bsize=4096   blocks=853, version=2

         =                       sectsz=512   sunit=0 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

[root@station mnt]# blkid

/dev/vda1: UUID="9bf6b9f7-92ad-441b-848e-0257cbb883d1" TYPE="xfs" 

/dev/vdb5: UUID="64d88d75-16fa-4441-80c9-806dae86fc6d" TYPE="xfs" 

[root@station mnt]# mount /dev/vdb5 /mnt

[root@station mnt]# df

Filesystem     1K-blocks    Used Available Use% Mounted on

/dev/vda1       10473900 3811544   6662356  37% /

devtmpfs          927072       0    927072   0% /dev

tmpfs             942660     140    942520   1% /dev/shm

tmpfs             942660   17116    925544   2% /run

tmpfs             942660       0    942660   0% /sys/fs/cgroup

/dev/vdb5          98988    5280     93708   6% /mnt


####3.磁盤加密###


fdisk /dev/vdb

cryptsetup luksFormat /dev/vdb1 ##對vdb1進行luks加密

cryptsetup open /dev/vdb1 westos ##打開加密鎖,並對其給予一個新的名字

mkfs.xfs /dev/mapper/westos ##對其進行格式化

mount  /dev/mapper/westos  /mnt ##對westos進行掛載

umount  /mnt/ ##@@注意:執行此操做時,應該不在/mnt目錄下,不然會提醒設備正在被使用的警告或報錯

cryptsetup close westos ##對westos進行關閉(即上鎖)


#####加密磁盤的永久掛載####


vim /etc/crypttab ##此文件的做用至關於使系統執行cryptsetup open /dev/vdb1 nihao 的這條命令

內容以下:

格式爲: 解密後設備管理文件 設備 加密字符(密碼)存放文件

nihao /dev/vdb1 /root/lukspsfile


vim /root/lukspsfile ##密碼所存放的文件

內容爲:lizhengtai ##本身所設置的密碼


chmod 600 /root/lukspsfile ##給予文件600的權限

cryptsetup luksAddKey /dev/vdb1 /root/lukspsfile   ##將磁盤和密碼文件連接對應起來

Enter any passphrase: ##執行上條鏈接命令時須要輸入密碼

vim /etc/fstab

內容爲:

/dev/mapper/redhat /mnt xfs defaults 0  0

執行完上述命令後reboot虛擬機後,執行df命令,即可以看到效果(即此時設備已經被掛載)


#####加密清除#####


vim /etc/fstab ##進入/etc/fstab文件刪除在第2步中寫入的行

> /etc/crypttab ##刪除/etc/crypttab文件

rm -fr /root/lukspsfile ##刪除mima存放的文件

umount /mnt ##卸載/mnt

cryptsetup close nihao ##關閉磁盤  !!!@@注意:此步驟必定要作

mkfs.xfs /dev/vdb1 ##格式化磁盤(此時會提醒報錯,必須使用-f進行強行格式化)

mkfs.xfs: /dev/vdb1 appears to contain an existing filesystem (crypto_LUKS).

mkfs.xfs: Use the -f option to force overwrite.


mkfs.xfs /dev/vdb1 -f

meta-data=/dev/vdb1              isize=256    agcount=4, agsize=65536 blks

         =                       sectsz=512   attr=2, projid32bit=1

         =                       crc=0

data     =                       bsize=4096   blocks=262144, imaxpct=25

         =                       sunit=0      swidth=0 blks

naming   =version 2              bsize=4096   ascii-ci=0 ftype=0

log      =internal log           bsize=4096   blocks=2560, version=2

         =                       sectsz=512   sunit=0 blks, lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

操做完成,加密清除!!!


#####4.磁盤陣列####


fdisk /dev/vdb

mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/vdb{1..3}

mkfs.xfs /dev/md0

mount /dev/md0 /mnt

監控命令:

watch -n 1 cat /proc/mdstat


@@!!!實例:

[root@localhost ~]# fdisk /dev/vdb


Command (m for help): n

Partition type:

   p   primary (0 primary, 0 extended, 4 free)

   e   extended

Select (default p): p

Partition number (1-4, default 1): 

First sector (2048-20971519, default 2048): 

Using default value 2048

Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +1G

Partition 1 of type Linux and of size 1 GiB is set


Command (m for help): p


Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x1459613d


   Device Boot      Start         End      Blocks   Id  System

/dev/vdb1            2048     2099199     1048576   83  Linux


Command (m for help): t

Selected partition 1

Hex code (type L to list all codes): l

   

14  Hidden FAT16 <3 61  SpeedStor       ab  Darwin boot     f2  DOS secondary  

16  Hidden FAT16    63  GNU HURD or Sys af  HFS / HFS+      fb  VMware VMFS    

17  Hidden HPFS/NTF 64  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE 

18  AST SmartSleep  65  Novell Netware  b8  BSDI swap       fd  Linux raid auto

 

Hex code (type L to list all codes): fd

Changed type of partition 'Linux' to 'Linux raid autodetect'


Command (m for help): p


Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x1459613d


   Device Boot      Start         End      Blocks   Id  System

/dev/vdb1            2048     2099199     1048576   fd  Linux raid autodetect


Command (m for help): n

Partition type:

   p   primary (1 primary, 0 extended, 3 free)

   e   extended

Select (default p): 

Using default response p

Partition number (2-4, default 2): 

First sector (2099200-20971519, default 2099200): 

Using default value 2099200

Last sector, +sectors or +size{K,M,G} (2099200-20971519, default 20971519): +1G

Partition 2 of type Linux and of size 1 GiB is set


Command (m for help): t

Partition number (1,2, default 2): fd

Partition number (1,2, default 2): 

Hex code (type L to list all codes): fd

Changed type of partition 'Linux' to 'Linux raid autodetect'


Command (m for help): n

Partition type:

   p   primary (2 primary, 0 extended, 2 free)

   e   extended

Select (default p): 

Using default response p

Partition number (3,4, default 3): 

First sector (4196352-20971519, default 4196352): 

Using default value 4196352

Last sector, +sectors or +size{K,M,G} (4196352-20971519, default 20971519): +1G

Partition 3 of type Linux and of size 1 GiB is set


Command (m for help): t

Partition number (1-3, default 3): 

Hex code (type L to list all codes): fd

Changed type of partition 'Linux' to 'Linux raid autodetect'


Command (m for help): p


Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x1459613d


   Device Boot      Start         End      Blocks   Id  System

/dev/vdb1            2048     2099199     1048576   fd  Linux raid autodetect

/dev/vdb2         2099200     4196351     1048576   fd  Linux raid autodetect

/dev/vdb3         4196352     6293503     1048576   fd  Linux raid autodetect


Command (m for help): wq

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.

[root@localhost ~]# partprobe 

[root@localhost ~]# cat /proc/partitions 

major minor  #blocks  name

[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/vdb{1..3}

mdadm: Note: this array has metadata at the start and

    may not be suitable as a boot device.  If you plan to

    store '/boot' on this device please ensure that

    your boot-loader understands md/v1.x metadata, or use

    --metadata=0.90

Continue creating array? y

[root@localhost ~]# mkfs.xfs /dev/md0

[root@localhost ~]# mount /dev/md0 /mnt



卸載磁盤陣列:

mdadm -f /dev/md0 /dev/vdb1 ##破壞磁盤陣列md0中的vdb1磁盤

mdadm -D /dev/md0 ##查看正在使用的磁盤

mdadm -r /dev/md0 /dev/vdb1 ##刪除磁盤陣列中的vdb1磁盤

mdadm -a /dev/md0 /dev/vdb1 ##

umount /mnt

mdadm -S /dev/md0 ##中止使用磁盤陣列


@@!!!實例:

[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb1

mdadm: hot remove failed for /dev/vdb1: Device or resource busy

[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb2

mdadm: hot remove failed for /dev/vdb2: Device or resource busy

[root@localhost ~]# mdadm -f /dev/md0 /dev/vdb2

mdadm: set /dev/vdb2 faulty in /dev/md0

[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb2

mdadm: hot removed /dev/vdb2 from /dev/md0

[root@localhost ~]# mdadm -f /dev/md0 /dev/vdb3

mdadm: set /dev/vdb3 faulty in /dev/md0

[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb3

mdadm: hot removed /dev/vdb3 from /dev/md0

[root@localhost ~]# umount /mnt

[root@localhost ~]# mdadm -f /dev/md0 /dev/vdb3

mdadm: set device faulty failed for /dev/vdb3:  No such device

[root@localhost ~]# mdadm -S /dev/md0

mdadm: stopped /dev/md0

[root@localhost ~]# fdisk /dev/vdb

Welcome to fdisk (util-linux 2.23.2).


Changes will remain in memory only, until you decide to write them.

Be careful before using the write command.


Command (m for help): d

Partition number (1-3, default 3): 1

Partition 1 is deleted


Command (m for help): d

Partition number (2,3, default 3): 2

Partition 2 is deleted


Command (m for help): d

Selected partition 3

Partition 3 is deleted


Command (m for help): p


Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk label type: dos

Disk identifier: 0x1459613d


   Device Boot      Start         End      Blocks   Id  System


Command (m for help): wq

The partition table has been altered!


Calling ioctl() to re-read partition table.

Syncing disks.

[root@localhost ~]# partprobe 


####5.配額###


fdisk /dev/vdb

mkdir /pub

mount /dev/vdb1 /pub

 mkfs.xfs /dev/vdb1 -f

chmod 1777 /pub ##給予目錄/pub的權限爲1777

mount -o usrquota /dev/vdb1 /pub

quotaon -uv /dev/vdb1 ##激活配額

edquota -u username ##給用戶分配配額

內容以下:

Disk quotas for user student (uid 1000):

  Filesystem                   blocks(事實)      soft     hard       inodes     soft(事實)  hard

  /dev/vdb1                     0          0     102400          0        0        0

即除了修改第一個hard,其他參數不用修改


su - username ##切換用戶

切換用戶後執行:

dd if=/dev/zero of=/pub/file bs=1M count=10

dd if=/dev/zero of=/pub/file bs=1M count=100

dd if=/dev/zero of=/pub/file bs=1M count=101

quota ##查看用戶被分配的配額


@@!!!實例:

fdisk /dev/vdb

Welcome to fdisk (util-linux 2.23.2).


Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +500M


[root@localhost ~]# mkdir /pub

[root@localhost ~]# mount /dev/vdb1 /pub

mount: unknown filesystem type 'linux_raid_member' ##報錯緣由:由於此磁盤在上一布用於磁盤陣列,因此格式化時應該加-f

[root@localhost ~]# mkfs.xfs /dev/vdb1 -f

[root@localhost ~]# chmod 1777 /pub ##給予目錄/pub的權限爲1777



[root@localhost ~]# mount -o usrquota /dev/vdb1 /pub

[root@localhost ~]# quotaon -uv /dev/vdb1 ##激活配額

quotaon: Enforcing user quota already on /dev/vdb1

[root@localhost ~]# edquota -u username ##給用戶分配配額


[root@localhost ~]# su - username ##切換用戶

[student@localhost ~]$ dd if=/dev/zero of=/pub/file bs=1M count=10

10+0 records in

10+0 records out

10485760 bytes (10 MB) copied, 0.0227461 s, 461 MB/s

[student@localhost ~]$ dd if=/dev/zero of=/pub/file bs=1M count=100

100+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 1.23691 s, 84.8 MB/s

[student@localhost ~]$ dd if=/dev/zero of=/pub/file bs=1M count=101

dd: error writing ‘/pub/file’: Disk quota exceeded ##報錯緣由:超過root用戶給分配的配額

101+0 records in

100+0 records out

104857600 bytes (105 MB) copied, 0.640045 s, 164 MB/s

[student@localhost ~]$ quota ##查看用戶被分配的配額

Disk quotas for user student (uid 1000): 

     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace

      /dev/vdb1  102400*      0  102400      


#####自動掛載配額分區####

/dev/vdb1       /mnt    xfs     defaults,usrquota       0  0

文件內容編寫不正確,則重啓會報錯,此時,修改文件,當修改完後,重啓則又能夠正常啓動



#####################################

####### 1.lvm (創建可拓展磁盤)#########

#####################################


pe爲最小單位

######1.LVM創建########

1.劃分物理分區並把分區id修改成8e


pvs|pvdisplay

vgs|vgdisplay

lvs|lvdisplay


第一步:創建lvm

監控命令:

watch -n 1 'echo "=pvinfo=";pvs;echo "=vginfo=";vgs;echo =lvinfo=;lvs'


pvcreate /dev/vdb1 ##創建pv

vgcreate lzt /dev/vdb1 ##創建vg(組)

lvcreate -L 110M -n lv0 lzt ##設置vm的大小

mkfs.xfs /dev/lzt/lv0 ##格式化

mount /dev/lzt/lv0 /mnt ##掛載


第二步:對創建的lvm進行拓展與拉伸

監控命令:

watch -n 1 'echo "=pvinfo=";pvs;echo "=vginfo=";vgs;echo =lvinfo=;lvs;df -h /mnt'


lvextend -L 250M /dev/lzt/lv0 ##拓展分區爲250M 

xfs_growfs /dev/lzt/lv0 ##對xfs文件系統進行拉伸(須知: 1.當執行完上條命令時,由監控命令可知新拓展的區域尚未xfs文件系統 2.掛載的位置沒有變化,故可直接拉伸)

當一個pv不能知足拓展與拉伸的需求時,操做以下命令:

pvcreate /dev/vdb2 ##創建第二個pv

vgextend lzt /dev/vdb2 ##將第二個pv添加到創建的vg組裏

lvextend -L 600M /dev/lzt/lv0 ##拓展分區爲600M 

xfs_growfs /dev/lzt/lv0 ##對xfs文件系統進行拉伸


@@!!!第一步實例:

[root@localhost ~]# pvcreate /dev/vdb1

  Physical volume "/dev/vdb1" successfully created

[root@localhost ~]# vgcreate lzt /dev/vdb1

  Volume group "lzt" successfully created

[root@localhost ~]# lvcreate -L 110M -n lv0 lzt

  Rounding up size to full physical extent 112.00 MiB

  Logical volume "lv0" created

[root@localhost ~]# mkfs.xfs /dev/lzt/lv0

[root@localhost ~]# mount /dev/lzt/lv0 /mnt


第二步實例:

[root@localhost ~]# lvextend -L 250M /dev/lzt/lv0 

[root@localhost ~]# xfs_growfs /dev/lzt/lv0 

[root@localhost ~]# lvextend -L 600M /dev/lzt/lv0 

  Extending logical volume lv0 to 600.00 MiB

  Insufficient free space: 87 extents needed, but only 61 available ##報錯:現有的pv不能知足要求,須要87個pe纔可成功,現有的只有61個

[root@localhost ~]# pvcreate /dev/vdb2

[root@localhost ~]# vgextend lzt /dev/vdb2

  Volume group "lzt" successfully extended

[root@localhost ~]# lvextend -L 600M /dev/lzt/lv0 

  Extending logical volume lv0 to 600.00 MiB

  Logical volume lv0 successfully resized ##成功拓展與拉伸

[root@localhost ~]# xfs_growfs /dev/lzt/lv0 


第三步:分區的縮小:

(xfs文件類型不能進行縮小,ext文件類型能夠)

umount  /mnt/

mkfs.ext4 /dev/lzt/lv0 ##首先格式化lvm爲ext4文件類型

e2fsck -f /dev/lzt/lv0 ##對lvm中的數據進行查看(在縮小lvm前必需要作的)

resize2fs /dev/lzt/lv0 550M ##將lvm文件系統的大小縮小爲500M

lvreduce -L 500M /dev/lzt/lv0 ##將lv大小縮小爲500M

pvremove /dev/vdb1 /dev/vdb2 ##將/dev/vdb1中的數據移動到/dev/vdb2中(切記:此過程當中不要執行ctrl+c命令操做)

vgreduce lzt /dev/vdb1 ##將/dev/vdb1從vg組中移除

pvremove /dev/vdb1 ##刪除pv(即/dev/vdb1)


第三步:分區縮小實例:

[root@localhost ~]# umount /mnt

[root@localhost ~]# e2fsck -f /dev/lzt/lv0 

[root@localhost ~]# resize2fs /dev/lzt/lv0 550M

[root@localhost ~]# mount /dev/lzt/lv0 /mnt

[root@localhost ~]# lvreduce -L 550M /dev/lzt/lv0 

[root@localhost ~]# umount /mnt

[root@localhost ~]# e2fsck -f /dev/lzt/lv0

[root@localhost ~]# resize2fs /dev/lzt/lv0  200M

[root@localhost ~]# mount /dev/lzt/lv0 /mnt

[root@localhost ~]# lvreduce -L 200M /dev/lzt/lv0 

[root@localhost ~]# pvmove /dev/vdb1 /dev/vdb2

  /dev/vdb1: Moved: 28.0%


  /dev/vdb1: Moved: 100.0%


[root@localhost ~]# vgreduce lzt /dev/vdb1

[root@localhost ~]# pvremove /dev/vdb1


@@@!!!易出現錯誤:

若先縮減lv則會出現錯誤,此時應先將設備的空間升上來,

若刪除了正在使用的設備,則需執行vgreduce --removemissing lzt(vg組名)


操做實例:

[root@localhost ~]# lvreduce -L 100M /dev/lzt/lv0 

  WARNING: Reducing active and open logical volume to 100.00 MiB

  THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce lv0? [y/n]: y

  Reducing logical volume lv0 to 100.00 MiB

  Logical volume lv0 successfully resized

[root@localhost ~]# df

[root@localhost ~]# umount /mnt

[root@localhost ~]# mount /dev/lzt/lv0 /mnt

mount: wrong fs type, bad option, bad superblock on /dev/mapper/lzt-lv0,

       missing codepage or helper program, or other error


       In some cases useful info is found in syslog - try

       dmesg | tail or so.

[root@localhost ~]# mount /dev/lzt/lv0 /mnt

[root@localhost ~]# resize2fs /dev/lzt/lv0 

resize2fs 1.42.9 (28-Dec-2013)

Please run 'e2fsck -f /dev/lzt/lv0' first.


[root@localhost ~]# e2fsck -f /dev/lzt/lv0

[root@localhost ~]# mount /dev/lzt/lv0 /mnt

mount: wrong fs type, bad option, bad superblock on /dev/mapper/lzt-lv0,

       missing codepage or helper program, or other error


       In some cases useful info is found in syslog - try

       dmesg | tail or so.

[root@localhost ~]# lvextend -L 200M /dev/lzt/lv0 

  Extending logical volume lv0 to 200.00 MiB

  Logical volume lv0 successfully resized

[root@localhost ~]# mount /dev/lzt/lv0 /mnt

[root@localhost ~]# vgextend  lzt /dev/vdb1

  Volume group "lzt" successfully extended

[root@localhost ~]# fdisk /dev/vdb

Welcome to fdisk (util-linux 2.23.2).

Command (m for help): d

Partition number (1,2, default 2): 1

Partition 1 is delete

Command (m for help): wq

[root@localhost ~]# partprobe 

[root@localhost ~]# vgreduce --removemissing lzt



@@@!!!lvm快照:

lvcreate -L 12M -n lv0-backc -s /dev/lzt/lv0


實例:

[root@localhost mnt]# touch file

[root@localhost mnt]# cd 

[root@localhost ~]# lvcreate -L 12M -n lv0-backc -s /dev/lzt/lv0

  Logical volume "lv0-backc" created

[root@localhost ~]# mount /dev/lzt/lv0-backc /mnt

[root@localhost ~]# cd /mnt

[root@localhost mnt]# ls

file  lost+found

[root@localhost mnt]# rm -fr file

[root@localhost mnt]# ls

lost+found

[root@localhost mnt]# lvremove /dev/lzt/lv0-backc 

  Logical volume lzt/lv0-backc contains a filesystem in use.

[root@localhost mnt]# cd

[root@localhost ~]# umount /mnt

[root@localhost ~]# lvremove /dev/lzt/lv0-backc 

Do you really want to remove active logical volume lv0-backc? [y/n]: y

  Logical volume "lv0-backc" successfully removed

[root@localhost ~]# lvcreate -L 12M -n lv0-backc -s /dev/lzt/lv0

  Logical volume "lv0-backc" created

[root@localhost ~]# mount /dev/lzt/lv0-backc /mnt

[root@localhost ~]# cd /mnt

[root@localhost mnt]# ll

total 16

-rw-r--r--. 1 root root     0 Nov  6 03:04 file

drwx------. 2 root root 16384 Nov  6 02:09 lost+found



@@@!!!lvm的刪除:

lvremove /dev/lzt/lv0-backc 

lvremove /dev/lzt/lv0

vgremove lzt

pvremove /dev/vdb2


實例:

[root@localhost ~]# lvremove /dev/lzt/lv0-backc 

  Logical volume lzt/lv0-backc contains a filesystem in use.

[root@localhost ~]# umount /mnt

[root@localhost ~]# lvremove /dev/lzt/lv0-backc 

Do you really want to remove active logical volume lv0-backc? [y/n]: y

  Logical volume "lv0-backc" successfully removed

[root@localhost ~]# lvremove /dev/lzt/lv0

  Logical volume lzt/lv0 contains a filesystem in use.

[root@localhost ~]# umount /mnt

[root@localhost ~]# lvremove /dev/lzt/lv0

Do you really want to remove active logical volume lv0? [y/n]: y

  Logical volume "lv0" successfully removed

[root@localhost ~]# vgremove lzt

  Volume group "lzt" successfully removed

[root@localhost ~]# pvremove /dev/vdb2







!!!本身課後去查看awk,grep正則表達式,expect.


######第六單元.shell腳本命令#####


######1.diff#####

diff     file file1 ##比較兩個文件的不一樣

-c ##顯示周圍的行

-u ##按照統一格式輸出生成補丁

-r ##比較兩個目錄中文件的不一樣

patch      file  file.path ##打補丁

-b ##備份原文件


#####2.grep######

grep 關鍵字 文件|目錄 ##在文件或目錄中查找含有關鍵字的行


grep -i ##忽略大小寫

-n ##顯示關鍵字所在行的序號(第幾行)

-c ##顯示過濾結果的行數

-v ##反向過濾

-E "關鍵字1|關鍵字2" ##過濾多個關鍵字

-r 目錄 ##在目錄中查找含有關鍵字的文件


注意: ^關鍵字 ##以關鍵字開頭

    關鍵字$ ##以關鍵字結尾


例如:

[root@station mnt]# grep -i root passwd | grep -E "^root|root$" -v -n

2:operator:x:11:0:operator:/root:/sbin/nologin

4:test:root:nihao

6:nihao:test:ROOT

[root@station mnt]# grep -i root passwd -n | grep -E "^root|root$" -v

1:root:x:0:0:root:/root:/bin/bash

10:operator:x:11:0:operator:/root:/sbin/nologin

34:root:nihao:test

35:test:root:nihao

37:nihao:test:ROOT


[root@station mnt]# grep -E -i "^root|root$" -v passwd -n |grep root

10:operator:x:11:0:operator:/root:/sbin/nologin

35:test:root:nihao


[root@station mnt]# grep -E "^root|root$" -v passwd -n | grep root 

10:operator:x:11:0:operator:/root:/sbin/nologin

35:test:root:nihao


#####3.cut#####

cut ##截取字符

cut -d 分隔符 ##指定分隔符

cut -f 1,7 ##顯示指定的列

cut -c 1-4 ##顯示指定序號的字符(第幾個到第幾個)


例子:只輸出執行ifconfig後,顯示的ip 

[root@station mnt]# ifconfig eth0 | grep -i "inet " | cut -c 14-24

172.25.7.10

[root@station mnt]# ifconfig eth0 | grep "inet "|awk -F " " '{print $2,$1}'

172.25.7.10 inet


#####4.sort####

sort

-n ##純數字排序

-u ##去冗餘

|uniq -c ##去除冗餘並統計冗餘的次數

-t ##指定分隔符

-k ##指定列


例子:

[root@station mnt]# sort -n file |uniq -c

      3 

      3 0

      2 2

      1 3

      1 4

      1 5

      1 10

      1 21

      1 54

      1 112

      1 02220

      1 51122

[root@station mnt]# vim file 

[root@station mnt]# sort -t : -k 2 file -n

A:

A:

A:

A:0

A:0

A:0

A:2

A:2

A:3

A:4

A:5

A:10

A:21

A:54

A:112

A:02220

A:51122

[root@station mnt]# sort -t : -k 2 file -n | cut -c 3-7




0

0

0

2

2

3

4

5

10

21

54

112

02220

51122

[root@station mnt]# sort -t : -k 2 file -n | cut -d : -f 2




0

0

0

2

2

3

4

5

10

21

54

112

02220

51122


#####5.uniq###

sort file |uniq -c ##去除冗餘並統計冗餘的次數

-d ##顯示冗餘的行

-u ##顯示惟一的行

@@注意:直接執行uniq命令時,只有相鄰的兩行相同時纔會被系統識別爲冗餘行,可是在和sort搭配使用時則是在文件全文中尋找相同行(冗餘行)


例子:[root@station mnt]# uniq -c file

      1 1

      1 22

      1 33

      1 2

      2 1

      1 55

      1 2213

      1 551156

      2 22

      1 4

      1 112

      1 15

[root@station mnt]# uniq -d file

1

22

[root@station mnt]# uniq -u file

1

22

33

2

55

2213

551156

4

112

15

[root@station mnt]# sort file |uniq -c

      3 1

      1 112

      1 15

      1 2

      3 22

      1 2213

      1 33

      1 4

      1 55

      1 551156

[root@station mnt]# sort file |uniq -d

1

22

[root@station mnt]# sort file |uniq -u

112

15

2

2213

33

4

55

551156


#####6.sed###

sed 's/原字符/替換字符/g' file

sed -e '策略1' -e '策略2' file

sed -i file ##把轉換後的內容輸入到指定文件

sed '3,5s/原字符/替換字符/g' ##3-5行替換


注: 下面的x表示數字

sed xd ##屏蔽指定行

sed xp ##複製指定行

sed -n xp ##只顯示指定行


附加:

cat -b filename ##給文件顯示內容加行號

tr 'a-z' 'A-Z' < filename ##將filename中的小寫字母替換成大寫


#####7.awk#####

awk 用法:awk ' pattern {action} '  


變量名 含義 

ARGC 命令行變元個數 

ARGV 命令行變元數組 

FILENAME 當前輸入文件名 

FNR 當前文件中的記錄號 

FS 輸入域分隔符,默認爲一個空格 

RS 輸入記錄分隔符 

NF 當前記錄裏域個數 

NR 到目前爲止記錄數 

OFS 輸出域分隔符 

ORS 輸出記錄分隔符 


一、awk '/101/'               file 顯示文件file中包含101的匹配行。 

   awk '/101/,/105/'         file 

   awk '$1 == 5'             file 

   awk '$1 == "CT"'          file 注意必須帶雙引號 

   awk '$1 * $2 >100 '       file  

   awk '$2 >5 && $2<=15'     file



二、awk '{print NR,NF,$1,$NF,}' file 顯示文件file的當前記錄號、域數和每一行的第一個和最後一個域。 

   awk '/101/ {print $1,$2 + 10}' file 顯示文件file的匹配行的第1、二個域加10。 

   awk '/101/ {print $1$2}'  file 

   awk '/101/ {print $1 $2}' file 顯示文件file的匹配行的第1、二個域,但顯示時域中間沒有分隔符。



三、df | awk '$4>1000000 '         經過管道符得到輸入,如:顯示第4個域知足條件的行。



四、awk -F "|" '{print $1}'   file 按照新的分隔符「|」進行操做。 

   awk  'BEGIN { FS="[: \t|]" } 

   {print $1,$2,$3}'     file 經過設置輸入分隔符(FS="[: \t|]")修改輸入分隔符。 


   Sep="|" 

   awk -F $Sep '{print $1}'  file 按照環境變量Sep的值作爲分隔符。    

   awk -F '[ :\t|]' '{print $1}' file 按照正則表達式的值作爲分隔符,這裏表明空格、:、TAB、|同時作爲分隔符。 

   awk -F '[][]'    '{print $1}' file 按照正則表達式的值作爲分隔符,這裏表明[、]



五、awk -f awkfile     file 經過文件awkfile的內容依次進行控制。 

   cat awkfile 

/101/{print "\047 Hello! \047"} --遇到匹配行之後打印 ' Hello! '.\047表明單引號。 

{print $1,$2}                   --由於沒有模式控制,打印每一行的前兩個域。



六、awk '$1 ~ /101/ {print $1}' file 顯示文件中第一個域匹配101的行(記錄)。



七、awk   'BEGIN { OFS="%"} 

   {print $1,$2}'           file 經過設置輸出分隔符(OFS="%")修改輸出格式。



八、awk   'BEGIN { max=100 ;print "max=" max}             BEGIN 表示在處理任意行以前進行的操做。 

   {max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一個域的最大值。 

   (表達式1?表達式2:表達式3 至關於: 

   if (表達式1) 

       表達式2 

   else 

       表達式3 

   awk '{print ($1>4 ? "high "$1: "low "$1)}' file 



九、awk '$1 * $2 >100 {print $1}' file 顯示文件中第一個域匹配101的行(記錄)。



十、awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行後先將第3個域替換後再顯示該行(記錄)。 

    awk '{$7 %= 3; print $7}'  file 將第7域被3除,並將餘數賦給第7域再打印。



十一、awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行後爲變量wage賦值並打印該變量。



十二、awk '/tom/ {count++;}  

         END {print "tom was found "count" times"}' file END表示在全部輸入行處理完後進行處理。



1三、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4; 

         END {print "The total is $" cost>"filename"}'    file gsub函數用空串替換$和,再將結果輸出到filename中。 

    1 2 3 $1,200.00 

    1 2 3 $2,300.00 

    1 2 3 $4,000.00 


    awk '{gsub(/\$/,"");gsub(/,/,""); 

    if ($4>1000&&$4<2000) c1+=$4; 

    else if ($4>2000&&$4<3000) c2+=$4; 

    else if ($4>3000&&$4<4000) c3+=$4; 

    else c4+=$4; } 

    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 

    經過if和else if完成條件語句 


    awk '{gsub(/\$/,"");gsub(/,/,""); 

    if ($4>3000&&$4<4000) exit; 

    else c4+=$4; } 

    END {printf  "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file 

    經過exit在某條件時退出,可是仍執行END操做。 

    awk '{gsub(/\$/,"");gsub(/,/,""); 

    if ($4>3000) next; 

    else c4+=$4; } 

    END {printf  "c4=[%d]\n",c4}"' file 

    經過next在某條件時跳過該行,對下一行執行操做。 



1四、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file一、file二、file3的文件內容所有寫到fileall中,格式爲 

    打印文件並前置文件名。



1五、awk ' $1!=previous { close(previous); previous=$1 }    

    {print substr($0,index($0," ") +1)>$1}' fileall 把合併後的文件從新分拆爲3個文件。並與原文件一致。



1六、awk 'BEGIN {"date"|getline d; print d}'         經過管道把date的執行結果送給getline,並賦給變量d,而後打印。 



1七、awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}' 

    經過getline命令交互輸入name,並顯示出來。 

    awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}' 

    打印/etc/passwd文件中用戶名包含050x_的用戶名。 


1八、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 經過while語句實現循環。 

    awk '{ for(i=1;i<NF;i++) {print NF,$i}}'   file 經過for語句實現循環。     

    type file|awk -F "/" ' 

    { for(i=1;i<NF;i++) 

    { if(i==NF-1) { printf "%s",$i } 

    else { printf "%s/",$i } }}'               顯示一個文件的全路徑。 

    用for和if顯示日期 

    awk  'BEGIN { 

for(j=1;j<=12;j++) 

{ flag=0; 

  printf "\n%d月份\n",j; 

        for(i=1;i<=31;i++) 

        { 

        if (j==2&&i>28) flag=1; 

        if ((j==4||j==6||j==9||j==11)&&i>30) flag=1; 

        if (flag==0) {printf "%02d%02d ",j,i} 

        } 

}'



1九、在awk中調用系統變量必須用單引號,若是是雙引號,則表示字符串 

Flag=abcd 

awk '{print '$Flag'}'   結果爲abcd 

awk '{print  "$Flag"}'   結果爲$Flag


以上轉自chinaunix,如下是本身的總結:


求和:


    $awk 'BEGIN{total=0}{total+=$4}END{print total}' a.txt   -----對a.txt文件的第四個域進行求和!


$ awk '/^(no|so)/' test-----打印全部以模式no或so開頭的行。


$ awk '/^[ns]/{print $1}' test-----若是記錄以n或s開頭,就打印這個記錄。


$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----若是第一個域以兩個數字結束就打印這個記錄。


$ awk '$1 == 100 || $2 < 50' test-----若是第一個或等於100或者第二個域小於50,則打印該行。


$ awk '$1 != 10' test-----若是第一個域不等於10就打印該行。


$ awk '/test/{print $1 + 10}' test-----若是記錄包含正則表達式test,則第一個域加10並打印出來。


$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----若是第一個域大於5則打印問號後面的表達式值,不然打印冒號後面的表達式值。


$ awk '/^root/,/^mysql/' test----打印以正則表達式root開頭的記錄到以正則表達式mysql開頭的記錄範圍內的全部記錄。若是找到一個新的正則表達式root開頭的記 錄,則繼續打印直到下一個以正則表達式mysql開頭的記錄爲止,或到文件末尾


######8.grep正則表達式####

grep 命令是支持正則表達式的一個多用途文本搜索工具,他的通常格式爲:


grep  [選項] [模式] [文件...]


grep命令的選項用於對搜索過程進行補充說明。grep命令的模式十分靈活,能夠是字符串、變量,還能夠是正則表達式。不管模式是何種形式,只要模式中包含了空格,就須要使用雙引號或單引號將模式引發來。


下面具體說明grep選項的含義和用法。


一、-c選項: -c選項表示輸出匹配字符串行的數量。

例子:#輸出文件00.pem中包含jk的行的數量

$ grep -c jk 00.pem

6


二、-n選項:列出全部的匹配行,並輸出行號。

例子:#輸出文件00.pem中包含jk行的行號和行。

$ grep -n jk 00.pem

1:jkfrdjkfdkl

2:dkjfkjkjelkrge

4:frjkj-----------kltijkert

9:fjkdkle;roitoer

13:djkfthe the23

14:the jejk ekj44


三、-選項: 顯示不包含模式的全部行。

例子:#輸出文件00.pem中不包含jk的行的數量

$ grep -vc jk 00.pem

12


四、-i選項: 表示grep命令不區分大小寫。

例子:#輸出文件00.pem中包含 jk(不論大小寫)的行

$ grep -i jk 00.pem

Jkfrdjkfdkl

dkjfkjkjelkrge

frjkj-----------kltijkert

fJKdkle;roitoer

djkfthe the23

the jejk ekj44


五、-h選項: 表示查詢多文件時不顯示文件名。


六、-l選項: 表示只列出符合匹配的文件名,而不列出具體匹配行。


七、-s選項: 表示不顯示不存在或無匹配文本的錯誤信息。

例1:#未使用-s選項,打印錯誤信息

$ grep jk dk 00.pem

grep: dk: 沒有那個文件或目錄

00.pem:Jkfrdjkfdkl

00.pem:dkjfkjkjelkrge

00.pem:frjkj-----------kltijkert

00.pem:the jejk ekj44


例2:#使用-s選項後,不打印錯誤信息

$ grep -s jk dk 00.pem

00.pem:Jkfrdjkfdkl

00.pem:dkjfkjkjelkrge

00.pem:frjkj-----------kltijkert

00.pem:the jejk ekj44


八、-r選項: 表示遞歸搜索,不只搜索當前目錄,並且搜索子目錄。


九、-w和-x選項: 

 -w選項表示匹配整詞,即以模式的字面意思去解析它。

 -x選項是匹配整行,即只有當文件中有整行內容與模式匹配時,grep命令才輸出改行結果。


例:說明grep命令的-w和-x選項的區別


$ cat world.txt

Hello World

World

World Cup

African

One One World

$


#搜索包含單詞「World」的文本行

$ grep -w 'World' world.txt

Hello World

World

World Cup

One One World

$


#搜索整行文本是單詞「World」的行

$ grep -x 'World' world.txt

World

&


十、-q選項: 表示grep將再也不輸出任何結果,而是以退出狀態表示搜索是否成功。0表示成功,1表示未搜索到知足模式的文本行,2表示命令或程序因爲錯誤而未能執行。


例1:grep命令搜索成功

$ grep -q -x 'World' world.txt

$ echo $?

0

$


例2:grep命令未搜索到知足模式的文本行

$ grep -q -x 'World African' world.txt

$ echo $?

1

$


例3:grep命令執行失敗

$ grep -q -x 'World African' world

grep : world : 沒有那個文件或目錄

$ echo $?

2

$


十一、-b和-o選項:

 grep -b選項打印匹配行距文件頭部的偏移量,以字節爲單位。若是在-b選項後面再加上-o選項,grep命令將打印匹配的詞距文件頭部的偏移量。

例1:#第一條命令:打印匹配行距文件頭部的偏移量

$ grep -b -w 'World' world.txt

0:Hello World

12:World

18:World Cup

36:One One World

$


例2:#第一條命令:打印匹配詞距文件頭部的偏移量

$ grep -b  -o -w 'World' world.txt

6:World

12:World

18:World

44:World

$


下面介紹一下grep和正則表達式結合使用的例子。


一、匹配行首:

元字符「^」表示行首,若是須要匹配.pem爲後綴的文件中以橫槓「-」開頭的行,可輸入以下命令:

$ grep ^- *.pem


二、設置大小寫:

利用-i符號可使grep命令不區分大小寫,[ ]符號也能夠實現這一功能。

例如: 

$ grep -n [Jj][Kk] 00.pem

Jkfrdjkfdkl

dkjfkjkjelkrge

frjkj-----------kltijkert

fJKdkle;roitoer

the jejk ekj44


三、匹配重複字符:

能夠用「.」符號和「*」符號來實現。

例1:grep和.符號

#表示搜索00.pem文件中以/字符開始、中間4個任意字符、第6個字符仍爲/的行。

$ grep ^/..../ 00.pem

/home/globus/fff.pem


例2:grep和*符號

#表示搜索00.pem文件中以「-」開頭,重複「-」符號任意次,而後是B字符的行。

$ grep ^-*B 00.pem

----------Bkjfkerj


四、轉移符:

若是匹配的目標字符串包含的元字符,則須要用轉義符「\」屏蔽其意義。

例: #搜索「-」符號重複5次的文本行。

$ grep '\-\{5\}' 00.pem

----------Bkjfkerj

frjkj----------Bkltijkert

riuitieoe---erj-----rg


五、POSIX字符類:

類名                                   意義

[:upper:]                             表示大寫字母[A-Z]

[:lower:]                              表示小寫字母[a-z]

[:digit:]                                表示阿拉伯數字[0-9]

[:alnum:]                             表示大小寫字母和阿拉伯數字[0-9 a-z A-Z]

[:space:]                             表示空格或Tab鍵        

[:alpha:]                              表示大小寫字母[a-z A-Z]

[:cntrl:]                                表示Ctrl鍵

[:graph:][:print:]                   表示ASCII碼33-16之間的字符

[:xdigit:]               表示16進制數字[0-9 A-F a-f]


六、精確匹配:

正則表達式中的「\<\>」用於精確匹配。

例子:

$ grep the 00.pem          #列出包含the字符串的行

the jskj 'dff

ddfd df the rlt

gkjtuthelr112

dkfthe the23

the jejk ekj44

jhh lk klrthe 'f'

$


$ grep "\<the\>" 00.pem         #精確匹配the這個單詞

the jskj 'dff

ddfd df the rlt

the jejk ekj44


七、或字符

或字符「|」是擴展的正則表達式中定義的,grep須要加上-E才能支持它。grep -E等價於egrep。

例:搜索00.pem中以冒號「:」或以非英文字母結尾的行。

$ egrep "[^[:alpha:]]$|:$" 00.pem

 

aslkdlsf:

tji54oio7yu:

gkjtuthelr112

dkfthe the23

the jejk ekj44

jhh lk klrthe 'f'

erkjgtl35:

rgjtkry67

---------------------------------------------

$ grep -E"[^[:alpha:]]$|:$" 00.pem

 

aslkdlsf:

tji54oio7yu:

gkjtuthelr112

dkfthe the23

the jejk ekj44

jhh lk klrthe 'f'

erkjgtl35:

rgjtkry67



######9.expect#####

1,使用「-c」選項,從命令行執行expect腳本


expect可讓你使用「-c」選項,直接在命令行中執行它,以下所示:


$ expect -c 'expect "\n" {send "pressed enter\n"}


pressed enter

$

若是你執行了上面的腳本,它會等待輸入換行符(\n)。按「enter」鍵之後,它會打印出「pressed enter」這個消息,而後退出。


2,使用「-i」選項交互地執行expect腳本


使用「-i」選項,能夠經過來自於標準輸入的讀命令來交互地執行expect腳本。以下所示:


$ expect -i arg1 arg2 arg3

expect1.1>set argv

arg1 arg2 arg3

expect1.2>

正常狀況下,當你執行上面的expect命令的時候(沒有「-i」選項),它會把arg1當成腳本的文件名,因此「-i」選項可讓腳本把多個參數當成一個連續的列表。


當你執行帶有「-c」選項的expect腳本的時候,這個選項是十分有用的。由於默認狀況下,expect是交互地執行的。


3,當執行expect腳本的時候,輸出調試信息


當你用「-d」選項執行代碼的時候,你能夠輸出診斷的信息。以下所示:


$ cat sample.exp

# !/usr/bin/expect -f

expect "\n";

send "pressed enter";



$ expect -d sample.exp

expect version 5.43.0

argv[0] = expect  argv[1] = -d  argv[2] = sample.exp

set argc 0

set argv0 "sample.exp"

set argv ""

executing commands from command file sample.exp


expect: does "" (spawn_id exp0) match glob pattern "\n"? no


expect: does "\n" (spawn_id exp0) match glob pattern "\n"? yes

expect: set expect_out(0,string) "\n"

expect: set expect_out(spawn_id) "exp0"

expect: set expect_out(buffer) "\n"

send: sending "pressed enter" to { exp0 pressed enter}

4,使用「-D」選項啓動expect調試器


「-D」選項用於啓動調試器,它只接受一個布爾值的參數。這個參數表示提示器必須立刻啓動,仍是隻是初始化調試器,之後再使用它。


$ expect -D 1 script

「-D」選項左邊的選項會在調試器啓動之前被處理。而後,在調試器啓動之後,剩下的命令纔會被執行。


$ expect -c 'set timeout 10' -D 1 -c 'set a 1'

1: set a 1

dbg1.0>

5,逐行地執行expect腳本


一般,expect會在執行腳本以前,把整個腳本都讀入到內存中。「-b」選項可讓expect一次只讀取腳本中的一行。當你沒有寫完整個腳本的時候,這是十分有用的,expect能夠開始執行這個不完整的腳本,而且,它能夠避免把腳本寫入到臨時文件中。


$ expect -b

6,讓expect不解釋命令行參數


你可使用標識符讓expect不解釋命令行參數。


你能夠像下面這樣的讀入命令行參數:


$ cat  print_cmdline_args.exp

#!/usr/bin/expect

puts 'argv0 : [lindex $argv 0]';

puts 'argv1 : [lindex $argv 1]';

當執行上面的腳本的時候,會跳過命令行選項,它們會被當成參數(而不是expect選項),以下所示:


$ expect print_cmdline_args.exp -d -c

argv0 : -d

argv1 : -c

相關文章
相關標籤/搜索