2021年8月13日 星期五

10 個提升 NAS 安全性的小撇步

 網路威脅前仆後繼地出現,尤其隨著家庭與辦公室中聯網的裝置越來越多,也讓網路犯罪分子更加容易透過安全弱點入侵使用者的網路。事實上,部署一套全方位的資料保護方案並非一蹴可幾,有賴使用者持續調整並精進裝置的配置方式。因此,我們整理了 10 個常見的安全性清單,幫助使用者更好的保護您的 Synology NAS,確保裝置與資料皆安全無虞。

*敬請注意:下述多數設置需由具有管理權限的使用者帳號登入修改。

 

一:停用預設的 admin 帳號

過於常見的管理員帳號會增加 Synology NAS 被不肖駭客組織暴力破解帳號密碼的風險。因此,使用者帳號應該避免設定像是「admin」、「administrator」、「root」等名稱。

我們建議使用者停用系統預設的 admin 帳號,並且設定一組強密碼來保護帳號。如果使用者目前使用「admin」名稱登入。可至控制台(Control Panel ) > 使用者(User)中止使用,並建立新的使用者帳號。了解更多

*root 無法作為使用者帳號名稱
*如果設定新的使用者帳號名稱,預設的 admin 即會被停用

二:提升密碼強度

設定強密碼可以確保你的系統免於未經授權的登入行為。設定密碼時,建議考慮同時包含大小寫字母、數字以及特殊符號的複雜組合。

為你的多組帳號設定相同的密碼,同樣也是一個風險極高的行為,因為駭客如果掌握了其中一個帳號密碼,他們也可以輕易的控制其他帳號,這尤其常見於使用者在註冊一個新的網站或是服務時。我們建議使用者可以透過 Have I Been Pwned 或 Firefox Monitor 這兩個網站來檢測自己的資訊是否曾經外洩。

如果使用者很難記住複雜的密碼,或者不記得哪一組密碼對應到哪一個註冊帳號,那麼也可以選擇使用密碼管理員服務(例如 1Password、LastPass 或是 Bitwarden)。使用者僅需要記憶一組主要的密碼,密碼管理員服務就會協助你自動建立並登錄其他帳號的登入憑證。

如果使用者想要設定 Synology NAS 裡的密碼憑證,可以至控制台(Control Panel ) > 使用者(User)> 進階(Advanced)裡自定義密碼的設定規則,調整設定密碼的強度,當新的使用者要註冊一組新帳號時都必須遵守這個規則。

* LDAP 和 Directory Server 服務中也提供類似的選項。了解更多

三:更新至系統最新版本並開啟通知

Synology 會定期釋出 DSM 軟體更新,除了功能與效能上的改善,也同步精進產品的安全性。每當一個新的安全性弱點揭露時, Synology 產品安全事件應變小組 PSIRT (Product Security Incident Response) 會進行即時的資安事件處理,包括 8 小時的弱點調查、 15 小時的弱點修復,在 24 小時內解決弱點並釋出安全性更新,確保產品安全且可靠。因此我們建議使用者在系統內設定自動更新,自動安裝最新的 DSM 最新版本。了解更多

此外,我們也建議使用者在 Synology NAS 上開啟通知,在發生特定事件或者錯誤時透過電子郵件、SMS,在行動裝置或者 Web 瀏覽器上接收通知。如果使用 Synology DDNS 服務,也可以在未連接到外部網路的狀態下選擇接收到通知。當儲存空間不足、備份與還原任務失敗時,立即採取相對應的措施,是確保資料長久安全性的重要一環。我們也建議使用者建立自己的 Synology Account,隨時接收最新的安全與功能性更新資訊。了解更多

*自動更新僅支援 DSM 的次要更新,主要更新需要手動安裝。

四:啟用二階段驗證

我們建議使用者啟用二階段驗證,為你的 Synology 裝置建立更進階的保護措施。在 DSM 帳戶與 Synology Account 上執行二階段驗證前,你將需要一個行動裝置,以及一個支援一次性密碼(TOTP)協議的身分驗證 App。

每一次的登錄活動都會需要身分驗證以及一組透過 Microsoft Authenticator、Authy 或其他身份驗證 App 所發送,有時間限制的 6 位數密碼,以避免任何未經授權的登入行為。

在 Synology Account 中,如果你遺失載有身份驗證 App 的手機*,你可以利用當初設定二階段驗證時的備份密碼來登入。使用者可以下載這個密碼或是將其列印出來,確保自己持有並隨時可以獲取這組密碼。

在 DSM 中,如果使用者遺失憑證,萬不得已的情況下可以選擇重置二階段驗證,在管理員名單裡的使用者可以執行這項操作。而萬一所有的管理員帳戶都無法登入,就必須重新設定裝置上的憑證與網路配置。按住 NAS 上的重置鍵約 4 秒(即會聽到嗶聲),然後重新啟動 Synology Assistant 重新設定裝置。**

*一些身份驗證 App 支援基於第三方帳戶的備份和還原方法。以此評估您的安全要求,以及便利性與災難復原選項。
** SHA、VMM,自動掛載的加密共享文件夾以及多重安全設置,使用者帳戶和網路連接埠設置將被重置。了解更多

五:啟動安全諮詢中心(Security Advisor)

安全諮詢中心(Security Advisor)是 DSM 預設的安全性應用程式,可以掃描 Synology NAS 的整體設定,進行登入分析跟帳號密碼分析與惡意行為偵測,並提供建議以確保裝置的安全性。例如,安全諮詢中心可以檢測到是否開啟 SSH 服務,是否發生任何異常的登入活動,以及是否更動過 DSM 系統檔案等。了解更多


六:設定基本的 DSM 安全性功能

使用者可以前往 DSM 控制台(Control Panel )> 安全性(Security)選項中設置數種安全性相關設定。舉例來說,你可以設定:

IP 自動封鎖
在控制台(Control Panel) > 安全性(Security) > 自動封鎖(Auto Block)可進行自動封鎖的設定,封鎖嘗試登入失敗多次的用戶端 IP 位址。

管理員可以將特定的 IP 位置加入到黑名單,以避免可能的風險或暴力攻擊。使用者可以依據環境以及使用者類型,來配置嘗試登入的次數。需提醒的是,大多數的家庭和企業只有一個外部 IP 位址提供使用者使用,IP 位址通常是動態的,且會在幾天或幾週後改變。了解更多

帳號保護
雖然自動封鎖功能可以將嘗試登入失敗多次的用戶端 IP 位址加進黑名單,帳號保護可讓帳號不被未信任的用戶端登入。使用者可以在控制台(Control Panel )> 安全性(Security)> 帳號保護(Account Protection)進行設定,透過啟用帳號保護功能,讓帳號免於被未信任且嘗試登入失敗過多次的用戶端登入,降低帳號遭到暴力破解攻擊的風險。了解更多

啟用 HTTPS
啟用 HTTPS ,可以加密與保護 Synology NAS 與連接用戶端之間的網路流量,防止竊聽(Eavesdropping)與中間人攻擊(man-in-the-middle attacks)。
使用者可以在控制台(Control Panel )>網路(Network)> DSM 設定(DSM Setting)進行設定。選取將 HTTP 自動重新導向 HTTPS 的複選框,你就會透過 HTTPS 連線至 DSM ,並發現位址欄的 URL 從 「http://」轉成「https://」。了解更多

進階:客製化的防火牆設定
防火牆可以擔綱虛擬屏障,依據設定的規則來阻隔來自外部的網路流量。使用者可以在控制台(Control Panel )>安全性(Security)> 防火牆(Firewall)進行設定,防止未經授權的登入活動與控管可訪問的服務。你可以決定允許或拒絕特定的 IP 位址訪問特定的網路接口,例如允許從特定的辦公室來進行遠端存取,或者僅允許訪問特定服務與位址等。了解更多

七:啟用 HTTPS – Let’s Encrypt 功能

數位憑證在啟用 HTTPS 功能時扮演關鍵角色,但對非商用使用者來說,通常服務的價格昂貴且難以維護。為了讓任何使用者能進一步落實資安防護,DSM 內建支援 Let’s Encrypt,任何使用者都可以按需建立憑證,藉此輕鬆保護網路連線。

如果使用者已經有註冊的域名或正在使用 DDNS 服務,可至控制台(Control Panel ) > 安全性(Security)> 憑證(Certificate)。選取增加新憑證 > 從 Let’s Encrypt 獲取憑證,對於大多數的使用者,可以選取「設置為預設設定」,並輸入域名以獲得憑證。獲得認證後,確保所有網路流量都如第三點一樣皆通過 HTTPS。

若使用者已將設備設置為透過多個網域或子網域提供服務,則需要在控制台(Control Panel )  >安全性(Security) >憑證(Certificate) >配置(Configure)中配置每個服務所使用的憑證。Youtube 範例影片

八:調整預設網路連接埠

儘管將 DSM 預設的連接埠號碼 HTTP(5000)與 HTTPS(5001)調整成自定義的埠號並無法防止針對性的攻擊,但可以預防常見針對預設服務的攻擊。

要調整預設的設定,可以至控制台(Control Panel) > 網路(Network)> DSM 設定(DSM Setting)裡自定義埠號。如果使用者經常進行 SSH 存取,那也建議更改預設的 SSH(22)端口。使用者也可以部署反向代理,降低對於特定網路服務的潛在攻擊,進一步提高安全性。反向代理通常用作內部伺服器與遠端用戶端的通訊中介,可以隱藏伺服器的特定資訊,例如實際的 IP 位址等。了解更多


九:除非必要不然停用 SSH/telnet 服務

由於透過 root 登入為預設開啟, SSH/telnet 又僅支援以管理員帳號登入,因此駭客可能會強行透過密碼對系統進行未經授權的登入,如果使用者需要持續提供外部服務,我們建議使用者更改預設的 SSH 埠號(22)以及設定一組強密碼。使用者也可以考慮利用 VPNs 並將 SSH 限制為僅有本地 IP 或可信賴的 IP 能夠存取,並且記得在不需要存取時將 SSH/telnet 服務關閉。了解更多

十:加密共用資料夾

DSM 支援 AES-256 位元的軍事等級加密技術,防止物理的數據提取威脅,管理員可以為新建立的或是現有的共用資料夾進行加密。要加密現有的共用文件夾,可以至控制台(Control Panel) > 共用資料夾(Shared Folder)中編輯文件夾,在「加密」選項中設置加密密碼,DSM 將開始對文件夾進行加密。由於如果沒有使用金鑰就無法恢復加密的數據,建議使用者妥善保存加密共用資料夾的金鑰。了解更多

更重要的是

資料安全性是資料完整性的先決條件,未經授權的存取可能會導致資料受到竄改或遺失,進而使關鍵資料喪失作用。而資料的完整性又可分為資料一致性與資料準確性,使用者可以採取兩種措施強化保護:定期執行 Data Scrubbing 以確保資料一致性並降低資料遺失的風險;定期執行 S.M.A.R.T. 檢測來監控硬碟的健康狀態,以盡早發現硬碟相關問題。

資料來源:https://blog.synology.com/cht/10_security_tips_to_keep_your_data_safe






https://cybernews.com/resources/nas-security-guide/


最常見的 NAS 安全問題

1. 密碼安全

可以通過使用數字工具相對容易地猜測或暴力破解弱密碼。這就是您必須做的第一件事是更改默認密碼的原因。由於 NAS 服務器直接連接到您的網絡(以及整個互聯網),因此它們本身就可能暴露於可能的密碼黑客攻擊中。

2. 來自其他網絡設備的洩漏

NAS 服務器可以直接或間接連接到大量其他設備。通常,這包括同一網絡上的計算機。


3. 惡意軟件和病毒

2017年,出現了一個名為SecureCrypt的代理,它利用SambaCry NAS漏洞來控制服務器。加密受害驅動器上的數據後,SecureCrypt 會要求比特幣“徵稅”以解鎖內容,否則驅動器將無法使用。


4. 命令注入

黑客報告了相對簡單的命令注入技術來控制 LG NAS 服務器,而 Buffalo、Western Digital 和 ZyXEL 等公司的驅動器都受到審查。幾乎沒有發現任何 NAS 設備能夠完全抵禦命令注入攻擊。

https://securityaffairs.co/wordpress/71499/hacking/lg-network-attached-storage-devices-hack.html

NAS安全指南

1. 實施強密碼安全

NAS 和其他企業攻擊常常是由於使用目標網絡的人的安全性薄弱而助長的。因此,請務必評估員工的意識水平,並定期審核他們的安全技能以確保標准保持在高水平。設置密碼規則也是一個好主意——這樣沒有人能夠創建短而弱的密碼。

您還應該使用雙因素身份驗證 (2FA) 保護所有帳戶。最常見的方法之一是在手機上使用身份驗證器應用程序。這樣,即使有人竊取了您的密碼,只要您不通過輸入 PIN 碼或使用 Touch ID 驗證訪問權限,該帳戶就會保持安全。

2. 確保定期更新 NAS 固件

網絡攻擊者一直在尋找破解 NAS 固件的方法,他們最終往往會成功。幾個月後,幾乎沒有任何 NAS 操作系統可以被認為是完全安全的,因此需要打補丁和大修。

3. 切勿使用默認管理員帳戶

您需要盡可能地破解任何給定 NAS 驅動器的登錄過程,並且選擇像“admin”這樣容易猜測的身份總是一個糟糕的選擇。


4. 保護您的連接和端口

您應該啟用 HTTPS 而不是 HTTP 來保護傳入和傳出的流量。您還應該確保 FTP 連接也是安全的。

您應該關閉與外部通信不需要的所有端口。另一個好主意是更改默認端口 - 這將減少對 NAS 的攻擊次數。我們建議至少更改 HTTP、HTTPS 和 SSH 端口。

5. 使用你的 NAS 防火牆

大多數 NAS 系統都帶有防火牆,沒有理由關閉它們。防火牆的工作原理是註冊合法用戶並拒絕其他任何人訪問。這使它們成為抵禦可能的攻擊者的第一道防線。

6. 啟用 DoS 保護

啟用拒絕服務 (DoS) 攻擊保護是 NAS 中的另一個重要設置。大多數情況下默認情況下不會啟用它,但這是有充分理由的。您可能會得到誤報,即您的 NAS 可能認為良性流量實際上是 DoS 攻擊。最好的方法是將已知流量來源列入白名單並保持保護


7. 使用 NAS 時使用 VPN

一個VPN可以是一個必不可少的NAS的安全工具。一流的 VPN 為在您的網絡和 Web 之間傳遞的所有在線流量添加了一層加密。這意味著潛在的攻擊者無法攔截和嗅探密碼詳細信息或合法用戶的 IP 地址。



https://www.hkcert.org/blog/security-risks-of-network-attached-storages-nas


HKCERT 建議用戶:


如果不是絕對必要,請不要將 NAS 設備連接到 Internet

如有必要,請在訪問前使用虛擬專用網絡 (VPN)

更改 Web 管理界面的默認協議和端口

更改默認管理員密碼或創建新的管理員帳戶

如果沒有必要,請不要安裝或啟用其他功能

定期備份文件

不斷更新系統並註意其設備的安全警報




https://www.edn.com/exposing-a-nas-security-issue/

暴露 NAS 安全問題




https://www.cloudwards.net/nas-security-guide/


NAS 安全指南 2021:如何保護您的網絡附加存儲


基本安全原則

1. 禁用管理員帳戶,始終更改默認密碼,先刪除默認帳戶並使用安全密碼創建一個新帳戶。

2. 不要點擊電子郵件或其他地方的可疑鏈接,尤其是當它們重定向到您的本地網絡時(例如 http://192.168.xx)

3. 為您的路由器和 NAS 登錄使用隨機的字母數字密碼

4. 定期更新路由器或 NAS 上的固件。如果支持,請打開自動更新

5. 啟用 SSL

6. 僅啟用您需要的功能,如果您在路由器上打開一個端口以從 Internet 訪問您的 NAS,請確保您使用的是強用戶名和密碼。

7. 考慮啟用 NAS 提供的任何過濾或自動阻止功能,以消除暴力登錄嘗試。

8. 通過 VPN 連接到 NAS 是確保 NAS 安全的最佳方式之一。

9. 啟用兩步驗證意味著嘗試訪問您帳戶的攻擊者需要您的密碼和您的手機,從而大大降低了被入侵的可能性。

10. 



保護您的路由器

第 1 步。登錄到您的路由器並更改默認密碼。如果您可以選擇從“admin”更改用戶名,也請這樣做。

第 2 步。如果您的路由器具有此功能,請禁用 WPS。永遠不要使用 WPS,因為它非常不安全。

第 3 步。如果可用,請啟用 HTTPS 登錄(這因設備而異,因此我們無法給出確切說明)。這會在訪問路由器的配置頁面時加密您的連接。禁用傳統 HTTP 並儘可能僅使用 HTTPS。

第 4 步。除非您確切地知道自己在做什麼,否則請確保禁用遠程訪問。遠程訪問讓您可以從任何地方登錄並打開您的設備以進行攻擊。

第 5 步。為您的無線網絡啟用 WPA2 加密並選擇一個長的隨機密碼。選擇一個即使是 NSA 也無法破解的密碼。

第 6 步。更新路由器的固件。如果您的路由器支持,請啟用自動更新。

第 7 步。啟用日誌記錄,以便在發生某些事情時,您有記錄來跟踪問題。



https://hk.xfastest.com/56738/qnap-nas-tutorial-how-to-enhance-the-security-of-your-nas/

第1頁 : 使用強密碼

第2頁 : 啟用自動封鎖功能

用家需要啟用自動封鎖功能,在密碼錯誤達一定的次數後,就把 IP Address 直接封鎖一段時間,甚至是永久封鎖,即可避免駭客攻擊。


第3頁 : 避免使用預設的連接埠

即使你已經不是使用預設連接埠,但仍然有很多不知名 IP Address 嘗試登入,即代表你的 NAS 已成為駭客目標,請再次修改連接埠


第4頁 : 停用不必要的服務

服務愈多,潛在的漏洞就愈多。


第5頁 : 只對外開放有需要使用的服務

只對外開放有需要在外網使用的服務可以減低風險。用家甚至可以只開放 VPN Server 的連接埠,把所有服務改為在 VPN 環境下執行,雖然略為不便,但總比直接暴露在互聯網上安全多了


第6頁 : 使用 SSL 加密連線

配合正確的 SSL Cert 使用 HTTPS 連線會辨識為「安全連線」,資料在傳輸的過程會被加密


第7頁 : 啟用系統連線記錄

透過連線記錄可以清楚得知有什麼檔案曾經被存取,也能得知使用者在什麼時候從什麼 IP Address 登入


第8頁 : 啟用 NAS 通知功能

NAS 的通知功能讓用家清楚知道 NAS 的狀態,提早發現被攻擊再加以處理,能有效降低風險


第9頁 : 保持系統及套件在最新的版本

不少被駭客攻破的 NAS 都不是使用最新版本的系統及套件。舊版本的系統及套件通常都存在不少已知的安全性漏洞,不少駭客會利用已知的嚴重安全性漏洞進行攻擊,並有可能在免密碼的情況下直接攻破


第10頁 : 安裝安全性檢查套件

Linux中 sed 和 awk的用法詳解

 sed用法:

sed是一個很好的檔案處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將資料行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法

sed命令列格式為:      


sed [-nefri] ‘command' 輸入文字    

常用選項:

        -n∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。但如果加上 -n 引數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。

        -e∶直接在指令列模式上進行 sed 的動作編輯;

        -f∶直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作;

        -r∶sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)

        -i∶直接修改讀取的檔案內容,而不是由螢幕輸出。      

常用命令:

        a   ∶新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
        c   ∶取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
        d   ∶刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
         i   ∶插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
         p  ∶列印,亦即將某個選擇的資料印出。通常 p 會與引數 sed -n 一起運作~
         s  ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

舉例:(假設我們有一檔名為ab)

     刪除某行


[root@localhost ruby] # sed '1d' ab       #刪除第一行 
[root@localhost ruby] # sed '$d' ab       #刪除最後一行
[root@localhost ruby] # sed '1,2d' ab      #刪除第一行到第二行
[root@localhost ruby] # sed '2,$d' ab      #刪除第二行到最後一行

  顯示某行


[root@localhost ruby] # sed -n '1p' ab      #顯示第一行 
[root@localhost ruby] # sed -n '$p' ab      #顯示最後一行
[root@localhost ruby] # sed -n '1,2p' ab    #顯示第一行到第二行
[root@localhost ruby] # sed -n '2,$p' ab    #顯示第二行到最後一行

  使用模式進行查詢


[root@localhost ruby] # sed -n '/ruby/p' ab  #查詢包括關鍵字ruby所在所有行
[root@localhost ruby] # sed -n '/\$/p' ab    #查詢包括關鍵字$所在所有行,使用反斜線\遮蔽特殊含義

  增加一行或多行字串


[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1a drink tea' ab #第一行後增加字串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog. 
end
[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行後增加字串"drink tea"
Hello!
drink tea
ruby is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost ruby] # sed '1a drink tea\nor coffee' ab  #第一行後增加多行,使用換行符\n
Hello!
drink tea
or coffee
ruby is me,welcome to my blog.
end

  代替一行或多行


[root@localhost ruby] # sed '1c Hi' ab        #第一行代替為Hi
Hi
ruby is me,welcome to my blog.
end
[root@localhost ruby] # sed '1,2c Hi' ab       #第一行到第二行代替為Hi
Hi
end

  替換一行中的某部分

  格式:sed ‘s/要替換的字串/新的字串/g’   (要替換的字串可以用正規表示式)


[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'  #替換ruby為bird
  [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'    #刪除ruby

     插入


[root@localhost ruby] # sed -i '$a bye' ab     #在檔案ab中最後一行直接輸入"bye"
[root@localhost ruby]# cat ab
Hello!
ruby is me,welcome to my blog.
end
bye

     刪除匹配行

      sed -i ‘/匹配字串/d’  filename  (注:若匹配字串是變數,則需要“”,而不是‘’。記得好像是)

      替換匹配行中的某個字串

      sed -i ‘/匹配字串/s/替換源字串/替換目標字串/g’ filename

Linux awk的用法 

簡介 

awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。

使用方法


awk '{pattern   action}' {filenames}

儘管操作可能會很複雜,但語法總是這樣,其中 pattern 表示 AWK 在資料中查詢的內容,而 action 是在找到匹配內容時所執行的一系列命令。花括號({})不需要在程式中始終出現,但它們用於根據特定的模式對一系列指令進行分組。 pattern就是要表示的正規表示式,用斜槓括起來。

awk語言的最基本功能是在檔案或者字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。完整的awk指令碼通常用來格式化文字檔案中的資訊。

通常,awk是以檔案的一行為處理單位的。awk每接收檔案的一行,然後執行相應的命令,來處理文字。

呼叫awk

有三種方式呼叫awk

1.命令列方式


awk [-F field-separator] 'commands' input-file(s)

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的檔案。

在awk中,檔案的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,預設的域分隔符是空格。

2.shell指令碼方式

將所有的awk命令插入一個檔案,並使awk程式可執行,然後awk命令直譯器作為指令碼的首行,一遍通過鍵入指令碼名稱來呼叫。

相當於shell指令碼首行的:#!/bin/sh

可以換成:#!/bin/awk

3.將所有的awk命令插入一個單獨檔案,然後呼叫:


awk -f awk-script-file input-file(s)

其中,-f選項載入awk-script-file中的awk指令碼,input-file(s)跟上面的是一樣的。

 本章重點介紹命令列方式。

入門例項

假設last -n 5的輸出如下


[root@www ~]# last -n 5 <==僅取出前五行
root   pts/1  192.168.1.100 Tue Feb 10 11:21  still logged in
root   pts/1  192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root   pts/1  192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai  pts/1  192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
root   tty1          Fri Sep 5 14:09 - 14:10 (00:01)

如果只是顯示最近登入的5個帳號


#last -n 5 | awk '{print $1}'
root
root
root
dmtsai
root

awk工作流程是這樣的:讀入有’\n’換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域。預設域分隔符是”空白鍵” 或 “[tab]鍵”,所以$1表示登入使用者,$3表示登入使用者ip,以此類推。

如果只是顯示/etc/passwd的賬戶


#cat /etc/passwd |awk -F ':' '{print $1}' 
root
daemon
bin
sys

這種是awk action的示例,每行都會執行action{print $1}。

-F指定域分隔符為’:’。

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以tab鍵分割


#cat /etc/passwd |awk -F ':' '{print $1"\t"$7}'
root  /bin/bash
daemon /bin/sh
bin   /bin/sh
sys   /bin/sh 

如果只是顯示/etc/passwd的賬戶和賬戶對應的shell,而賬戶與shell之間以逗號分割,而且在所有行新增列名name,shell,在最後一行新增”blue,/bin/nosh”。


cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
name,shell
root,/bin/bash
daemon,/bin/sh
bin,/bin/sh
sys,/bin/sh
....
blue,/bin/nosh

awk工作流程是這樣的:先執行BEGING,然後讀取檔案,讀入有/n換行符分割的一條記錄,然後將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動作action。接著開始讀入第二條記錄······直到所有的記錄都讀完,最後執行END操作。

搜尋/etc/passwd有root關鍵字的所有行


#awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

這種是pattern的使用示例,匹配了pattern(這裡是root)的行才會執行action(沒有指定action,預設輸出每行的內容)。

搜尋支援正則,例如找root開頭的: awk -F: '/^root/' /etc/passwd

搜尋/etc/passwd有root關鍵字的所有行,並顯示對應的shell


# awk -F: '/root/{print $7}' /etc/passwd       
/bin/bash

這裡指定了action{print $7}

awk內建變數

awk有許多內建變數用來設定環境資訊,這些變數可以被改變,下面給出了最常用的一些變數。

ARGC               命令列引數個數
ARGV               命令列引數排列
ENVIRON            支援佇列中系統環境變數的使用
FILENAME           awk瀏覽的檔名
FNR                瀏覽檔案的記錄數
FS                 設定輸入域分隔符,等價於命令列 -F選項
NF                 瀏覽記錄的域的個數
NR                 已讀的記錄數
OFS                輸出域分隔符
ORS                輸出記錄分隔符
RS                 控制記錄分隔符

 此外,$0變數是指整條記錄。$1表示當前行的第一個域,$2表示當前行的第二個域,……以此類推。

統計/etc/passwd:檔名,每行的行號,每行的列數,對應的完整行內容:


#awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh 

使用printf替代print,可以讓程式碼更加簡潔,易讀


awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd 

print和printf

awk中同時提供了print和printf兩種列印輸出的函式。

其中print函式的引數可以是變數、數值或者字串。字串必須用雙引號引用,引數用逗號分隔。如果沒有逗號,引數就串聯在一起而無法區分。這裡,逗號的作用與輸出檔案的分隔符的作用是一樣的,只是後者是空格而已。

printf函式,其用法和C語言中printf基本相似,可以格式化字串,輸出複雜時,printf更加好用,程式碼更易懂。

 awk程式設計

 變數和賦值

除了awk的內建變數,awk還可以自定義變數。

下面統計/etc/passwd的賬戶人數


awk '{count  ;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
user count is 40

count是自定義變數。之前的action{}裡都是隻有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。

這裡沒有初始化count,雖然預設是0,但是妥當的做法還是初始化為0:


awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count 1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is 0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is 40 

統計某個資料夾下的檔案佔用的位元組數


ls -l |awk 'BEGIN {size=0;} {size=size $5;} END{print "[end]size is ", size}'
[end]size is 8657198

如果以M為單位顯示:


ls -l |awk 'BEGIN {size=0;} {size=size $5;} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is 8.25889 M

注意,統計不包括資料夾的子目錄。

條件語句

 awk中的條件語句是從c語言中借鑑來的,見如下宣告方式:


if (expression) {
statement;
statement;
... ...
}
if (expression) {
statement;
} else {
statement2;
}
if (expression) {
statement1;
} else if (expression1) {
statement2;
} else {
statement3;
}

統計某個資料夾下的檔案佔用的位元組數,過濾4096大小的檔案(一般都是資料夾):


ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size $5;}} END{print "[end]size is ", size/1024/1024,"M"}' 
[end]size is 8.22339 M 

迴圈語句

awk中的迴圈語句同樣借鑑於C語言,支援while、do/while、for、break、continue,這些關鍵字的語義和C語言中的語義完全相同。

陣列

  因為awk中陣列的下標可以是數字和字母,陣列的下標通常被稱為關鍵字(key)。值和關鍵字都儲存在內部的一張針對key/value應用hash的表格裡。由於hash不是順序儲存,因此在顯示陣列內容時會發現,它們並不是按照你預料的順序顯示出來的。陣列和變數一樣,都是在使用時自動建立的,awk也同樣會自動判斷其儲存的是數字還是字串。一般而言,awk中的陣列用來從記錄中收集資訊,可以用於計算總和、統計單詞以及跟蹤模板被匹配的次數等等。

顯示/etc/passwd的賬戶


awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count  ;}; END{for (i = 0; i < NR; i  ) print i, name[i]}' /etc/passwd
0 root
1 daemon
2 bin
3 sys
4 sync
5 games
...... 

這裡使用for迴圈遍歷陣列

總結

以上所述是小編給大家介紹的Linux中 sed 和 awk的用法詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對指令碼之家網站的支援!

資料來源:https://codertw.com/%E5%89%8D%E7%AB%AF%E9%96%8B%E7%99%BC/392291/