內容轉載自我的博客
@
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
在切換用戶時,如果想在切換用戶之后使用新用戶的工作環境,可以在su
和username
之間加-
,例如:su - root
終端的提示符$
表示普通用戶;#
表示超級用戶,即root
用戶
在終端輸入exit
或logout
或使用快捷方式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提供了fg
和bg
命令,可以調度正在運行的任務。假如發現前台運行的一個程序需要很長的時間,但是需要干其他的事情,此時可以用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("統計完畢")}
,BEGIN
和END
語句可以省略
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.file
和command.log
文件移動到任意一台支持scriptreplay
命令的機器上,都可以重現命令輸入與終端回顯
20. 記錄服務器用戶會話操作
使用root用戶登錄服務器,創建文件夾:
sudo mkdir -p /var/log/script-records/
sudo chmod 733 /var/log/script-records/
然后編輯文件/etc/profile
: sudo 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開始