當前位置:首頁 » 系統管理 » Script

Script命令

轉載說明:
      版權聲明:本文為【歐陽鵬】原創文章,歡迎轉載,轉載請注明出處! 【http://blog.csdn.net/ouyang_peng】 https://blog.csdn.net/qq446282412/article/details/78818492

一、背景

在之前的博客 【Git學習–>如何通過Shell腳本實現 監控Gitlab備份整個過程并且通過郵件通知得到備份結果?】 里面,我已經詳細記錄了每天的自動備份與清理過期備份文件的工作。

1、每天凌晨2點在Gitlab服務器上執行Gitlab備份功能。
2、每天凌晨3點在Gitlab服務器上執行scp命令將最新的Gitlab備份文件復制到遠程的文件備份服務器。
3、每天凌晨4點在遠程的文件備份服務器上檢測備份文件的時間,自動刪除超過7天的備份文件。

這個腳本從8月18日開始運行,到12月12日一直都是正常運行的,可是到12月13日開始出現在執行第二條命令的時候出現了失敗的情況,到今天已經連續出現4天了。

這里寫圖片描述

一開始我收到這個郵件的時候,我自己手動觸發scp腳本去執行備份操作,發現都是正常的。
然后我懷疑

  • 1、是不是第一步本地備份還沒有執行完,第二步備份到遠程服務器的操作就開始執行了?
  • 2、是不是凌晨3點的時候是不是在這臺Linux服務器上有其他人的腳本影響了我的腳本執行?
  • 3、是不是凌晨3點的時候,這臺Linux服務器上面的網絡突然不通了?

好吧,關于第一點我查看了本地備份的日志

這里寫圖片描述

root@ubuntu4146:/data/gitlabData/backups# cat log/backup_2017-12-16.log 
Gitlab auto backup at local server, start at  2017-12-16 02:00:02
---------------------------------------------------------------------------
-----------------------------------Success!----------------------------------------
Gitlab auto backup at local server, end at  2017-12-16 02:29:35
root@ubuntu4146:/data/gitlabData/backups# 

發現第一步的本地備份日志只執行了半個小時在凌晨2點29分就備份完畢了,而第二步備份到遠程服務器需要3點鐘才開始執行,因此這個懷疑點被pass掉了。

關于懷疑點2和懷疑點3,問了本部門其他同事以及網絡技術部門的人,都說沒有相關的影響因素,沒辦法這個問題得解決??!每天晚上的定時任務都失敗了,然后早上來公司收到郵件之后我手動去執行該腳本又是百分之百成功,怪哉怪哉!

不過沒有日志,其他同事都不會承認是他們的問題,當然也不一定是他們的問題。一切都要通過日志來查看第二步備份過程中,到底發生了什么事情。因此我需要在之前的基礎上,把整個備份過程的日志都記錄下來。

但是諸如 scp 這樣的命令,打印在屏幕上的東西沒法直接通過重定向來保存,因為它的輸出并不是標準輸出,那我要搞保存 scp 的日志怎么辦呢?

通過查詢資料,發現了script命令可以實現該功能,下面就讓我們一起來學習學習script命令。

二、script命令簡介

當你在終端或控制臺上工作時,你可能想記錄下自己做了些什么。這種記錄可以看成是保存了終端痕跡的文檔。假設你跟一些Linux管理員同時在系統上干活?;蛘哒f你讓別人遠程到你的服務器。你就會想記錄下終端發生過什么。要實現它,你可以使用script命令。

2.1 什么script命令

script 是一個神奇命令,可以使用script工具記錄用戶在當前終端的所有的操作,已經輸出到屏幕的內容。將這些信息保存到指定的文本文件中。
也就是說,script命令在你需要記錄或者存檔終端活動時可能很有用,記錄文件會存儲為文本文件,所以可以很方便地用文本編輯器打開。
在使用script命令將終端的會話過程錄制下來之后,可以使用 scriptreplay將其錄制的結果播放給他人觀看。
script 的好處就在于你在終端中的所有操作、敲過的命令和打印出的結果它都可以原原本本地進行錄制??梢詰糜诮虒W、演示、審計。

2.2 script命令操作

使用 script --help 命令來查看 script命令的用法

root@ubuntu4146:/# script --help

Usage:
 script [options] [file]

Options:
 -a, --append            append the output
 -c, --command <command> run command rather than interactive shell
 -r, --return            return exit code of the child process
 -f, --flush             run flush after each write
     --force             use output file even when it is a link
 -q, --quiet             be quiet
 -t, --timing[=]   output timing data to stderr (or to FILE)
 -V, --version           output version information and exit
 -h, --help              display this help and exit

root@ubuntu4146:/# 

這里寫圖片描述

2.2.1 [file]選項

  • 1、當file為空時,操作內容將記錄到當前目錄中名稱為typescript的文本文件中。

例如,我們直接輸入script,不加file選項的時候,開始記錄終端的操作行為,并將操作內容輸出到當前目錄的typescript中,如下圖所示:

root@ubuntu4146:/# script
Script started, file is typescript
root@ubuntu4146:/# 

這里寫圖片描述

生成的默認文件為 typescript ,如下圖所示:

這里寫圖片描述

  • 2、如果指定file,那么將把終端的操作內容記錄到file文件中。
root@ubuntu4146:/# exit
exit

Script done on 20171216日 星期六 112406秒
root@ubuntu4146:/# script script_ouyangpeng.his
Script started, file is script_ouyangpeng.his
root@ubuntu4146:/# ll
total 660
drwxr-xr-x  26 root root   4096 1216 11:25 ./
drwxr-xr-x  26 root root   4096 1216 11:25 ../
drwxr-xr-x   2 root root   4096 1215 16:23 bin/
drwxr-xr-x   3 root root   4096 113  2015 boot/
drwxr-xr-x   3 root root   4096 1210  2015 build/
drwxr-xr-x   8 root root   4096  817 11:38 data/
drwxr-xr-x  15 root root   4200 125 09:54 dev/
drwxr-xr-x 130 root root  12288 1215 16:24 etc/
drwxr-xr-x   4 root root   4096 1120  2016 home/
lrwxrwxrwx   1 root root     33 113  2015 initrd.img -> boot/initrd.img-3.19.0-25-generic
drwxr-xr-x  22 root root   4096  13  2017 lib/
drwxr-xr-x   2 root root  12288  13  2017 lib32/
drwxr-xr-x   2 root root   4096  13  2017 lib64/
drwxr-xr-x   2 root root   4096  13  2017 libx32/
drwx------   2 root root  16384 11月  3  2015 lost+found/
drwxr-xr-x   3 root root   4096 113  2015 media/
drwxr-xr-x   2 root root   4096  411  2014 mnt/
drwxr-xr-x   4 root root   4096  810 11:06 opt/
dr-xr-xr-x 461 root root      0 125 09:54 proc/
drwx------   8 root root   4096 12月 16 10:00 root/
drwxr-xr-x  24 root root    840 1216 11:26 run/
drwxr-xr-x   2 root root   4096 1215 16:23 sbin/
-rw-r--r--   1 root root      0 12月 16 11:25 script_ouyangpeng.his
drwxr-xr-x   3 root root   4096 1116  2016 srv/
dr-xr-xr-x  13 root root      0 1216 11:21 sys/
drwxrwxrwt   8 root root 552960 1216 11:25 tmp/
-rw-r--r--   1 root root   2217 12月 16 11:24 typescript
drwxr-xr-x  15 root root   4096 114  2015 usr/
drwxr-xr-x  14 root root   4096  224  2017 var/
lrwxrwxrwx   1 root root     30 113  2015 vmlinuz -> boot/vmlinuz-3.19.0-25-generic
root@ubuntu4146:/# 

這里寫圖片描述

如上代碼所示,我們先exit掉第一個script命令,然后我們開始第二個script命令,并且直接file選項為 script_ouyangpeng.his。這樣就會在當前目錄下生成一個script_ouyangpeng.his文件。

2.2.2 [options]選項

root@ubuntu4146:/data/gitlabData/backups# script --help

Usage:
 script [options] [file]

Options:
 -a, --append            append the output
 -c, --command <command> run command rather than interactive shell
 -r, --return            return exit code of the child process
 -f, --flush             run flush after each write
     --force             use output file even when it is a link
 -q, --quiet             be quiet
 -t, --timing[=]   output timing data to stderr (or to FILE)
 -V, --version           output version information and exit
 -h, --help              display this help and exit

script有很多 option 可選項,下面我們來介紹一下這幾個 option。

  • -a 選項 ,在現有輸出錄制的文件的內容上追加新的內容
  • -c選項 ,后面可以加上需要執行的命令,而不是交互式shell上執行的命令
  • -r選項 , 子進程中返回退出代碼
  • -f選項 , 如果需要在輸出到日志文件的同時,也可以查看日志文件的內容,可以使用 -f 參數。ps:可以用于教學,兩個命令行接-f可以實時演示
  • -q選項 ,可以使script命令以靜默模式運行
  • -t選項,指明輸出錄制的時間數據
  • -V選項,輸出script的版本信息,然后退出
  • -h選項,輸出script的help信息,然后退出

現在我們來使用一下這幾個option可選項。

先從簡單的來

  • script -V 選項
root@ubuntu4146:/# script -V
script from util-linux 2.20.1

這里寫圖片描述

  • script -h 選項
root@ubuntu4146:/# script -h

Usage:
 script [options] [file]

Options:
 -a, --append            append the output
 -c, --command <command> run command rather than interactive shell
 -r, --return            return exit code of the child process
 -f, --flush             run flush after each write
     --force             use output file even when it is a link
 -q, --quiet             be quiet
 -t, --timing[=]   output timing data to stderr (or to FILE)
 -V, --version           output version information and exit
 -h, --help              display this help and exit

root@ubuntu4146:/# 

這里寫圖片描述

  • script -q 選項
root@ubuntu4146:/# script
Script started, file is typescript
root@ubuntu4146:/# exit
exit
Script done, file is typescript
root@ubuntu4146:/# script -q
root@ubuntu4146:/# exit
exit
root@ubuntu4146:/# 

這里寫圖片描述

  • script -a 選項

我們先使用 script script_ouyangpeng.his 命令來記錄,然后敲一個echo "Hello OuyangPeng"來輸出一句話,接著使用exit命令退出script記錄。

root@ubuntu4146:/# script script_ouyangpeng.his 
Script started, file is script_ouyangpeng.his
root@ubuntu4146:/# echo "Hello OuyangPeng"
Hello OuyangPeng
root@ubuntu4146:/# exit
exit
Script done, file is script_ouyangpeng.his

這里寫圖片描述

現在我們可以查看下 script_ouyangpeng.his 文件中的內容

root@ubuntu4146:/# script script_ouyangpeng.his 
Script started, file is script_ouyangpeng.his
root@ubuntu4146:/# echo "Hello OuyangPeng"
Hello OuyangPeng
root@ubuntu4146:/# exit
exit
Script done, file is script_ouyangpeng.his
root@ubuntu4146:/# vim script_ouyangpeng.his 
root@ubuntu4146:/# more script_ouyangpeng.his 
Script started on 20171216日 星期六 114713秒
root@ubuntu4146:/# echo "Hello OuyangPeng"
Hello OuyangPeng
root@ubuntu4146:/# exit
exit

Script done on 20171216日 星期六 114737秒
root@ubuntu4146:/# 

這里寫圖片描述

如上圖所示,記錄文件中的內容完完全全將我們的所有操作都記錄下來了。

現在我們使用 script -a 選項 在 script_ouyangpeng.his 記錄文件上追加內容,如下所示:

root@ubuntu4146:/# script -a script_ouyangpeng.his 
Script started, file is script_ouyangpeng.his
root@ubuntu4146:/# echo "Hello OuyangPeng , using the option -a "
Hello OuyangPeng , using the option -a 
root@ubuntu4146:/# exit
exit
Script done, file is script_ouyangpeng.his
root@ubuntu4146:/# 

這里寫圖片描述

命令執行完之后,我們來查看下 script_ouyangpeng.his 文件內容

這里寫圖片描述

  • script -t 選項
root@ubuntu4146:/# script -t 2>script_ouyangpeng.time -a script_ouyangpeng.his 
Script started, file is script_ouyangpeng.his
root@ubuntu4146:/# echo "hello script -t "
hello script -t 
root@ubuntu4146:/# exit
exit
Script done, file is script_ouyangpeng.his
root@ubuntu4146:/# 

這里寫圖片描述

選項-t用于存儲時序文件,這里導入到stderr,再重定向到script_ouyangpeng.time,
選項-a用于將命令輸出信息,追加到script_ouyangpeng.his文件。

這樣錄制視屏就很方便啦,而且這兩個文件很小,可以拷貝到需要播放的機器上進行播放。

script_ouyangpeng.time文件內容如下

root@ubuntu4146:/# cat script_ouyangpeng.time 
0.687691 42
0.011893 1
4.882787 1
0.239823 1
0.143958 1
0.144012 1
0.175839 1
0.896221 1
0.104910 1
0.431160 3
1.080299 3
0.087901 3
0.136447 3
0.135804 3
0.176703 3
0.135228 3
0.312291 3
0.199814 3
0.192203 3
0.151796 3
0.352006 3
0.192111 3
6.896969 3
0.975974 3
0.176020 3
0.344094 3
8.946105 62
0.415012 1
3.224206 1
0.264114 1
0.128965 1
0.391474 8

這里寫圖片描述

script_ouyangpeng.his文件如下

root@ubuntu4146:/# cat script_ouyangpeng.his 
Script started on 20171216日 星期六 114713秒
root@ubuntu4146:/# echo "Hello OuyangPeng"
Hello OuyangPeng
root@ubuntu4146:/# exit
exit

Script done on 20171216日 星期六 114737秒
Script started on 20171216日 星期六 115345秒
root@ubuntu4146:/# echo "Hello OuyangPeng , using the option -a "
Hello OuyangPeng , using the option -a 
root@ubuntu4146:/# exit
exit

Script done on 20171216日 星期六 115429秒
Script started on 20171216日 星期六 120535秒
root@ubuntu4146:/# echo "hello script -t "
hello script -t 
root@ubuntu4146:/# exit
exit

Script done on 20171216日 星期六 120607秒
root@ubuntu4146:/# 

這里寫圖片描述

  • script -f 選項

在第一個命令框輸入

root@ubuntu4146:/# script -f  -t 2>script_ouyangpeng_f.time -a script_ouyangpeng_f.his 
Script started, file is script_ouyangpeng_f.his
root@ubuntu4146:/# echo "hello ouyangpeng script -f "
hello ouyangpeng script -f 
root@ubuntu4146:/# echo "script -f  second step echo "
script -f  second step echo 
root@ubuntu4146:/# 

使用script -f 實時刷新數據,記錄文件分別為 script_ouyangpeng_f.time 和 script_ouyangpeng_f.his

這里寫圖片描述

現在打開第二個命令框,輸入命令

scriptreplay script_ouyangpeng_f.time script_ouyangpeng_f.his

敲完命令回車后,終端會一步一步的回放在第一個命令框輸入的記錄。如下所示:

這里寫圖片描述

具體的動畫效果,讀者可以自己實際操作體驗,這里就不放gif圖片了。

  • script -c 選項
root@ubuntu4146:/# script -a "script_ouyangpeng_c.his" -c "ls -h"
Script started, file is script_ouyangpeng_c.his
bin    dev     lib     lost+found  proc  script_ouyangpeng_c.his   script_ouyangpeng.time  usr
boot   etc     lib32   media       root  script_ouyangpeng_f.his   srv             var
build  home    lib64   mnt         run   script_ouyangpeng_f.time  sys             vmlinuz
data   initrd.img  libx32  opt         sbin  script_ouyangpeng.his     tmp
Script done, file is script_ouyangpeng_c.his
root@ubuntu4146:/# 

這里寫圖片描述

-c 后面,接上命令 ls -h ,然后將記錄追加到script_ouyangpeng_c.his文件中

現在我們來查看 script_ouyangpeng_c.his文件

root@ubuntu4146:/# cat script_ouyangpeng_c.his 
Script started on 20171216日 星期六 124916秒
bin    dev     lib     lost+found  proc  script_ouyangpeng_c.his   script_ouyangpeng.time  usr
boot   etc     lib32   media       root  script_ouyangpeng_f.his   srv             var
build  home    lib64   mnt         run   script_ouyangpeng_f.time  sys             vmlinuz
data   initrd.img  libx32  opt         sbin  script_ouyangpeng.his     tmp

Script done on 20171216日 星期六 124916秒
root@ubuntu4146:/# 

這里寫圖片描述

2.2.3 退出script

要退出記錄活動,我們可以在終端中按下Ctrl+D,或者輸入exit。在退出script前,你會發現記錄文件的大小為0 Kb,而在退出之后,文件大小會發生改變。

這里寫圖片描述

root@ubuntu4146:/# script -a "script_ouyangpeng_exit.his"
Script started, file is script_ouyangpeng_exit.his
root@ubuntu4146:/# ll
total 680
drwxr-xr-x  26 root root   4096 12月 16 12:53 ./
drwxr-xr-x  26 root root   4096 12月 16 12:53 ../
drwxr-xr-x   2 root root   4096 12月 15 16:23 bin/
drwxr-xr-x   3 root root   4096 11月  3  2015 boot/
drwxr-xr-x   3 root root   4096 12月 10  2015 build/
drwxr-xr-x   8 root root   4096  8月 17 11:38 data/
drwxr-xr-x  15 root root   4200 12月  5 09:54 dev/
drwxr-xr-x 130 root root  12288 12月 15 16:24 etc/
drwxr-xr-x   4 root root   4096 11月 20  2016 home/
lrwxrwxrwx   1 root root     33 11月  3  2015 initrd.img -> boot/initrd.img-3.19.0-25-generic
drwxr-xr-x  22 root root   4096  1月  3  2017 lib/
drwxr-xr-x   2 root root  12288  1月  3  2017 lib32/
drwxr-xr-x   2 root root   4096  1月  3  2017 lib64/
drwxr-xr-x   2 root root   4096  1月  3  2017 libx32/
drwx------   2 root root  16384 11月  3  2015 lost+found/
drwxr-xr-x   3 root root   4096 11月  3  2015 media/
drwxr-xr-x   2 root root   4096  4月 11  2014 mnt/
drwxr-xr-x   4 root root   4096  8月 10 11:06 opt/
dr-xr-xr-x 464 root root      0 12月  5 09:54 proc/
drwx------   8 root root   4096 12月 16 11:47 root/
drwxr-xr-x  24 root root    840 12月 16 12:53 run/
drwxr-xr-x   2 root root   4096 12月 15 16:23 sbin/
-rw-r--r--   1 root root    461 12月 16 12:49 script_ouyangpeng_c.his
-rw-r--r--   1 root root      0 12月 16 12:53 script_ouyangpeng_exit.his
-rw-r--r--   1 root root    176 12月 16 12:47 script_ouyangpeng_f.his
-rw-r--r--   1 root root   1460 12月 16 12:47 script_ouyangpeng_f.time
-rw-r--r--   1 root root   4312 12月 16 12:36 script_ouyangpeng.his
-rw-r--r--   1 root root    555 12月 16 12:36 script_ouyangpeng.time
drwxr-xr-x   3 root root   4096 11月 16  2016 srv/
dr-xr-xr-x  13 root root      0 12月 16 11:21 sys/
drwxrwxrwt   8 root root 552960 12月 16 12:50 tmp/
drwxr-xr-x  15 root root   4096 11月  4  2015 usr/
drwxr-xr-x  14 root root   4096  2月 24  2017 var/

在執行命令之后,還是 0 字節

root@ubuntu4146:/# echo "hello script exit"
hello script exit
root@ubuntu4146:/# ll
total 680
drwxr-xr-x  26 root root   4096 12月 16 12:53 ./
drwxr-xr-x  26 root root   4096 12月 16 12:53 ../
drwxr-xr-x   2 root root   4096 12月 15 16:23 bin/
drwxr-xr-x   3 root root   4096 11月  3  2015 boot/
drwxr-xr-x   3 root root   4096 12月 10  2015 build/
drwxr-xr-x   8 root root   4096  8月 17 11:38 data/
drwxr-xr-x  15 root root   4200 12月  5 09:54 dev/
drwxr-xr-x 130 root root  12288 12月 15 16:24 etc/
drwxr-xr-x   4 root root   4096 11月 20  2016 home/
lrwxrwxrwx   1 root root     33 11月  3  2015 initrd.img -> boot/initrd.img-3.19.0-25-generic
drwxr-xr-x  22 root root   4096  1月  3  2017 lib/
drwxr-xr-x   2 root root  12288  1月  3  2017 lib32/
drwxr-xr-x   2 root root   4096  1月  3  2017 lib64/
drwxr-xr-x   2 root root   4096  1月  3  2017 libx32/
drwx------   2 root root  16384 11月  3  2015 lost+found/
drwxr-xr-x   3 root root   4096 11月  3  2015 media/
drwxr-xr-x   2 root root   4096  4月 11  2014 mnt/
drwxr-xr-x   4 root root   4096  8月 10 11:06 opt/
dr-xr-xr-x 458 root root      0 12月  5 09:54 proc/
drwx------   8 root root   4096 12月 16 11:47 root/
drwxr-xr-x  24 root root    840 12月 16 12:53 run/
drwxr-xr-x   2 root root   4096 12月 15 16:23 sbin/
-rw-r--r--   1 root root    461 12月 16 12:49 script_ouyangpeng_c.his
-rw-r--r--   1 root root      0 12月 16 12:53 script_ouyangpeng_exit.his
-rw-r--r--   1 root root    176 12月 16 12:47 script_ouyangpeng_f.his
-rw-r--r--   1 root root   1460 12月 16 12:47 script_ouyangpeng_f.time
-rw-r--r--   1 root root   4312 12月 16 12:36 script_ouyangpeng.his
-rw-r--r--   1 root root    555 12月 16 12:36 script_ouyangpeng.time
drwxr-xr-x   3 root root   4096 11月 16  2016 srv/
dr-xr-xr-x  13 root root      0 12月 16 11:21 sys/
drwxrwxrwt   8 root root 552960 12月 16 12:50 tmp/
drwxr-xr-x  15 root root   4096 11月  4  2015 usr/
drwxr-xr-x  14 root root   4096  2月 24  2017 var/
lrwxrwxrwx   1 root root     30 11月  3  2015 vmlinuz -> boot/vmlinuz-3.19.0-25-generic
root@ubuntu4146:/# 

這里寫圖片描述

這個時候,我們輸入 exit 之后,再去查看文件大小

root@ubuntu4146:/# exit
exit
Script done, file is script_ouyangpeng_exit.his
root@ubuntu4146:/# ll
total 688
drwxr-xr-x  26 root root   4096 1216 12:53 ./
drwxr-xr-x  26 root root   4096 1216 12:53 ../
drwxr-xr-x   2 root root   4096 1215 16:23 bin/
drwxr-xr-x   3 root root   4096 113  2015 boot/
drwxr-xr-x   3 root root   4096 1210  2015 build/
drwxr-xr-x   8 root root   4096  817 11:38 data/
drwxr-xr-x  15 root root   4200 125 09:54 dev/
drwxr-xr-x 130 root root  12288 1215 16:24 etc/
drwxr-xr-x   4 root root   4096 1120  2016 home/
lrwxrwxrwx   1 root root     33 113  2015 initrd.img -> boot/initrd.img-3.19.0-25-generic
drwxr-xr-x  22 root root   4096  13  2017 lib/
drwxr-xr-x   2 root root  12288  13  2017 lib32/
drwxr-xr-x   2 root root   4096  13  2017 lib64/
drwxr-xr-x   2 root root   4096  13  2017 libx32/
drwx------   2 root root  16384 11月  3  2015 lost+found/
drwxr-xr-x   3 root root   4096 113  2015 media/
drwxr-xr-x   2 root root   4096  411  2014 mnt/
drwxr-xr-x   4 root root   4096  810 11:06 opt/
dr-xr-xr-x 465 root root      0 125 09:54 proc/
drwx------   8 root root   4096 12月 16 11:47 root/
drwxr-xr-x  24 root root    840 1216 12:55 run/
drwxr-xr-x   2 root root   4096 1215 16:23 sbin/
-rw-r--r--   1 root root    461 12月 16 12:49 script_ouyangpeng_c.his
-rw-r--r--   1 root root   5283 12月 16 12:56 script_ouyangpeng_exit.his
-rw-r--r--   1 root root    176 12月 16 12:47 script_ouyangpeng_f.his
-rw-r--r--   1 root root   1460 12月 16 12:47 script_ouyangpeng_f.time
-rw-r--r--   1 root root   4312 12月 16 12:36 script_ouyangpeng.his
-rw-r--r--   1 root root    555 12月 16 12:36 script_ouyangpeng.time
drwxr-xr-x   3 root root   4096 1116  2016 srv/
dr-xr-xr-x  13 root root      0 1216 11:21 sys/
drwxrwxrwt   8 root root 552960 1216 12:50 tmp/
drwxr-xr-x  15 root root   4096 114  2015 usr/
drwxr-xr-x  14 root root   4096  224  2017 var/
lrwxrwxrwx   1 root root     30 113  2015 vmlinuz -> boot/vmlinuz-3.19.0-25-generic
root@ubuntu4146:/# 

這里寫圖片描述

至此,script的基本用法已經講解完畢了,接下來我們需要將script命令用于我們之前的實際場景中:跟蹤整個備份文件的所有操作。

三、Script命令結合實際使用場景

3.1 先在終端執行script命令記錄scp命令過程

先在終端敲個命令

root@ubuntu4146:/data/gitlabData/backups# script /data/gitlabData/backups/script_log/scp_2017-12-16.log -c "scp -v /data/gitlabData/backups/1513362071_2017_12_16_9.4.3_gitlab_backup.tar  root@172.xxx.xxx.xxx:/root/gitlabDataBackup"

這個命令的意思,使用 script 命令記錄我們的 scp命令執行的結果,執行記錄文件保存在 /data/gitlabData/backups/script_log/scp_2017-12-16.log 文件中。

整個執行過程如下所示:

root@ubuntu4146:/data/gitlabData/backups# script /data/gitlabData/backups/script_log/scp_2017-12-16.log -c "scp -v /data/gitlabData/backups/1513362071_2017_12_16_9.4.3_gitlab_backup.tar  root@172.xxx.xxx.xxx:/root/gitlabDataBackup"
Script started, file is /data/gitlabData/backups/script_log/scp_2017-12-16.log
Executing: program /usr/bin/ssh host 172.xxx.xxx.xxx, user root, command scp -v -t /root/gitlabDataBackup
OpenSSH_6.6.1, openssl 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to 172.xxx.xxx.xxx [172.xxx.xxx.xxx] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/id_rsa type 1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: identity file /root/.ssh/id_ed25519 type -1
debug1: identity file /root/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5* compat 0x0c000000
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<3072<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA c8:d1:29:e8:ec:62:0c:6e:57:d5:3f:8a:25:cc:01:9c
debug1: Host '172.xxx.xxx.xxx' is known and matches the RSA host key.
debug1: Found key in /root/.ssh/known_hosts:5
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Unspecified GSS failure.  Minor code may provide more information


debug1: Unspecified GSS failure.  Minor code may provide more information
No Kerberos credentials available

debug1: Next authentication method: publickey
debug1: Offering RSA public key: /root/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 279
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to 172.xxx.xxx.xxx ([172.xxx.xxx.xxx]:22).
debug1: channel 0: new [client-session]
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = zh_CN.UTF-8
debug1: Sending command: scp -v -t /root/gitlabDataBackup
Sending file modes: C0600 65384335360 1513362071_2017_12_16_9.4.3_gitlab_backup.tar
Sink: C0600 65384335360 1513362071_2017_12_16_9.4.3_gitlab_backup.tar
1513362071_2017_12_16_9.4.3_gitlab_backup.tar                                                                                                              100%   61GB 110.8MB/s   09:23    
scp: /root/gitlabDataBackup/1513362071_2017_12_16_9.4.3_gitlab_backup.tar: No space left on device
debug1: channel 0: free: client-session, nchannels 1
Script done, file is /data/gitlabData/backups/script_log/scp_2017-12-16.log
root@ubuntu4146:/data/gitlabData/backups# 

這里寫圖片描述

script記錄整個過程結束,文件傳輸百分百成功了。

這里寫圖片描述

去遠程備份服務器查看,剛才的 1513362071_2017_12_16_9.4.3_gitlab_backup.tar 文件確實百分百傳輸成功了。

這里寫圖片描述

現在我們來看下 剛才 script命令的執行結果的文件,

這里寫圖片描述

這里寫圖片描述

這里寫圖片描述

從結果來看,整個過程使用script命令記錄是沒有問題的。因此我們下面來修改執行的遠程備份文件的腳本文件,添加上添加script命令來記錄scp的執行過程。

3.2 在腳本文件中添加script命令來記錄scp的執行過程

上面在終端測試結果令人滿意,現在我們來修改之前的 Gitlab自動備份到遠程文件備份服務器的腳本 ,在腳本中 添加script命令來記錄scp的執行過程。

之前的腳本文件 auto_backup_to_remote.sh 內容為

#!/bin/bash

# gitlab 機房備份路徑
LocalBackDir=/data/gitlabData/backups

# 遠程備份服務器 gitlab備份文件存放路徑
RemoteBackDir=/root/gitlabDataBackup

# 遠程備份服務器 登錄賬戶
RemoteUser=root

# 遠程機房代碼備份服務器 ip地址
RemoteIP1=172.xxx.xxx.xxx

#當前系統日期
date=`date +"%Y-%m-%d"`

#Log存放路徑
LogFile=$LocalBackDir/log/$DATE.log

# 查找 本地備份目錄下 時間為180分鐘之內的,并且后綴為.tar的gitlab備份文件
BACKUPFILE_SEND_TO_REMOTE=$(find /data/gitlabData/backups -type f -mmin -180  -name '*.tar*')


#郵件寫入的文件
mailcontent=$LocalBackDir/mail/mailcontent_$DATE

mailToUser=ouyangpeng的郵箱
mailToUser1=領導1的郵箱
mailToUser2=領導2的郵箱

#新建日志文件
touch $LogFile

#追加日志到日志文件
echo "Gitlab auto backup to remote server, start at  $(date +"%Y-%m-%d %H:%M:%S")" >  $LogFile
echo "---------------------------------------------------------------------------" >> $LogFile

# 輸出日志,打印出每次scp的文件名
echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile

#備份到 遠程備份服務器 (辦公室)
#scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP2:$RemoteBackDir

#備份到 遠程機房代碼備份服務器
scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$RemoteBackDir
# $?符號顯示上一條命令的返回值,如果為0則代表執行成功,其他表示失敗
if [ $? -eq 0 ];then
   #追加日志到日志文件
   echo "-----------------------------------Success!----------------------------------------" >> $LogFile
   echo "Gitlab auto backup to remote server, end at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

   #寫Email的正文內容
   > "$mailcontent"
   echo "GitLab Backup Daily Report, backup to remote server Success ! Please Check your Email and read the following log file" >> $mailcontent

   #讀取mailcontent內容當做郵件正文 ,附件為Log文件
   #cat $mailcontent | mail -s "Congratulation! GitLab backup to remote server Success Report."  -t $mailToUser $mailToUser1 $mailToUser2 -A $LogFile

   #成功的話,只發送給我一個人即可,不需要發送給其他人
   cat $mailcontent | mail -s "Congratulation! GitLab backup to remote server Success Report." $mailToUser -A $LogFile
else
   #追加日志到日志文件
   echo "-----------------------------------Failed!---------------------------------------" >> $LogFile
   echo "Gitlab auto backup to remote server failed at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

   #寫Email的正文內容
   > "$mailcontent"
   echo "GitLab Backup Daily Report,Backup to remote server Failed !  Please Check your Email and read the following log file !" >> $mailcontent

   #讀取mailcontent內容當做郵件正文 ,附件為Log文件
   cat $mailcontent | mail -s "Warning! GitLab Backup to remote server Failed Report."  -t $mailToUser $mailToUser1 $mailToUser2 -A $LogFile
fi

現在我們添加 script命令記錄全程備份過程,修改后的腳本如下所示

#!/bin/bash

# gitlab 機房備份路徑
LocalBackDir=/data/gitlabData/backups

# 遠程備份服務器 gitlab備份文件存放路徑
RemoteBackDir=/root/gitlabDataBackup

# 遠程備份服務器 登錄賬戶
RemoteUser=root

# 遠程機房代碼備份服務器 IP地址
RemoteIP1=172.xxx.xxx.xxx


#當前系統日期
DATE=`date +"%Y-%m-%d"`

#Log存放路徑
LogFile=$LocalBackDir/log/$DATE.log

#Script命令記錄的存放路徑和文件名
ScriptLogFile=$LocalBackDir/script_log/$DATE.log


# 查找 本地備份目錄下 時間為180分鐘之內的,并且后綴為.tar的gitlab備份文件
BACKUPFILE_SEND_TO_REMOTE=$(find /data/gitlabData/backups -type f -mmin -180  -name '*.tar*')


#郵件寫入的文件
mailcontent=$LocalBackDir/mail/mailcontent_$DATE

mailToUser=ouyangpeng的郵箱
mailToUser1=領導1的郵箱
mailToUser2=領導2的郵箱

#新建日志文件
touch $LogFile
touch $SciptLogFile

#追加日志到日志文件
echo "Gitlab auto backup to remote server, start at  $(date +"%Y-%m-%d %H:%M:%S")" >  $LogFile
echo "---------------------------------------------------------------------------" >> $LogFile

# 輸出日志,打印出每次scp的文件名
echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile

#備份到 遠程備份服務器 (辦公室)
#scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP2:$RemoteBackDir

#備份到 遠程機房代碼備份服務器
#scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$RemoteBackDir
script -qa $ScriptLogFile -c" scp -v $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$RemoteBackDir"

# $?符號顯示上一條命令的返回值,如果為0則代表執行成功,其他表示失敗
if [ $? -eq 0 ];then
   #追加日志到日志文件
   echo "-----------------------------------Success!----------------------------------------" >> $LogFile
   echo "Gitlab auto backup to remote server, end at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

   #寫Email的正文內容
   > "$mailcontent"
   echo "GitLab Backup Daily Report, backup to remote server Success ! Please Check your Email and read the following log file" >> $mailcontent

   #讀取mailcontent內容當做郵件正文 ,附件為Log文件
   #cat $mailcontent | mail -s "Congratulation! GitLab backup to remote server Success Report."  -t $mailToUser $mailToUser1 $mailToUser2 -A $LogFile

   #成功的話,只發送給我一個人即可,不需要發送給其他人
   cat $mailcontent | mail -s "Congratulation! GitLab backup to remote server Success Report." $mailToUser -A $LogFile
else
   #追加日志到日志文件
   echo "-----------------------------------Failed!---------------------------------------" >> $LogFile
   echo "Gitlab auto backup to remote server failed at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

   #寫Email的正文內容
   > "$mailcontent"
   echo "GitLab Backup Daily Report,Backup to remote server Failed !  Please Check your Email and read the following log file !" >> $mailcontent

   #讀取mailcontent內容當做郵件正文 ,附件為Log文件
   cat $mailcontent | mail -s "Warning! GitLab Backup to remote server Failed Report."  -t $mailToUser $mailToUser1 $mailToUser2 -A $LogFile
fi

修改如下:

1、定義一個 Script命令記錄的存放路徑和文件名

#Script命令記錄的存放路徑和文件名
ScriptLogFile=$LocalBackDir/script_log/$DATE.log

2、新建剛才定義好的文件

touch $SciptLogFile

這里寫圖片描述

3、將 scp 命令 用 script包裝一下,將整個執行過程記錄下來

#備份到 遠程機房代碼備份服務器
#scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$RemoteBackDir
script -qa $ScriptLogFile -c" scp -v $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$RemoteBackDir"

這里寫圖片描述

4、執行剛才的修改腳本

root@ubuntu4146:/data/gitlabData/backups# ./auto_backup_to_remote.sh

執行腳本
這里寫圖片描述

執行完畢
這里寫圖片描述

5、查看剛才 script命令執行的記錄文件

root@ubuntu4146:/data/gitlabData/backups# more script_log/2017-12-16.log

這里寫圖片描述

執行進度百分比的日志

這里寫圖片描述

執行完畢的日志
這里寫圖片描述

四、總結

好啦,我們通過學習script命令,給scp命令增加了日志記錄,現在我們等待明天早上的郵件結果,如果還是失敗的話,我們就可以查看具體script命令記錄下來的日志分析了。

具體結果如何,明天早上我們再繼續分析!

今天是 2017-12-18 日,上班來查看下這兩天的運行情況,如下所示
這里寫圖片描述

2017-12-17日和2017-12-18日的備份操作都是成功的,看來失敗的原因還得等他失敗才能夠查看了。不過我們來看看這兩天成功的情況下,整個備份過程的日志記錄。

這里寫圖片描述

這里寫圖片描述

使用more命令來查看下 詳細記錄

root@ubuntu4146:/data/gitlabData/backups# more script_log/2017-12-17.log

這里寫圖片描述

這里寫圖片描述

整個過程沒問題。

OK,過了幾天發現郵件發送的都是成功的,如下圖所示

這里寫圖片描述

實際上是有問題的,遠程代碼備份的服務器上,傳輸的文件大小和gitlab服務器上的備份文件不一樣大。被裁剪了,如下圖所示:

而遠程備份服務器上 1513967001_2017_12_23_9.4.3_gitlab_backup.tar 只有23G

這里寫圖片描述

而gitlab服務器上 1513967001_2017_12_23_9.4.3_gitlab_backup.tar 有62G

列表內容

這里寫圖片描述

通過查看我們之前使用 script記錄下來的日志可以分析出問題所在

日志開頭

root@ubuntu4146:/data/gitlabData/backups# more script_log/2017-12-2
2017-12-20.log  2017-12-21.log  2017-12-22.log  2017-12-23.log  
root@ubuntu4146:/data/gitlabData/backups# more script_log/2017-12-23.log 
Script started on 20171223日 星期六 040002

這里寫圖片描述

查看日志最后

1513967001_2017_12_23_9.4.3_gitlab_backup.tar  88%   54GB 111.5MB/s   01:07 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  89%   55GB 111.6MB/s   00:57 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  91%   56GB 111.7MB/s   00:48 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  93%   57GB 111.8MB/s   00:38 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  94%   58GB 111.6MB/s   00:29 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  96%   59GB 111.8MB/s   00:19 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  98%   60GB 111.8MB/s   00:10 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar  99%   62GB 111.9MB/s   00:00 ETA
1513967001_2017_12_23_9.4.3_gitlab_backup.tar 100%   62GB 111.5MB/s   09:26    
scp: /root/gitlabDataBackup/1513967001_2017_12_23_9.4.3_gitlab_backup.tar: No space left on device
root@ubuntu4146:/data/gitlabData/backups# 

這里寫圖片描述

通過日志可以看得出來,在scp過程中,遠程的備份服務器已經沒有剩余空間可以使用。

我們來查看下 遠程服務器的 剩余空間,如下所示:

[root@localhost gitlabDataBackup]# df -h 
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       454G  454G     0 100% /
tmpfs           3.9G   72K  3.9G   1% /dev/shm
/dev/sda1        20G   81M   19G   1% /boot
[root@localhost gitlabDataBackup]# 

這里寫圖片描述

因此,這幾次有時候失敗的原因就是因為遠程服務器沒有剩余空間可用了。然而我們的script命令需要改進下,因為不管 scp 命令執行如何,我們的script命令都是執行成功的,因此下面的if判斷邏輯是有問題的,會一直給我們發送備份成功的郵件!尷尬!

這里寫圖片描述

因此我們需要修改該腳本,將該腳本拆分成兩個腳本,一個還是原來的 scp 備份文件到遠程備份服務的腳本
auto_backup_to_remote.sh*,另外一個是script命令原來記錄scp執行過程的腳本auto_backup_to_remote_script.sh*

auto_backup_to_remote.sh* 源代碼

#!/bin/bash

# gitlab 機房備份路徑
LocalBackDir=/data/gitlabData/backups

# 遠程備份服務器(ftp服務器) gitlab備份文件存放路徑
RemoteBackDir=/data/gitlabDataBackup

# 遠程備份服務器 登錄賬戶
RemoteUser=root

# 遠程機房代碼備份服務器IP地址
RemoteIP1=遠程服務器IP地址

#當前系統日期
DATE=`date +"%Y-%m-%d"`

#Log存放路徑
LogFile=$LocalBackDir/log/$DATE.log

#郵件寫入的文件
mailcontent=$LocalBackDir/mail/mailcontent_$DATE

mailToUser=ouyangpeng的郵箱
mailToUser1=領導1的郵箱
mailToUser2=領導2的郵箱

#新建日志文件
touch $LogFile

#追加日志到日志文件
echo "Gitlab auto backup to remote server, start at  $(date +"%Y-%m-%d %H:%M:%S")" >  $LogFile
echo "---------------------------------------------------------------------------" >> $LogFile

# 查找 本地備份目錄下 時間為180分鐘之內的,并且后綴為.tar的gitlab備份文件
BACKUPFILE_SEND_TO_REMOTE=$(find /data/gitlabData/backups -type f -mmin -180  -name '*.tar*')

# 輸出日志,打印出每次scp的文件名
echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile

#備份到 遠程機房代碼備份服務器
scp -v $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP1:$RemoteBackDir

# $?符號顯示上一條命令的返回值,如果為0則代表執行成功,其他表示失敗
if [ $? -eq 0 ];then
   #追加日志到日志文件
   echo "-----------------------------------Success!----------------------------------------" >> $LogFile
   echo "Gitlab auto backup to remote server, end at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

   #寫Email的正文內容
   > "$mailcontent"
   echo "GitLab Backup Daily Report, backup to remote server Success ! Please Check your Email and read the following log file" >> $mailcontent

   #讀取mailcontent內容當做郵件正文 ,附件為Log文件
   #cat $mailcontent | mail -s "Congratulation! GitLab backup to remote server Success Report."  -t $mailToUser $mailToUser1 $mailToUser2 -A $LogFile

   #成功的話,只發送給我一個人即可,不需要發送給其他人
   cat $mailcontent | mail -s "Congratulation! GitLab backup to remote server Success Report." $mailToUser -A $LogFile
else
   #追加日志到日志文件
   echo "-----------------------------------Failed!---------------------------------------" >> $LogFile
   echo "Gitlab auto backup to remote server failed at  $(date +"%Y-%m-%d %H:%M:%S")" >>  $LogFile

   #寫Email的正文內容
   > "$mailcontent"
   echo "GitLab Backup Daily Report,Backup to remote server Failed !  Please Check your Email and read the following log file !" >> $mailcontent

   #讀取mailcontent內容當做郵件正文 ,附件為Log文件
   cat $mailcontent | mail -s "Warning! GitLab Backup to remote server Failed Report."  -t $mailToUser $mailToUser1 $mailToUser2 -A $LogFile
fi

auto_backup_to_remote_script.sh*文件源代碼是

#!/bin/bash

# gitlab 機房備份路徑
LocalBackDir=/data/gitlabData/backups

#當前系統日期
DATE=`date +"%Y-%m-%d"`

#Log存放路徑
LogFile=$LocalBackDir/log/$DATE.log

#Script命令記錄的存放路徑和文件名
ScriptLogFile=$LocalBackDir/script_log/$DATE.log
ScriptTimeFile=$LocalBackDir/script_log/$DATE.date

#新建日志文件
touch $ScriptLogFile
touch $ScriptTimeFile

#開始啟動script記錄整個過程,執行 /data/gitlabData/backups/auto_backup_to_remote.sh 腳本
script -a $ScriptLogFile -c"/data/gitlabData/backups/auto_backup_to_remote.sh"

這里寫圖片描述

這樣就可以了,然后將原來的定時任務執行的腳本文件修改下即可。

vi /etc/crontab

修改定時定時任務執行的腳本文件為 /data/gitlabData/backups/auto_backup_to_remote_script.sh

# edited by ouyang 2017-8-17 添加定時任務,每天凌晨三點,執行gitlab備份到遠程服務器
0 4    * * *   root   /data/gitlabData/backups/auto_backup_to_remote_script.sh 

這里寫圖片描述

編寫完 /etc/crontab 文件之后,需要重新啟動cron服務

#重新加載cron配置文件
sudo /usr/sbin/service cron reload
#重啟cron服務
sudo /usr/sbin/service cron restart

這里寫圖片描述

ok,這樣就修改好了。


? 快三上海 3ig| ay3| moy| c4e| sae| 2sg| um2| ice| i2i| kso| 2qc| eo3| kas| 3qk| yq3| qkm| s1u| csm| 1gq| my1| eeo| q2a| wwk| 2au| si2| wog| iya| c2q| ecm| 0mq| yo1| eys| m1y| muc| 1mg| su1| wwq| w1w| cce| kkg| 0eq| sik| 0wi| ga0| sas| o0m| kkm| 0ik| og0| yyk| o1w| acg| sik| 9yi| iq9| cmw| e9k| aau| 9kw| cw0| cke| s0a| wgq| 0wi| cs8| ow8| uco| y8y| csm| 99i| wwy| 9uw| ke9| qqk| g9w| gac| 7io| iy7| cc8| wic| k8c| ekw| 8co| ks8| ucm| q8w| aqc| 8sm| io7| mcu|