Ubuntu系統的常用命令:ssh保活、用戶管理、開機自啟、后台運行


內容轉載自我的博客

@

1. ubuntu桌面版安裝ssh

桌面版本的Ubuntu linux系統,默認沒有安裝ssh服務,可以通過如下命令開啟ssh服務:

# 安裝openssh,如果安裝完成,服務默認已經開啟,即可遠程ssh連接
sudo apt-get install openssh-server
# 查看ssh服務狀態
sudo service ssh status
# ssh服務重啟命令
sudo service ssh restart
# 編輯ssh服務的配置文件,可以修改服務端口,權限控制等
sudo vim /etc/ssh/sshd_config

ssh的配置文件sshd_config主要參數說明如下:

# 這個是ssh服務的監聽端口,在實際生產環境中一般都不用默認的22端口 
Port 22
# AddressFamily 設置為any:默認ipv4和ipv6地址均可連接
AddressFamily any
# ListenAddress 用來設置sshd服務器綁定的IP地址
# ListenAddress 192.168.0.231   表示只監聽來自192.168.0.231這個IP的SSH連接
# ListenAddress 0.0.0.0         表示監聽所有IPv4的SSH連接
# ListenAddress ::              表示監聽所有IPv6的SSH連接
# PermitRootLogin 設置root用戶是否運行登錄以及登錄方式
PermitRootLogin no
# LoginGraceTime 寬限登錄時間不輸入密碼兩分鍾自動退出
LoginGraceTime 2m
# AllowUsers 只允許特定的一些用戶登錄(root用戶是否可登錄要根據PermitRootLogin決定)
# AllowUsers myusername
# 優先級最高,禁止某些用戶登錄
# DenyUsers  name1
# 允許登陸的用戶組
# AllowGroups mygroupname
# 禁止登錄的用戶組
# DenyGroups groupname1
# 設置sshd是否在用戶登錄時顯示/etc/motd中的信息,可以在其中加入歡迎信息
PrintMotd no
# 是否在ssh登錄成功后,顯示上次登錄信息
PrintLastLog yes
# ssh的服務端會傳送KeepAlive的訊息給客戶端,以確保兩者的聯機正常
# 這種消息可以檢測到死連接、連接不當關閉、客戶端崩潰等異常
# 任何一端死掉后,ssh可以立刻知道,而不會有僵屍程序的發生
TCPKeepAlive yes

具體對於PermitRootLogin選項來說,它可以設置為以下幾個值(其中without-password也寫為prohibit-password),且對於含義如下表:

參數類別 是否允許ssh登陸 登錄方式 交互shell
yes 允許 沒有限制 沒有限制
without-password 允許 除密碼以外 沒有限制
forced-commands-only 允許 僅允許使用密鑰 僅允許已授權的命令
no 不允許 N/A N/A

2. SSH保活的幾種方法

2.1 配置服務器端

SSH總是被強行中斷,導致效率低下,可以在服務端配置,讓server每隔30秒向client發送一個keep-alive包來保持連接:sudo vim /etc/ssh/sshd_config
添加以下內容:

ClientAliveInterval 30
ClientAliveCountMax 60

然后重啟本地ssh:sudo service ssh restart
第一行配置讓server每隔30秒向client發送一個keep-alive包來保持連接;第二行配置表示如果連續發送keep-alive包數量達到60次,客戶端依然沒有反應,則服務端sshd斷開連接。如果什么都不操作,該配置可以讓連接保持30s*60,即30分鍾

2.2 配置客戶端

如果服務端沒有權限配置,或者無法配置,可以配置客戶端ssh,使客戶端發起的所有會話都保持連接:sudo vim /etc/ssh/ssh_config
添加以下內容:

ServerAliveInterval 30
ServerAliveCountMax 60

然后重啟本地ssh:sudo service ssh restart
本地ssh每隔30s向server端sshd發送keep-alive包,如果連續發送60次,server仍然無回應斷開連接

2.3 共享ssh連接

如果需要在多個窗口中打開同一個服務器連接,可以嘗試添加~/.ssh/config,添加以下兩行:

ControlMaster auto
ControlPath ~/.ssh/connection-%r@%h:%p

然后重啟本地ssh:sudo service ssh restart
配置之后,第二條連接共享第一次建立的連接,加快速度
如果希望每次SSH連接建立之后,此條連接會被保持4小時,退出服務器之后依然可以重用,則需要設置:
ControlPersist 4h
最終,一個示例~/.ssh/config文件配置如下:

Host *
	ServerAliveInterval 3
	ServerAliveCountMax 20
	TCPKeepAlive no
	ControlMaster auto
	ControlPath ~/.ssh/connection-%r@%h:%p
	ControlPersist 4h
    User zfb

2.4 ssh連接的同時保活

ssh -o ServerAliveInterval=60 user@sshserver

2.5 screen命令使用

經常需要SSH遠程登錄到Linux服務器,運行一些需要很長時間才能完成的任務,比如訓練數據集、ftp傳輸等等。通常情況下都要為每一個這樣的任務開一個遠程終端窗口,因為它們執行的時間太長了,必須等待它們執行完畢,在此期間不能關掉窗口或者斷開連接,否則這個任務就會被殺掉
使用screen命令可以好、實現會話恢復、會話共享、多窗口等功能
只要Screen本身沒有終止,在其內部運行的會話都可以恢復。這一點對於遠程登錄的用戶特別有用,即使網絡連接中斷,用戶也不會失去對已經打開的命令行會話的控制。只要再次登錄到主機上執行screen -r就可以恢復會話的運行
同樣在暫時離開的時候,也可以執行分離命令detach,在保證里面的程序正常運行的情況下切換到后台
還可以讓一個或多個用戶從不同終端多次登錄一個會話,並共享會話的所有特性(比如可以看到完全相同的輸出)。它同時提供了窗口訪問權限的機制,可以對窗口進行密碼保護
所有的會話都獨立的運行,並擁有各自的編號、輸入、輸出和窗口緩存。用戶可以通過快捷鍵在不同的窗口下切換,並可以自由的重定向各個窗口的輸入和輸出。它實現了基本的文本操作,如復制粘貼等;還提供了類似滾動條的功能,可以查看窗口狀況的歷史記錄。窗口還可以被分區和命名,還可以監視后台窗口的活動
具體使用如下:

# 啟動一個名字為test_scr的screen,此時會看到新建會話的動作
screen -S test_scr
# 在這個新窗口可以運行任何命令,即使此時命令行在不斷刷新輸出,也可以執行下一個動作
# 即:按下Ctr+A,再按D,這會把test_scr放入后台,回到之前的窗口
Ctrl+A D
# [detached from 45197.test_scr]
# 列出所有的screen
screen -ls
# There is a screen on:
#        45197.test_scr  (2020年07月17日 14時39分09秒)   (Detached)
# 1 Socket in /run/screen/S-zfb.
# 此時退出登錄也不會影響,只需要重新登陸以后,輸入以下命令
# 也可以是  screen -r 45197
screen -r test_scr
# 刪除某個screen,假設是test_scr;也可以切換到test_scr的screen,快捷鍵Ctrl+A K
screen -S test_scr -X quit
# 清除處於dead狀態的screen
screen -wipe
# 強制退出其他用戶正在使用的screen窗口(防止某用戶斷線且占用終端導致其他用戶無法使用)
screen -D -r test_scr

3. Ubuntu用戶管理

3.1 創建用戶

創建用戶,同時創建該用戶主目錄、創建用戶同名的組(用戶名為username
sudo adduser username
會提示設置密碼,其他提示回車即可
如果需要讓此用戶有root權限,在root用戶下修改/etc/sudoers文件:
root@ubuntu:~# sudo vim /etc/sudoers
修改文件如下:

# User privilege specification
root ALL=(ALL) ALL
username ALL=(ALL) ALL

保存退出,username用戶就擁有了root權限
或者sudo usermod -a -G sudo username

3.2 切換用戶

從當前用戶切換到username用戶的命令:su username
從普通用戶切換到root用戶還可以使用命令:sudo su
在切換用戶時,如果想在切換用戶之后使用新用戶的工作環境,可以在suusername之間加-,例如:su - root
終端的提示符$表示普通用戶;#表示超級用戶,即root用戶
在終端輸入exitlogout或使用快捷方式Ctrl+d,可以退回到原來用戶

3.3 修改用戶密碼

修改用戶名為username的開機登錄密碼:sudo passwd username
修改root密碼(默認root無密碼,第一次執行時創建密碼):sudo passwd root

3.4 禁用和啟用root登錄

只是禁用root,但是root密碼還保存着:
sudo passwd -l root
再使用su root切換root用戶發現認證失敗
啟用root登錄:
sudo passwd -u root

3.5 多用戶共享目錄

在root用戶下創建文件夾,再創建新的用戶組,將原有的用戶添加進入這個新組。不妨假設,新的用戶組為share_grp,新的共享文件夾目錄為/home/data_share/(也可以為/media/data_share),需要互相共享的用戶為user1、user2,每個用戶都可以通過cd /home/data_share/訪問到此文件夾的內容。具體操作步驟如下:

  • 首先切換當前賬戶為root賬戶,然后創建文件夾mkdir /home/data_share/
  • 然后創建新的用戶組share_grp,使用命令sudo groupadd share_grp
  • 為文件夾更改所屬的組sudo chgrp share_grp /home/data_share
  • 更改文件夾權限sudo chmod 770 /home/data_share
  • 保證子文件夾也是一樣的權限sudo chmod +s /home/data_share
  • 為用戶1添加附屬組,不影響用戶原來所在的組sudo usermod -a -G share_grp user1
  • 同理用戶2,使用命令sudo usermod -a -G share_grp user2

此時,兩個用戶都可以訪問目錄/home/data_share/,另外,查看用戶組相關的命令如下:

  • groups:查看當前用戶的組
  • cat /etc/group:查看本機所有用戶和組

如果不想繼續共享,可以通過在root賬戶下使用以下命令刪除用戶1、用戶2的附屬組(不影響原來所在的組)

sudo usermod -G "" user1
sudo usermod -G "" user1
sudo groupdel share_grp

3.6 文件系統設置所有者

  • chown命令用於設置文件(或文件夾)的所有者和文件關聯組,文件支持通配符,只有超級用戶才可以執行此命令。使用方法如下:
# -R表示遞歸執行,test是當前目錄下的一個文件夾,前一個zfb表示用戶名,后一個zfb表示用戶組
# 該命令會把test目錄及其子目錄下的所有文件的owner改為zfb,group也改為zfb
sudo chown -R zfb:zfb test
  • chgrp命令用於改變文件(或文件夾)的所屬組,普通用戶即可執行此命令,如:
# -R表示遞歸執行,test是當前目錄下的一個文件夾,mygrp1表示用戶組
# 該命令會把test目錄及其子目錄下的所有文件的group改為mygrp1
chgrp -R mygrp1 test
  • chmod命令用於改變文件(或文件夾)的權限,普通用戶即可執行此命令,如:
# -R表示遞歸執行,test是當前目錄下的一個文件夾
# 該命令會把test目錄及其子目錄下的所有文件的權限改為777,這是用數字來設定權限的方法
# 777三個數字分別對應:文件擁有者u的權限、與擁有者同組g的用戶的權限、其他用戶o的權限
# 7是十進制表示,原始二進制為111,分別對應:讀取r、寫入w、執行x;1表示允許,0表示禁止
chmod -R 777 test
# chmod命令也可以用字母設定權限
# u 表示文件所有者;g 表示文件所屬的組;o 表示其他用戶;a 表示系統的所有用戶
# r 表示可被讀取;w 表示可被寫入;x 表示可被執行
# + 表示增加某個(多個)權限;- 表示刪除某個(多個)權限;= 表示撤銷原來的所有權限,只設定某個(多個)權限
# 例如:為文件添加可執行權限,若不指明用戶的話默認為系統所有用戶
# 下面命令等價於 chmod a+x stop.sh
chmod +x stop.sh
# 例如:為文件屬主和同組用戶增加寫權限,為其他用戶刪除執行權限
chmod ug+x,o-x test.txt
# 例如:撤銷原來的文件權限,只為文件設置可讀寫權限
chmod u=rw name.txt

3.7 測試某個用戶是否可以訪問文件夾

使用如下命令:
sudo -u www-data stat /home/ubuntu/frp/log
如果具有權限則顯示類似輸出:

  File: /home/ubuntu/frp/log/
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fc01h/64513d    Inode: 529293      Links: 2
Access: (0777/drwxrwxrwx)  Uid: (  500/  ubuntu)   Gid: (  500/  ubuntu)
Access: 2020-09-28 15:56:40.902601841 +0800
Modify: 2020-09-28 16:32:40.728799201 +0800
Change: 2020-09-28 16:32:40.728799201 +0800
 Birth: -

否則顯示:

stat: cannot stat '/home/ubuntu/frp/log/': Permission denied

4. 查看當前活躍的用戶

查看所有用戶列表
cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" '{ print $1"|"$3"|"$4 }'|more
查看當前登錄的用戶
w
查看自己登錄的用戶名
whoami

5. 查看當前占據內存最多的進程信息

將命令組合重命名寫入.bashrc文件中方便使用:首先vi ~/.bashrc,然后將以下內容寫入文件末尾

alias maxmem="ps -aux|head -1;ps -aux | sort -k4nr | head "
# ps -aux會顯示all進程、userid、x指代所有程序
# ps -aux|head -1表示只保留刪除結果的第一行,也就是表頭
# sort -k4nr命令:r表示是結果倒序排列,n為以數字大小排序
# -k4則是針對第4列的內容進行排序
# maxmem -4表示顯示4條結果

6. ubuntu設置開機自啟程序

對於桌面版Ubuntu而言,只需要打開程序列表的圖標,選擇啟動應用程序、Startup applications圖標,根據提示輸入路徑即可

7. 修改ubuntu顯示管理器為lightdm

向日葵這款遠程控制軟件似乎不支持Ubuntu的原始gdm3的桌面,具體表現為:使用Windows遠程到服務器的Ubuntu系統上進行調試,總是出現連接已斷開;而反過來控制卻可以,所以安裝lightdm替換默認的桌面顯示管理器:

sudo apt-get update
sudo apt-get upgrade
# 安裝過程中會提示選擇默認顯示管理器,選擇lightdm即可
sudo apt install lightdm

然后重啟設備,此時再測試即可正常連接
如果需要卸載lightdm,重新使用gdm3,則只需輸入以下命令:

# 查看當前使用的顯示管理器
cat /etc/X11/default-display-manager
# 重新選擇gdm為顯示管理器,然后重啟
sudo dpkg-reconfigure gdm3
# 卸載lightdm
sudo apt-get --purge remove lightdm

8. nohup與&的使用

  • nohup的意思是忽略SIGHUP信號,一般用在正常命令語句之前。如果用戶關閉shell, 那么使用nohup啟動的進程還是存在的(因為關閉終端會發送SIGHUP信號,而nohup對SIGHUP信號免疫)。如果不將nohup命令的輸出重定向,輸出將附加到當前目錄的nohup.out文件中。如果當前目錄的nohup.out文件不可寫,輸出重定向到$HOME/nohup.out文件中

  • 輸出重定向:程序在后台運行的時候,可以把輸出重定向到某個文件中,相當於一個日志文件,記錄運行過程中的輸出。例如nohup command > out.txt 2>&1 &命令的意思是

    • command的輸出重定向到out.txt文件,即輸出內容不打印到屏幕上
    • 0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error)
    • 2>&1是將標准錯誤(2)重定向到標准輸出(&1),標准輸出(&1)再被重定向輸入到out.txt文件中
  • &的意思是在后台運行,一般用在正常命令語句之后。即使用戶使用Ctrl+C,那么使用&啟動的程序照樣運行(因為對SIGINT信號免疫)

所以可以使用如下命令來實現類似守護進程的功能:
nohup command > out.file 2>&1 &

9. 命令的掛起和前后台切換

Linux提供了fgbg命令,可以調度正在運行的任務。假如發現前台運行的一個程序需要很長的時間,但是需要干其他的事情,此時可以用Ctrl+Z掛起這個程序,然后可以看到系統提示:
[1]+ Stopped /root/bin/rsync.sh
然后可以把程序調度到后台執行,使前台可以執行其他任務。該命令的運行效果與在指令后面添加符號&的效果是相同的,都是將其放到系統后台執行(bg 后面的數字為作業號)

bg 1
# 終端回顯如下
# [1]+ /root/bin/rsync.sh &

jobs命令查看正在運行的任務(只看當前終端生效的,關閉終端重新打開則無法看到):

jobs
# 終端回顯如下
# [1]+ Running /root/bin/rsync.sh &

如果想把某個任務調回到前台運行,可以用

fg 1
# 終端回顯如下
# /root/bin/rsync.sh

這樣,在終端上就只能等待這個任務完成了

10. 遠程收發文件

在不安裝第三方工具的情況下有兩種方法:

  • 使用scp命令:例如scp -P 8899 -r root@45.67.89.12:/root/test/ ./Desktop/命令表示將服務器的/root/test/文件夾遞歸下載到本地的./Desktop/文件夾下面,8899是ssh的端口,默認為22
  • 使用rsync命令(支持斷點續傳):例如rsync -avzP --rsh='ssh -p 8899' root@45.67.89.12:/root/test/ ./Desktop命令表示將服務器的/root/test/文件夾下載到本地的./Desktop/文件夾下面,8899是ssh的端口,默認為22

使用腳本下載Google Drive文件,使用方法為
curl gdrive.sh | bash -s https://drive.google.com/file/d/0B4y35FiV1wh7QWpuVlFROXlBTHc/view

11. find命令

11.1 查找文件

find命令可以在指定目錄及其子目錄下查找指定擴展名的文件,如下所示是在當前目錄及子目錄下查找JPG文件,並把它們移動到當前目錄:
find . -name "*.JPG" -exec mv {} ./ \;
find .表示在當前目錄及其子目錄下查找
-name "*.JPG"表示只搜索擴展名為JPG的文件
-exec 后面接bash命令,表示對文件進行的操作
{}指代找到的每一個文件
\;bash命令的結尾需要添加;,這里需要轉義

11.2 查找目錄

find命令也可用於查找符合條件的目錄,只需要添加參數-type d來指定查找類型為目錄(directory)。如下所示是在當前目錄及其子目錄搜索所有以mat結尾的文件夾,並把a.py復制到所有找到的文件夾中(復制單個文件到多個文件夾)
find . -type d -name "*_mat" -exec cp a.py {} \;
過程如下所示:

 ~/test > tree
.
├── a.py
└── mat_dir
    ├── 18_mat
    ├── 1_mat
    ├── 2_mat
    ├── 45_mat
    └── 9_mat

6 directories, 1 file
 ~/test > find . -type d -name "*_mat" -exec cp a.py {} \;
 ~/test > tree
.
├── a.py
└── mat_dir
    ├── 18_mat
    │   └── a.py
    ├── 1_mat
    │   └── a.py
    ├── 2_mat
    │   └── a.py
    ├── 45_mat
    │   └── a.py
    └── 9_mat
        └── a.py

6 directories, 6 files

12. swap分區操作

12.1 增加分區大小

系統默認已經有了swap分區,但是運行某些程序很耗內存,想臨時添加swap分區大小:

# 創建交換分區的文件:增加64G=65536M大小的交換分區,則命令寫法如下
# 其中的bs等於想要的塊大小,of是交換文件的名稱和位置
# 以下命令如果提示權限不足,加上sudo
dd if=/dev/zero of=/home/swap bs=1M count=65536
# 設置交換分區文件,建立swap的文件系統
mkswap /home/swap
# 如果提示 swapon: /home/swap: insecure permissions 0644, 0600 suggested.
chmod -R 0600 /home/swap
# 立即啟用交換分區文件,swapon -p 2 /home/swap可以設置該swap的優先級
swapon /home/swap
# 如果還需要使系統開機時自動啟用,在文件/etc/fstab中添加一行:
# /home/swap swap swap defaults 0 0

此時可以查看分區大小是否添加成功(系統原始的交換空間是swap分區,大小為64G):

zfb@myServer:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:         128804       77303         590          78       50910       50386
Swap:        126570         387      126183
zfb@myServer:~$ cat /proc/swaps
Filename         Type         Size       Used       Priority
/dev/sda2        partition    62499836   397288     -2
/home/swap       file         67108860   0          -3
zfb@myServer:~$ 

這里的cat /proc/swaps命令等價於swapon -s,在使用多個swap分區或者文件的時候,還有一個優先級的概念,值越大優先級越高(-1的優先級最高,-1表示在安裝系統時創建的)。設置swap分區時未指定優先級,則將優先級分配為-1,后添加的swap則依次為-2,-3;而用戶指定優先級時必須以正數表示,也就是說用戶指定的優先級必然高於系統優先級
內核在使用swap空間的時候總是先使用優先級高的空間,后使用優先級低的;如果把多個swap空間的優先級設置成一樣的,那么兩個swap空間將會以輪詢方式並行進行使用;如果兩個swap放在兩個不同的硬盤上,相同的優先級可以起到類似RAID0的效果

12.2 刪除自己添加的swap文件

按照以下操作:

# 關閉指定swap,swapoff -a表示關閉所有
swapoff /home/swap
# 如果增加分區有設置開機自動掛載,就需要刪除或者注釋文件/etc/fstab中的對應行
# 正常刪除文件即可
rm /home/swap

12.3 設置swap的使用情況

按照如下方法設置即可:

# 查看系統默認的 swappiness 值
# swappiness=0   表示最大限度使用物理內存
# swappiness=100 表示積極的使用swap分區
cat /proc/sys/vm/swappiness
# 修改swappiness值為10,臨時性的修改,重啟系統后會恢復默認值
sudo sysctl vm.swappiness=10
# 永久修改swappiness,打開文件/etc/sysctl.conf
# 在文件最后添加一行  vm.swappiness = 10
sudo vi /etc/sysctl.conf
# 使修改立即生效
sudo sysctl -p

13. 查看歷史登錄記錄

13.1 使用last命令

使用命令last即可列出所有相關信息

zfb@myServer:~$ last
zfb      pts/2        127.0.0.1        Sat Sep  5 12:29   still  logged in
zfb      pts/1        :pts/0:S.0       Sat Sep  5 09:23   still  logged in
zfb      pts/1        :pts/0:S.0       Thu Sep  3 22:38 - 22:38  (00:00)
zfb      pts/1        127.0.0.1        Wed Jul  8 17:20 - 17:21  (00:00)
user1    pts/0        127.0.0.1        Wed Jul  8 17:07 - 17:21  (00:13)
user2    pts/0        127.0.0.1        Wed Jul  8 15:49 - 15:49  (00:00)
zfb      pts/0        127.0.0.1        Wed Jul  8 15:42 - 15:45  (00:03)
reboot   system boot  4.15.0-108-gener Wed Jul  8 15:40 - 12:00  (10+20:20)
zfb      pts/2        127.0.0.1        Wed Jul  8 15:19 - 15:20  (00:00)
user2    :0           :0               Wed Jul  8 15:00 - down   (00:38)
reboot   system boot  4.15.0-108-gener Wed Jul  8 22:09 - 14:48  (-7:21)
reboot   system boot  4.15.0-108-gener Wed Jul  8 21:28 - 21:29  (00:00)

wtmp begins Wed Jul  8 21:28:47 2019

13.2 使用awk命令

13.2.1 awk命令詳解

假定test.txt文件內容如下:

Aug 28 19:38:01 localhost CRON[12375]: pam_unix(cron:session): session closed for user root
Aug 28 19:39:01 localhost CRON[12511]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 28 19:39:01 localhost CRON[12511]: pam_unix(cron:session): session closed for user root
Aug 28 19:39:13 localhost sshd[12493]: Invalid user admin from 25.67.84.30 port 1345
Aug 28 19:39:14 localhost sshd[12493]: pam_unix(sshd:auth): check pass; user unknown
Aug 28 19:39:16 localhost sshd[12493]: Failed password for invalid user admin from 25.67.84.30 port 1345 ssh2
Aug 28 19:39:32 localhost sshd[12493]: Disconnecting invalid user admin 25.67.84.30 port 1345: Change of username not allowed
Aug 28 19:39:44 localhost sshd[12596]: pam_unix(sshd:auth): check pass; user unknown
Aug 28 19:40:27 localhost sshd[12679]: Failed password for root from 34.56.78.90 port 6666 ssh2
Aug 28 19:40:31 localhost sshd[12679]: Failed password for root from 78.90.12.34 port 8888 ssh2
Aug 28 19:40:53 localhost sshd[12741]: Invalid user admin from 12.34.56.78 port 3810
Aug 28 19:40:56 localhost sshd[12741]: Failed password for invalid user admin from 12.34.56.78 port 3810 ssh2
Aug 28 19:40:58 localhost sshd[12741]: Disconnecting invalid user admin 12.34.56.78 port 3810
Aug 28 19:41:01 localhost CRON[1316]: pam_unix(cron:session): session opened for user root by (uid=0)
Aug 28 19:41:01 localhost CRON[2316]: pam_unix(cron:session): session closed for user root
Aug 28 19:41:10 localhost sshd[3328]: Invalid user user from 12.34.56.78 port 9999
Aug 28 19:41:11 localhost sshd[4328]: pam_unix(sshd:auth): check pass; user unknown
Aug 28 22:34:58 localhost sshd[18689]: Failed password for root from 199.200.201.202 port 33667 ssh2
Aug 28 22:56:22 localhost sshd[18560]: Failed password for invalid user pi from 18.19.20.21 port 22222 ssh2
Aug 28 22:56:23 localhost sshd[18561]: Failed password for invalid user pi from 78.56.34.21 port 41568 ssh2
Aug 28 22:06:48 localhost sshd[18943]: Failed password for invalid user ubnt from 66.88.99.44 port 33444 ssh2
Aug 28 22:06:48 localhost sshd[18944]: Failed password for root from 193.116.1.108 port 54360 ssh2
Aug 28 22:06:48 localhost sshd[18945]: Failed password for root from 193.116.1.108 port 54362 ssh2
Aug 28 22:06:49 localhost sshd[18942]: Failed password for root from 193.116.1.108 port 54358 ssh2
Aug 28 22:11:46 localhost sshd[18589]: Failed password for root from 18.19.12.20 port 6688 ssh2
Aug 28 22:24:08 localhost sshd[18213]: Failed password for root from 185.2.99.114 port 9988 ssh2

如下所示是一個常用的awk命令的語法

awk '{print $1, $4}' test.txt

需要注意的是,awk后面的語句{print $1, $4}必須用單引號括起來(這表明是行匹配模式,即對文件中匹配到的每一行執行操作print $1, $4),而且awk默認以空格對每一行進行分割並執行對應語句
awk的語句完整流程BEGIN{print "這是匹配前執行的,一般是表頭"}{print NR,$1,$2}END{printf("統計完畢")}BEGINEND語句可以省略
awk的條件語句{if($1>3) print $1;else if($2==6) print $4;else print "hh"}
OFS ORS OFMT等可以在BEGIN模塊設置,例如awk 'BEGIN{FS=",";OFMT="%.3f"} {print $1,$2}' test.txt

  • print語句內部支持+-*/等基礎運算
  • printf("%d--%d\n", $1,$2)命令與C語言的使用方法類似
  • 如果要使用逗號進行行分割則awk -F, '{print $1, $4}' test.txt
  • $0表示整行數據,$1表示每行的第一部分(按照規則對行分割后的集合),稱為第一個字段,以此類推;另外,匹配到的第一行稱為第一條記錄
  • NR表示當前行的數字(即這在test.txt中是第幾行),NF表示當前行的長度,FNR表示當前行的數字(即這在匹配記錄中是第幾行),FILENAME表示當前文件的名稱,FS表示分隔符(把一行數據分割成$1到最后)
  • 創建變量a並設置a的值,則使用awk -va=1 '{print $2,$2+a}' test.txt
  • OFS設置所有輸出字段分隔符,如果要使得在print時候$i之間的默認空格改為其他分割則使用awk -va=1 '{print $2,$2+a}' OFS=", " test.txt
  • 設置某兩個字段之間的連接符,使用代碼awk '{print NR, $1"-"$2, $11}' test.txt,則字段1和2輸出時使用-連接
  • ORS設置所有輸出記錄分隔符,如果要使得在print時候不同行之間的默認空格改為其他分割則使用awk -va=1 '{print $2,$2+a}' ORS="\n\n " test.txt
  • OFMT設置所有小數的顯示格式,默認為%.6g,若顯示3位小數則awk '{print NR, $11, $13":"$15, 1/2}' OFMT="%.3f"

例如執行命令grep "Failed password for invalid user" test.txt | awk 'BEGIN{printf("%-10s %-10s %-20s\n", "number", "user", "IP:Port")}{printf "%-10s %-10s %-20s\n", FNR, $11, $13":"$15}END{printf("搜索結束,共找到%d條記錄", FNR)}'
則輸出如下內容,使用":"指定$13$15字段的連接,如果用,則使用默認字段連接符(空格):

number     user       IP:Port
1          admin      25.67.84.30:1345
2          admin      12.34.56.78:3810
3          pi         18.19.20.21:22222
4          pi         78.56.34.21:41568
5          ubnt       66.88.99.44:33444
搜索結束,共找到5條記錄

13.2.2 awk過濾並輸出記錄

查看系統的登陸失敗的用戶及IP信息(只輸出ssh連接時的用戶名不存在的情況):
sudo grep "Failed password for invalid user" /var/log/auth.log | awk 'BEGIN{printf("%-10s %-10s %-20s\n", "number", "user", "IP:Port")}{printf "%-10s %-10s %-20s\n", FNR, $11, $13":"$15}END{printf("搜索結束,共找到%d條記錄", FNR)}'
輸出示例:

number     user       IP:Port
1          admin      25.67.84.30:1345
2          admin      12.34.56.78:3810
3          pi         18.19.20.21:22222
4          pi         78.56.34.21:41568
5          ubnt       66.88.99.44:33444
搜索結束,共找到5條記錄

查看所有登陸失敗的信息

# 首先從log文件提取出所有包含Failed password for字符串的行作為awk的輸入
# 然后輸出一行表頭,並開始執行行匹配
# match函數的第二個參數是正則表達式(用//包圍起來),如果未找到,返回0
# 有如下三種情況,前兩個分別對應awk里面的if命令,第三種情況被過濾了
# Aug 28 22:11:46 localhost sshd[18589]: Failed password for root from 18.19.12.20 port 6688 ssh2
# Aug 28 22:56:22 localhost sshd[18560]: Failed password for invalid user pi from 18.19.20.21 port 22222 ssh2
# Sep 16 17:29:04 localhost sudo:   ubuntu : TTY=pts/0 ; PWD=/home/ubuntu ; USER=root ; COMMAND=/bin/grep : Failed password for /var/log/auth.log
# 因為在執行awk的同時會在auth.log生成一條記錄如下,所以需要if(length($13)>4)這個判斷
# Sep 16 17:10:31 localhost sudo:   ubuntu : TTY=pts/0 ; PWD=/home/ubuntu ; USER=root ; COMMAND=/bin/grep Failed password for /var/log/auth.log
sudo grep "Failed password for" /var/log/auth.log | awk 'BEGIN{printf("%-10s %-10s %-20s\n", "number", "user", "IP:Port")}{if(match($11, /\./)!=0) printf "%-10s %-10s %-20s\n", FNR, $9, $11":"$13;else if(length($13)>4) printf "%-10s %-10s %-20s\n", FNR, $11, $13":"$15}END{printf("搜索結束,共找到%d條記錄\n", FNR)}'

輸出示例:

number     user       IP:Port
1          admin      25.67.84.30:1345
2          root       34.56.78.90:6666
3          root       78.90.12.34:8888
4          admin      12.34.56.78:3810
5          root       199.200.201.202:33667
6          pi         18.19.20.21:22222
7          pi         78.56.34.21:41568
8          ubnt       66.88.99.44:33444
9          root       193.116.1.108:54360
10         root       193.116.1.108:54362
11         root       193.116.1.108:54358
12         root       18.19.12.20:6688
13         root       185.2.99.114:9988
搜索結束,共找到13條記錄

注意:此命令也可以寫成腳本形式

# 創建awk腳本文件並寫入內容
vim sshinfo.awk
# 授予執行權限
chmod +x sshinfo.awk
# 執行命令,對於CentOS系統為/var/log/secure文件
sudo grep "Failed password for" /var/log/auth.log | ./sshinfo.awk

sshinfo.awk的文件內容如下:

#! /usr/bin/awk -f
BEGIN{
    printf("%-10s %-10s %-20s\n", "number", "user", "IP:Port")
}
{
    if(match($11, /\./)!=0)
        printf "%-10s %-10s %-20s\n", FNR, $9, $11":"$13;
    else if(length($13)>4)
        printf "%-10s %-10s %-20s\n", FNR, $11, $13":"$15
}
END{
    printf("搜索結束,共找到%d條記錄\n", FNR)
}

查看系統的登陸成功的用戶及IP信息
sudo grep "Accepted password for" /var/log/auth.log | awk 'BEGIN{printf("%-10s %-10s %-20s\n", "number", "user", "IP:Port")}{printf "%-10s %-10s %-20s\n", FNR, $11, $13":"$15}END{printf("搜索結束,共找到%d條記錄", FNR)}'
輸出示例:

number     user       IP:Port
1          zfb        11.11.11.11:8888
2          zfb        11.11.11.11:8888
3          zfb        11.11.11.11:8888
4          root       11.11.11.11:8888
搜索結束,共找到4條記錄

查看系統登陸失敗的次數及對應的IP
sudo grep "Failed password for" /var/log/auth.log | awk '{if(match($11, /\./)!=0) print $11}' | sort | uniq -c | sort -nr | more

14. 使用FTP下載文件

FTP(文件傳輸協議)是一個較老且最常用的標准網絡協議,用於在兩台計算機之間通過網絡上傳/下載文件。它通過用戶憑證(用戶名和密碼)傳輸數據,沒有進行加密。它是一個8位的客戶端-服務器協議,能操作任何類型的文件而不需要進一步處理,就像MIME或Unicode一樣。但是,FTP有着極高的延時,這意味着,從開始請求到第一次接收需求數據之間的時間,會非常長;並且不時的必須執行一些冗長的登錄進程
一般運行在20和21兩個端口。端口20用於在客戶端和服務器之間傳輸數據流,而端口21用於傳輸控制流,並且是命令通向ftp服務器的進口。當數據通過數據流傳輸時,控制流處於空閑狀態。而當控制流空閑很長時間后,客戶端的防火牆會將其會話置為超時
FTP URL的格式在RFC 1738指定,格式為:ftp://[user[:password]@]host[:port]/url-path
首先確保系統已經安裝ftp命令:
sudo apt-get install ftp
ftp命令的使用方法為,在終端輸入以下命令(域名或IP地址或完整FTP網址都可以):
ftp ftp.ngdc.noaa.gov
一般公開的FTP資源下載站點的用戶名都是anonymous,密碼是空,登錄成功后即可打開交互終端

[zfb@myServer ~]# ftp ftp.ngdc.noaa.gov
Connected to ftp.ngdc.noaa.gov (140.172.190.215).
220-                     ----- Notice -----
220-
220- Questions/Problems should be directed to ngdc.webmaster@noaa.gov
220
Name (ftp.ngdc.noaa.gov:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (140,172,190,215,188,178).
150 Here comes the directory listing.
-rw-rw-r--    1 ftp      ftp          1516 Feb 04  2016 INDEX.txt
-rw-rw-r--    1 ftp      ftp          3766 Feb 09  2018 README.txt
-rw-rw-r--    1 ftp      ftp          9036 Feb 04  2016 ftp.html
drwxrwsr-x   11 ftp      ftp            11 Dec 19  2017 geomag
-rw-r--r--    1 ftp      ftp            53 Jul 27  2010 google12c4c939d7b90761.html
lrwxrwxrwx    1 ftp      ftp             8 Aug 01  2011 index.html -> ftp.html
226 Directory send OK.
ftp> cd geomag
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (140,172,190,215,74,181).
150 Here comes the directory listing.
drwxrwxr-x   10 ftp      ftp            12 Jul 08  2016 Access_Tools
drwxrwxr-x    4 ftp      ftp             9 Jul 14  2008 Aeromag
226 Directory send OK.

在該交互窗口使用命令lcd /home/zfb/hh/表示設置下載遠程FTP服務器的文件默認保存在本機的/home/zfb/hh/目錄
在該交互窗口使用命令mget *表示下載當前目錄下的所有文件,忽略所有子文件夾
在該交互窗口使用命令prompt off表示關閉下載提示
批量遍歷下載FTP站點指定目錄下的所有數據
wget -r -nH -P/home/zfb/hh/ ftp://ftp.ngdc.noaa.gov/ionosonde/mids11/GR13L/individual/2019/* --ftp-user=anonymous --ftp-password=

15. 切割日志文件

可以分為以下兩種:

16. 設置靜態IP

有以下兩種方法:
1.方法一:系統安裝有GUI。打開設置-->網絡,查看哪一個是當前正在使用的網絡連接,點擊該條右側的設置(齒輪圖標),彈出對話框。詳細信息頁面會顯示當前的ip(例如:192.168.10.55)、網關路由地址(例如:192.168.10.254)、所有的DNS地址(例如:114.114.114.114,8.8.8.8),需要記錄下來,方便后期修改。然后點擊IPv4選項

  • IPv4方式:手動
  • 地址:共有三格。第一格填寫自己需要設置的靜態ip地址,例如寫為192.168.10.56(也可設置為與之前DHCP方式分配的IP一致,即192.168.10.55);第二格填寫子網掩碼,一般是255.255.255.0(可以通過方法二的步驟核實);第三格填寫網關地址192.168.10.254
  • DNS:填寫之前看到的即可,如114.114.114.114,8.8.8.8
  • 然后點擊右上角應用,如果彈出輸入密碼則按要求輸入即可。最后,關閉再打開網絡即可應用成功

2.方法二:在終端窗口修改。Ubuntu 17.10 網絡管理引入了一個新的工具,用來配置ip地址,本教程只適合此版本及更新版本(舊版本如ubuntu 16.04不支持)。具體步驟如下:

  • 查看並記錄相關信息(也可使用方法一來查看):
# 安裝網絡工具庫
sudo apt-get install net-tools
# (1)查看當前正在使用的網卡信息
ifconfig -a
# 該命令會返回所有網卡信息,可通過查看每一條信息是否包含inet條目
# 且inet后面跟着的地址不是127.0.0.1
# 排除法即可找到當前使用的網卡,最前面是網卡名稱,例如
# enp0s37f2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
#         inet 192.168.10.55  netmask 255.255.255.0  broadcast 192.168.10.255
#         inet6 fe80::cdea:a610:64f0:bed2  prefixlen 64  scopeid 0x20<link>
#         ether e3:aa:5e:6e:53:01  txqueuelen 1000  (以太網)
#         RX packets 44518  bytes 7552410 (7.5 MB)
#         RX errors 0  dropped 0  overruns 0  frame 0
#         TX packets 40667  bytes 51864207 (51.8 MB)
#         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
#         device interrupt 16  memory 0xef300000-ef320000 
# 記錄: 網卡名稱為enp0s37f2  當前ip地址為192.168.10.55  子網掩碼為255.255.255.0
# (2)查看網關路由地址
route -n
# 該命令輸出的第一條(目標為0.0.0.0)的網關即為所需的地址,記錄網關為192.168.10.254
# 內核 IP 路由表
# 目標            網關            子網掩碼        標志  躍點   引用  使用 接口
# 0.0.0.0         192.168.10.254  0.0.0.0         UG    20100  0        0 enp0s37f2
# 169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 enp0s37f2
# 172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
# 192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 enp0s37f2
# 也可使用traceroute命令來查找網關
traceroute www.baidu.com
# 只看該命令的前兩條輸出即可,記錄網關地址為192.168.10.254
# traceroute to www.baidu.com (14.215.177.38), 30 hops max, 60 byte packets
#  1  _gateway (192.168.10.254)  0.392 ms  0.379 ms  0.372 ms
#  2  * * *
# (3)查看DNS記錄
systemd-resolve --status
# 從該命令輸出中找到自己用的網卡
# Link 2 (enp0s37f2)
#       Current Scopes: DNS
#        LLMNR setting: yes
# MulticastDNS setting: no
#       DNSSEC setting: no
#     DNSSEC supported: no
#          DNS Servers: 114.114.114.114
#                       8.8.8.8
#           DNS Domain: ~.
# 記錄DNS 114.114.114.114, 8.8.8.8
  • 創建配置文件:sudo vim /etc/netplan/01-network-manager-all.yaml
    文件內容如下:
network:
  ethernets:
    # set network card name
    enp0s37f2:
      dhcp4: no
      dhcp6: no
      # set your static ip
      # default network mask length is 24
      # 255.255.255.0 --> 24
      addresses: [192.168.10.56/24]
      # set ipv4 gateway address
      gateway4: 192.168.10.254
      nameservers:
        # set dns servers
        addresses: [114.114.114.114,8.8.8.8]
  version: 2
  • 應用修改
# 生成配置文件
sudo netplan --debug generate
# 測試配置文件
sudo netplan try
# 應用修改
sudo netplan apply
# 重啟網絡服務
sudo systemctl restart network-manager

17. 創建隨機文件

在Linux系統中有/dev/random/dev/urandom可以產生隨機數,前者是更加貼近數學意義的隨機數,后者是比較適合生成文件的隨機數,用法如下:

# 執行命令:創建65536*1024Bytes(64MB)的文件
dd if=/dev/urandom of=test.txt count=65536 bs=1024
# 命令輸出
# 65536+0 records in
# 65536+0 records out
# 67108864 bytes (67 MB, 64 MiB) copied, 10.4984 s, 6.4 MB/s

還可以創建全是0的文件:

# 執行命令:創建65536*1024Bytes(64MB)的文件
dd if=/dev/zero of=test-0.txt count=65536 bs=1024
# 命令輸出
# 65536+0 records in
# 65536+0 records out
# 67108864 bytes (67 MB, 64 MiB) copied, 9.42672 s, 7.1 MB/s

另外,可以嘗試使用zip或rar算法單獨壓縮這兩個文件,會發現后者可以被壓縮到1MB以下,而前者基本不會減小體積(信息熵的體現)

18. 重定向輸出與2>&1介紹

在linux終端下,可以在shell命令的后面,使用符號>>>來進行標准輸出的重定向(不包括執行出錯的信息,即標准錯誤)

  • > a.txt表示將終端要顯示的信息全部寫入文件(若文件已存在,則覆蓋)
  • >> a.txt表示將終端要顯示的信息全部寫入文件(若文件已存在,則追加)

例如:

zfb@myServer:~$ echo "hello, world"
hello, world
zfb@myServer:~$ echo "hello, world" > a.txt
zfb@myServer:~$ cat a.txt
hello, world
zfb@myServer:~$ echo "this is second command" > a.txt
zfb@myServer:~$ cat a.txt
this is second command
zfb@myServer:~$ echo "The 3rd command" >> a.txt
zfb@myServer:~$ cat a.txt
this is second command
The 3rd command
zfb@myServer:~$ 

關於2>&1的解釋,每個程序或命令在運行后,都會至少打開三個文件描述符以存放命令的各種輸入輸出信息:

  • 標准輸入:對應文件/dev/stdin,也可以使用文件描述符0表示
  • 標准輸出:對應文件/dev/stdout,也可以使用文件描述符1表示
  • 標准錯誤:對應文件/dev/stderr,也可以使用文件描述符2表示

於是,很容易理解:
2>&1表示將文件描述符2(標准錯誤)的內容重定向到文件描述符1(標准輸出)
當沒有&時,1會被認為是一個普通的文件,&表示重定向的目標不是一個文件,而是一個文件描述符
通過命令./test.sh 2>&1 >a.txt即可實現腳本執行過程的標准輸出和標准錯誤都寫入文件a.txt
參考如下信息

zfb@myServer:~$ ls -al /dev/std*
lrwxrwxrwx 1 root root 15 Dec 23 13:36 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Dec 23 13:36 /dev/stdin  -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Dec 23 13:36 /dev/stdout -> /proc/self/fd/1
zfb@myServer:~$ 

19. 記錄終端信息

使用script命令開啟記錄script -t 2>time.file -a -f command.log

  • -t表示輸出時間信息到標准錯誤(文件描述符2
  • 2>time.file表示將標准錯誤信息輸出到文件(time.file是自己設置的文件名稱)
  • -a表示追加模式
  • -f表示每次寫入后都刷新緩存
  • -q表示安靜運行模式(不會提示Script started以及Script done
  • command.log是自己設置的用來保存輸入命令和終端回顯信息的文件名稱

最簡單的用法為script,該命令會自動將輸入命令和終端回顯信息寫入當前目錄的typescript文件
其次還可以使用script command.log,該命令會自動將輸入命令和終端回顯信息寫入當前目錄的command.log文件

退出記錄:在終端使用命令exit或者快捷鍵Ctrl + D
使用示例:

zfb@myServer:~$ script -t 2>time.file -a -f command.log
Script started, file is command.log
zfb@myServer:~$ echo "hello, world"
hello, world
zfb@myServer:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
2020-12-23 20:48:46
zfb@myServer:~$ echo "Bye"
Bye
zfb@myServer:~$ ls -al
total 20
drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
zfb@myServer:~$ exit
Script done, file is command.log
zfb@myServer:~$

查看保存的命令和終端回顯cat command.log
該命令得到輸出如下

zfb@myServer:~$ cat command.log
Script started on 2020-12-23 20:48:25+08:00 [TERM="xterm-256color" TTY="/dev/pts/0" COLUMNS="75" LINES="30"]
zfb@myServer:~$ echo "hello, world"
hello, world
zfb@myServer:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
2020-12-23 20:48:46
zfb@myServer:~$ echo "Bye"
Bye
zfb@myServer:~$ ls -al
total 20
drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
zfb@myServer:~$ exit

Script done on 2020-12-23 20:49:04+08:00 [COMMAND_EXIT_CODE="0"]
zfb@myServer:~$

注意:

  • 在上面顯示的內容中,只有命令cat command.log是手動輸入的,其他都是自動顯示
  • 根據上面顯示的時間2020-12-23 20:48:46,可以看出並不是重新執行了一遍,而是重新顯示了一遍

另外,還可以使用命令scriptreplay來重新播放命令與回顯(只是把當時記錄的信息,播放一遍,不是重新執行)
命令為:scriptreplay -d 1 -m 2 -t time.file -s command.log

  • -d表示倍速播放:-d 2表示播放速度是原始輸入單條命令的速度的兩倍;-d 0.1表示播放單條命令的速度減慢10倍
  • -m表示命令之間的最大延遲時間(單位是秒):-m 2表示command.log中存放的兩條命令之間的間隔時間如果大於兩秒,則按兩秒執行播放
  • -t表示后面指定存放時間信息的文件
  • -s表示后面指定存放輸入和回顯信息的文件

示例如下:

zfb@myServer:~$ scriptreplay -d 1 -m 2 -t time.file -s command.log
zfb@myServer:~$ echo "hello, world"
hello, world
zfb@myServer:~$ echo $(date "+%Y-%m-%d %H:%M:%S")
2020-12-23 20:48:46
zfb@myServer:~$ echo "Bye"
Bye
zfb@myServer:~$ ls -al
total 20
drwxr-xr-x  2 zfb zfb 4096 Dec 23 20:48 .
drwxr-xr-x 37 zfb zfb 4096 Dec 23 20:49 ..
-rw-r--r--  1 zfb zfb    0 Dec 23 19:03 a.txt
-rw-r--r--  1 zfb zfb   12 Dec 23 19:04 b.txt
-rw-r--r--  1 zfb zfb 2744 Dec 23 20:49 command.log
-rw-r--r--  1 zfb zfb  790 Dec 23 20:49 time.file
zfb@myServer:~$ exit

zfb@myServer:~$

注意:

  • 在上面顯示的內容中,只有命令scriptreplay -d 1 -m 2 -t time.file -s command.log是手動輸入的,其他都是自動顯示
  • 根據上面顯示的時間2020-12-23 20:48:46,可以看出並不是重新執行了一遍,而是重新播放了一遍
  • cat command.log的不同之處在於,顯示效果與手動輸入一致,適合作為教程演示
  • 可以把time.filecommand.log文件移動到任意一台支持scriptreplay命令的機器上,都可以重現命令輸入與終端回顯

20. 記錄服務器用戶會話操作

使用root用戶登錄服務器,創建文件夾:

sudo mkdir -p /var/log/script-records/
sudo chmod 733 /var/log/script-records/

然后編輯文件/etc/profilesudo vim /etc/profile
在文件末尾追加以下內容:

if [ $UID -ge 0 ]
then
    exec /usr/bin/script -t 2>/var/log/script-records/$USER-$UID-`date +%Y%m%d`.time -a -f -q /var/log/script-records/$USER-$UID-`date +%Y%m%d`.log
fi

然后執行命令source /etc/profile即可
注意:

  • 733權限表示:對於某登錄用戶user1,可保證該用戶記錄日志到/var/log/script-records/目錄內,又無法刪除日志文件
  • 這里$UID -ge 0記錄id>=0的用戶,其中包括root用戶
  • 如果只是想記錄普通用戶,則這里改成$UID -ge 500,因為linux創建普通用戶id從500開始


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM