標籤: 網頁設計公司

  • Java的前生今世

    Java的前生今世

    Java作為一門編程語言,自誕生以來已經流行了20多年,在學習它之前,我們有必要先了解一下它的歷史,了解它是如何一步步發展到今天這個樣子。

    孕育

    上世紀90年代,硬件領域出現了單片式計算機系統,比如電視機機頂盒這些消費設備。這些設備的特點是處理能力和內存都有限。如果使用C++編寫程序,則對於這類設備來說過於龐大。

    所以需求便來了,為了適應這類設備,需要一種小型的計算機語言,Java便應運而生了。

    1991年,Sun公司的James Gosling, Mike Sheridan和Patrick Naughton發起了一個名為“Green”的項目小組,主要用於電視機頂盒這類消費設備。

    由於設備的處理能力和內存有限,所以要求語言短小、代碼緊湊。而對於電視機頂盒這類消費設備來說,廠商會選擇各種不同的CPU,所以要求語言可移植、不與特定的平台捆綁在一起

    出生

    Green項目組以C++為基礎,對C++進行了一些改造,並刪除了一些不太實用、複雜繁瑣的東西,開發出了名為“Oak”的語言,(Oka來自James Gosling辦公室外的橡樹)。

    成長

    挫折

    1992年夏天,Green項目組已經能夠演示Green操作系統、Oak的程序設計語言、類庫和其硬件。

    1992年9月,Green項目組發布了它的第一個名為“Start 7”的產品,該產品是一個個人数字助理設備,具有圖形界面和非常智能的遠程控制。

    1992年11月,Green項目被剝離,成為Sun Microsystems的全資子公司Firstperson。

    但是當時的硬件生產廠商對其項目並不感興趣,Firstperson花了一年多也沒找到希望購買其技術的買家。

    1994年,First Person公司解散,被重新納入Sun公司。Oak語言無法進入市場,也被暫時擱置下來。

    機遇

    在上面的過程中,Internet的萬維網也在不斷髮展。對於客戶機/服務器模型來說,萬維網需要做的是將超文本頁面轉換到屏幕的瀏覽器中。

    1994年6月到7月,Sun公司的團隊看到了互聯網的發展,一些圖形Web瀏覽器的出現讓他們認為互聯網可以演變成他們為有線電視所設想的相同的高度交互性媒體。經過三天的頭腦風暴后,該團隊將目標平台重新定位為萬維網平台。

    1994年中期,Oak語言的開發者意識到他們可以開發一個瀏覽器,WebRunner瀏覽器誕生。

    1995年,互聯網的發展帶給了Oak語言一個機遇。當時的網絡頁面是單調、死板的靜態頁面,業界希望頁面能夠“靈活”起來,並且希望代碼能夠通過網絡傳播進行跨平台運行。Oak的語言短小、可移植的特點和這些需求不謀而合。

    Sun公司首先推出了可以嵌入網頁並且可以隨同網頁在網絡上傳輸的Applet(Applet是一種將小程序嵌入到網頁中進行執行的技術)。

    設計者在設計WebRunner瀏覽器具有在網頁中執行內嵌代碼的能力,這種能力能讓網頁變得“靈活”。

    同年,Sun公司將Oak更名為Java(因為Oak已經被使用了,Java一詞來自咖啡),WebRunner瀏覽器也演變成了HotJava瀏覽器,HotJava瀏覽器完全使用Java開發。

    同年5月23日,Sun公司在Sun World會議上展示並正式發布了Java語言和HotJava瀏覽器,各大公司都紛紛停止了自己公司相關項目的開發,競相購買Java的使用許可證,併為自己的產品開發了相應的Java平台。

    發展

    1996年初,Sun公司發布了Java的第1個開發工具包(JDK1.0),這是Java發展的里程碑,標志著Java成為了一種獨立的開發工具。

    同年9月,約8.3萬個網頁應用了Java來製作。

    同年10月,Sun公司發布了Java平台的第1個即時編譯器。

    但是人們很快意識到Java1.0並不能用來進行真正的應用開發。

    1997年2月,JDK1.1面世,它彌補了JDK1.0的大多明顯缺陷,改進了反射能力,但是仍有局限性。

    1998年12月,Sun公司發布了第二代Java平台——JDK1.2。此次發布有幾個不同的版本,分別是標準版J2SE、用於手機等嵌入式設備的微型版J2ME、用於服務器端處理的企業版J2EE。

    此次發布是Java發展過程中最重要的里程碑,標志著Java的應用開始普及。

    2000年5月,JDK1.3、JDK1.4、J2SE1.3相繼發布。

    2001年9月,J2EE1.3發布。

    2002年2月,J2SE1.4發布。該版本提高了Java的計算能力,擴展了標準類庫,提高了系統性能。

    在此期間,Java Applet採用低調姿態,淡化了客戶端的應用,成為服務器端應用的首選平台

    2004年9月,J2SE 1.5版本發布,該版本為重大更新,是自1.1版本以來第一個對Java語言做出重大改進的版本。JavaOne會議后,版本数字從1.5改為5.0。

    2005年6月,Java SE 6發布。版本名稱發生了改變,如J2SE改為Java SE、J2ME改為Java ME、J2EE改為Java EE。該版本沒有對語言方面再進行改進,但是改進了其他性能,增強了類庫。

    2006年11月,Sun公司將Java技術作為免費軟件對外發布。

    2007年3月起,全世界所有開發人員均可對Java源代碼進行修改。

    隨着數據中心越來越依賴於商業硬件而不是專用服務器,Sun公司在2009年被Oracle收購。

    2011年,Oracle發布Java SE 7。

    2014年,Java SE 8發布,近20年以來,該版本有了最大改變,Java 8提供了一種“函數式”編程方式,可以很容易地表述併發執行的計算。

    2017年,Java SE 9發布。

    Java 9之後,Oracle宣布每6月更新一次版本。

    2020年3月,Java SE 14發布。

    Java Web的發展

    Java一路走來,為了適應時代發展,做出了許多改變。

    在早期,Java是為了解決傳統的單機程序設計問題,但由於種種原因,Java後來轉向Web。

    Web的最初模樣

    Web為了提供交互性內容採取了客戶端/服務器系統,但是交互性完全由服務器提供。服務器產生靜態頁面,這些靜態頁面是事先寫好的,將其提供給能夠解釋並显示的客戶端瀏覽器。

    但是我們的需求是千變萬化的,事先寫好的靜態頁面肯定不能滿足我們日益增長的需求。

    CGI

    CGI(Common Gateway Interfa,通用網關接口),它是一段程序,運行在服務器上,提供同客戶端HTML頁面的接口,通俗的講CGI就像是一座橋,把網頁和WEB服務器中的執行程序連接起來,它把HTML接收的指令傳遞給服務器,再把服務器執行的結果返還給HTML頁。

    CGI使網頁變得不是靜態的,而是交互式的。

    但是CGI程序的響應時間依賴於發送的數據量的大小、服務器和網絡的負載,一旦網站變得複雜起來,響應就會變得非常慢且難以維護。

    Applet

    Applet是一種將小程序嵌入到網頁中進行執行的技術,含有Applet的網頁的HTML文件代碼中部帶有<applet></applet>這樣一對標記,當支持Java的網絡瀏覽器遇到這對標記時,就將下載相應的小應用程序代碼並在本地計算機上執行該Applet。

    在當時,Java Applet 可以大大提高Web頁面的交互能力和動態執行能力。

    Java剛出現時,Applet是最受大家歡欣鼓舞的。但是由於當時的網絡環境的問題,安裝Java運行時環境(JRE)所需要的10MB帶寬對當時的用戶來說太過於恐怖。並且微軟的IE瀏覽器並並沒有包含JRE,所以Applet並沒有得到大規模應用。

    Servlet

    Servlet(Server+Applet),即服務器端小程序。Servlet能夠按照用戶提交的內容處理並返回相應的資源。可以輸出HTML頁面,動態展示數據。Servlet實現正確的接口就能夠處理Http請求。

    但是出現了一個很大的問題:HTML代碼需要在Servlet類中用Java代碼一行一行輸出,表現、邏輯、控制、業務等全部在Servlet類中,造成Servlet類代碼混亂(HTML代碼、Java代碼都寫在一起),重複性高、閱讀性差、開發困難。

    下面是使用Servlet在瀏覽器中輸出有一個h1標題的Hello World!字符串的HTML頁面。

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        response.setContentType("text/html;charset=utf-8");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>$Title$</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
    

    可想而知,更複雜的頁面得寫多少代碼!

    JSP

    為了解決上面的問題,Sun公司開發出了JSP。

    JSP(JavaServer Page)是一種動態網頁技術標準。JSP部署於網絡服務器上,可以響應客戶端發送的請求,並根據請求內容動態地生成HTML、XML或其他格式文檔的Web網頁,然後返回給請求者。JSP技術以Java語言作為腳本語言,為用戶的HTTP請求提供服務,並能與服務器上的其它Java程序共同處理複雜的業務需求。

    可以將JSP頁面看成是一個能內嵌Java代碼的HTML頁面。

    靜態部分(HTML頁面)是模板,可以提前寫好,動態部分(數據)可以由Java代碼動態生成。這樣一來就避免了在單純使用Servlet時HTML代碼和Java代碼都出現在Servlet類中的混亂情況。

    JSP在運行時被轉換成Servlet,因此JSP本質是Servlet。

    下面是使用JSP做和上面同樣的事情:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
        <h1>Hello World!</h1>
      </body>
    </html>
    

    仍使用HTML模板,但不是用Java語句一行一行“堆”出來,這多方便!

    使用了JSP后,雖然不用一行行地“堆”HTML頁面了,但是代碼混亂的問題仍沒有解決。表現、邏輯、控制、業務等代碼仍然寫在一塊了,只不過是從Servlet類中挪到JSP中了。

    這樣混亂的代碼極不利於團隊開發,如果項目很小,那還能理順,但如果項目非常大的話,那就“剪不斷,理還亂了”。

    所以這時候,我們急需將代碼分門別類的碼放整齊。

    JSP + JavaBean(Model1模式)

    JavaBean 是用Java語言寫成的可重用組件,JavaBean類要求:

    1. 類是公開的
    2. 具有私有成員變量
    3. 具有無參構造器
    4. 具有setter和getter方法

    上面已經說了,單純使用JSP會有大量的HTML代碼和Java代碼耦合在一起,不利於開發、維護、分工協作。

    我們舉一個登錄的例子:

    登錄大致需要以下幾步:

    1. 在瀏覽器中輸入用戶名、密碼
    2. 獲取數據,交給服務器
    3. 把數據處理成合適的形式
    4. 查詢數據庫的用戶表,看是否有一條用戶名和密碼都符合輸入的記錄。如果有,則登錄成功。

    單純使用JSP時,以上步驟全部在JSP登錄頁面中完成,該頁面既需要显示登錄表單、又需要獲取、處理數據、還需要查詢數據庫。太亂了!!

    有了JavaBean,我們可以將JSP中大量重複的代碼抽取成可重用的組件,封裝成JavaBean,在一定程度上減輕了代碼的耦合度,也在一定意義上實現了分層

    比如,用戶本身就是一個對象,我們可以將其抽取成JavaBean,數據的傳遞、查找都可使用JavaBean來完成。

    JSP+Servlet+JavaBean(Model2模式——MVC模式)

    上面介紹了Servlet、JSP、JSP+JavaBean,雖然在進步,但是都不盡如人意。那為什麼不讓它們結合起來取長補短?

    我們之所以使用JavaBean,就是為了讓Java代碼和HTML代碼分離開了,而Servlet也是一個Java類,為什麼不使用它呢?

    JSP+JavaBean已經實現了部分分層,使用MVC(Model-View-Controller)模式能進一步分層。

    Model(模型):MVC模式的中心組件,處理數據和邏輯。(比如JavaBean,但不止只有JavaBean)

    View(視圖):展示數據,渲染頁面。(前端頁面,比如HTML頁面、JSP頁面)

    Controller(控制器):從View接收數據,向Model發送數據,即用於控制數據分發。(比如Servlet)

    還用上面的登錄例子:

    1. 將JSP登錄頁面作為View

    2. Servlet類(Controller)用於接收用戶輸入的用戶名、密碼,將其封裝為用戶類(JavaBean),然後去數據庫中查詢。如果能查詢到則登錄成功。

    3. 將查詢結果返回給Controller,Controller根據查詢結果選擇一個合適的View,並將數據渲染到頁面,展示給用戶。(在本例中,如果查詢成功,則進入系統主頁;如果查詢不到,則用戶會看到一個登錄失敗頁面)

    使用了MVC設計模式后,代碼有了明顯的分層,結構清晰,各司其職。

    框架

    為了減輕工作量,各種框架逐漸出現在人們的視野中。

    所謂框架,可以把它看做一個半成品的項目/軟件,框架中有許多東西別人都已經幫我們寫好了,比如各種類、方法。

    我們要做的就是去了解、學習框架,在寫好的框架的基礎上、遵循框架的制定好的規則、按照自己的思路、結合框架的思想、去開發我們自己的項目。

    目前Java的Web開發中最出名的框架就是Spring家族了,比如SpringMVC、Spring、SpringBoot。

    熟悉、利用這些框架能夠幫助我們快速、優雅地開發出符合需求的項目。

    另,框架是別人寫好的輪子,有了它,我們能夠跑得更快,但是別忘了怎麼走。

    總結

    說了這麼多,相當於陪着Java從出生到現在走了一遍。我們可以看出Java的發展也不是一帆風順的,我認為Java之所以現在還這麼流行,原因之一就是它能夠一直保持更新,一直在根據時代的需求結合自身的特點不斷地做出改變。正如那句話「窮則變,變則通,通則達」。一門語言能做到這樣,身為人更應該要做到。

    如有錯誤,還請指正。

    參考資料:

    1. 百度百科
    2. 維基百科
    3. Java官方文檔
    4. Java核心卷一(第10版)
    5. Java編程思想(第4版)

    文章首發於公眾號『行人觀學』

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

  • Linux-權限詳解

    目錄

    • 前言
    • alias / unalias 命令別名
    • cd 切換目錄
    • cp 複製文件或目錄
    • cat 查看文件內容
    • chage 設置密碼有效期
    • chown 更改文件所屬
    • chmod 設置文件rwx權限
    • chattr / lsattr 隱藏屬性
    • crontab 定時任務
    • df 磁盤使用情況
    • date 系統時間 / hwclock 硬件時鐘
    • diff 文件比較
    • echo 標準輸出
    • find / locate 文件搜索
    • free 查看內存使用
    • head 查看文件前面的內容
    • history 命令歷史
    • ip 網絡配置管理
    • kill 結束進程
    • ln 創建鏈接(快捷方式)
    • ls 查看目錄中的內容
    • less 分頁查看文件
    • mv 剪切 / 重命名 文件或目錄
    • mkdir 創建目錄
    • ps 查看進程
    • pwd 显示當前目錄
    • passwd 修改密碼
    • rm 刪除文件或目錄
    • su 切換用戶
    • stat 查看文件詳細信息
    • sort 排序 / uniq 去重
    • split 分割文件
    • tar 打包
    • top 動態查看進程
    • tail 查看文件末尾內容
    • touch 修改文件的時間屬性或創建空文件
    • useradd / groupadd 用戶和組管理
    • vi / vim 文本編輯器
    • wc 統計字數行數
    • xargs 參數傳遞
    • yum 紅帽系列包管理工具
    • zip / unzip 壓縮與解壓

    前言

    • 以下命令測試環境為CentOS7.8
    • 使用的shell為系統默認的bash
    • Linux下是區分大小寫的,這點和Windows不同
    • Linux大部分命令語法為命令 [選項] [參數],我所介紹的選項為常用選項並不包含全部

    alias / unalias 命令別名

    alias命令用於給指令設置一個別名,unalias命令用於取消設置

    • 可以給長命令起一個簡單的別名便於使用,如:

      alias ens33="vi /etc/sysconfig/network-scripts/ifcfg-ens33"
      
    • 取消已設置的別名命令

      unalias ens33
      
    • 可以避免危險操作,如系統默認的命令rm mv cp等,都是通過alias加了-i參數的

      # 查看所有的使用別名的命令
      [root@God ~]# alias  
      alias cp='cp -i'
      alias l.='ls -d .* --color=auto'
      alias ll='ls -l --color=auto'
      alias ls='ls --color=auto'
      alias mv='mv -i'
      alias rm='rm -i'
      
    • 在命令前加\或者使用命令全路徑可忽略使用別名

      # 不進行詢問直接刪除mail.log文件
      \rm /var/log/mail.log  
      或
      /usr/bin/rm  /var/log/mail.log
      
    • 在命令行通過aliasunalias設置或取消的別名都是暫時性的,僅作用於當前登錄的會話。如果想要永久生效,可以在~/.bashrc文件添加別名設置

    cd 切換目錄

    cd命令用於切換工作目錄至指定的目錄,可用相對路徑和絕對路徑

    • 選項

      • / 表示根目錄
      • . 表示當前目錄
      • .. 表示上一級目錄
      • - 表示上次所在的目錄
      • ~ 表示當前用戶的家目錄
      # 進入用戶家目錄
      cd ~
      
      # 進入指定目錄
      cd /etc
      
      # 進入上兩級目錄
      cd ../..
      

    cp 複製文件或目錄

    cp用來複制文件或目錄到指定位置

    • 語法

      cp [選項] 源 目標
      
    • 選項

      • -a 相當於同時指定-dpr
      • -d 複製時保留鏈接(相當於Windows系統中的快捷方式)
      • -p 保留源文件或目錄的屬性
      • -r|R 對目錄進行遞歸處理,複製目錄時必須加上它才能複製
      • -f 覆蓋已存在的目標而不給出提示
      • -i-f相反,如果目標文件存在,則提示是否覆蓋
      # 複製文件/etc/hosts到目錄/local下
      cp /etc/hosts /local
      
      # 複製文件/etc/hosts到目錄/local下並命名為hosts.bak
      cp /etc/hosts /local/hosts.bak
      
      # 複製目錄/etc到目錄/local下,如果/local/etc已存在直接覆蓋
      cp -af /etc /local
      
      # 複製目錄/etc到目錄/local下並重命名為etc.bak
      cp -a /etc /local/etc.bak
      

    cat 查看文件內容

    cat命令適合查看少量內容,並可將多個文件連接到一起進行標準輸出,當文本數據內容量過大時,推薦使用lessmore進行查看

    • 語法

      cat [選項] 文件1 [文件2 文件N]
      
    • 選項

      • -n 輸出時显示行號
      • -s 當遇到有連續兩行以上的空白行,就替換成一個空白行
      # 查看resolv.conf的內容
      cat /etc/resolv.conf
      
      # 將/etc/resolv.conf和/etc/hosts兩個文件連接到一起進行標準輸出,並显示行號
      cat -n /etc/resolv.conf  /etc/hosts
      
    • cat還可以配合重定向將標準輸入寫到文件中

      [root@God ~]# cat > demo.txt << EOF
      > 我在命令行打上 cat > demo.txt << EOF
      > 在 > 後面寫的東西都能寫入到文件中
      > 寫完了所有內容后,在最後單獨寫個EOF就可以了
      > EOF
      [root@God ~]# cat -n demo.txt 
           1	我在命令行打上 cat > demo.txt << EOF
           2	在 > 後面寫的東西都能寫入到文件中
           3	寫完了所有內容后,在最後單獨寫個EOF就可以了
      

    chage 設置密碼有效期

    chage 命令本質是修改通過/etc/shadow文件中的內容來設置賬號密碼有效期限的

    • 語法

      chage [選項] 用戶
      
    • 選項

      • -l 列出用戶的當前設置
      • -d DATE DATE為日期,格式YYYY-MM-DD,即設置上次修改密碼的時間,設置為0則下次登錄時必須改密碼,設置為-1則密碼永不過期,密碼是否過期就是根據這個時間計算的
      • -E DATE DATE為日期,格式YYYY-MM-DD,設置賬號失效日期(對root慎用),設置為0則立即失效,設置為-1則永不失效
      • -M N N為天數,密碼有效期,即每過N天不修改密碼的話密碼就會過期
      • -m N N為天數,即距離上次修改日期N天後,才可以更改密碼,設置為0表示隨時可更改
      • -W N N為天數,即距離密碼過期日N天前開始發出警告信息
      • -I N N為天數,即如果一個密碼已過期N天,那麼該賬號將失效
      # 列出 jet 用戶的賬號密碼有效日期詳細信息
      chage -l jet
      
      # 使 jet 用戶下次登陸時必須修改密碼
      chage -d 0 jet
      
      # 設置 jet 用戶2020年8月8日賬號失效
      chage -E '2020-8-8' jet
      
      # 設置用戶至少每90天就需要改一次密碼,並在15天之前提醒
      chage -M 90 -W 15 jet
      

    chown 更改文件所屬

    chown命令可以更改Linux下文件或目錄的所屬用戶、所屬組,Linux下一切皆文件,而文件必須有所屬

    • 語法

      chown [用戶][:用戶組] 文件或目錄              
      
    • 選項

      • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
      • -v 显示執行過程
      # 更改/local/myfile.txt的擁有者為root用戶
      chown root /local/myfile.txt
      
      # 更改/local/myfile.txt的群組的使用者為root組
      chown :root /local/myfile.txt
      
      # 更改/local/myfile.txt的擁有者為root用戶,群組的使用者為root組
      chown root:root /local/myfile.txt
      
      # 更改目錄/local的擁有者為root用戶
      chown -R root /local
      

    chmod 設置文件rwx權限

    chmod命令可用於更改文件的r讀、w寫、x執行權限, 通過ls -lstat命令可查看文件的權限-rw-r--r-- 第一位表示文件類型,后9位每三位為一組,分別表示所屬用戶、所屬組、其他用戶的權限。

    • 語法

      chmod [選項] rwx的權限分值 文件或目錄
      
      • 權限分值 r=4, w=2, x=1
      chmod [選項] 身份標識(+|-)(r|w|x) 文件或目錄
      
      • 身份標識 u=user所屬用戶 , g=group所屬組, o=other其他用戶, a=all(u+g+o)所有用戶
    • 選項

      • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
      # 更改文件/local/myscript.sh的權限
      # 文件擁有者權限=7(r+w+x) 同組用戶權限=5(r+x) 其他用戶權限=5(r+x)
      chmod 755 /local/myscript.sh
      
      # 去掉其他用戶對文件/local/myscript.sh的寫權限
      chmod o-w /local/myscript.sh
      
      # 去掉其他用戶對文件/local/myscript.sh的寫權限,給同組用戶加上執行權限
      chmod o-w,g+x /local/myscript.sh
      
      # 更改目錄/local的權限
      chmod -R 754 /local
      

    chattr / lsattr 隱藏屬性

    chattr命令可以用來修改文件或目錄的隱藏屬性,只有root用戶可以使用

    • 語法

      chattr [選項] (+|-|=)屬性 文件或目錄
      
      • + 表示增加該屬性
      • - 表示去掉該屬性
      • = 表示去掉其他屬性,只保留該屬性
    • 選項

      • -R 遞歸處理,將指定目錄下所有文件及子目錄一併處理
    • 屬性

      • a 設置后只能增加數據,而不能刪除或修改數據
      • i 設置后不能被刪除、改名、設定鏈接也無法新增,相當於鎖定
      • s 徹底刪除的屬性,即有該屬性的文件刪除后無法恢復
      • u 當一個應用程序請求刪除這個文件,系統會保留其數據塊以便以後能夠恢復,預防意外刪除
      # 給test.txt文件添加a屬性,使其只能增加數據
      chattr +a /local/test.txt
      
      # 去掉改屬性
      chattr -a /local/test.txt
      

    lsattr 命令可以查看隱藏屬性

    • 語法

      lsattr [選項] [文件或目錄]
      
    • 選項

      • -a 显示隱藏文件
      • -d 显示目錄的屬性,而不是目錄中內容
      # 查看test.txt文件的隱藏屬性
      lsattr /local/test.txt
      
      # 查看/local目錄的隱藏屬性
      lsattr -d /local
      
      # 查看當前目錄下的文件或目錄的隱藏屬性,包含吟唱文件
      lsattr -a
      

    crontab 定時任務

    crontab命令用來管理需要周期性執行的任務,與Windows下的計劃任務類似,依賴於crond服務執行,定時任務的配置文件一般以用戶為單位,放在/var/spool/cron目錄中,執行日誌是/var/log/croncrontab通過cron 表達式來進行定時任務的配置

    • 避免資源分配不均勻,即多個定時任務在同一時間點執行時,盡量錯開
    • 取消不要的輸出選項,將執行結果 >> /dev/null中,避免一直發郵件
    • 一般情況下周與日、月不可同時共存
    • anacron是可喚醒關機期間的工作任務的配置,有檢測機制,針對不24小時開機的服務器,需要的自行百度
    # cron表達式 分時日月周:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
    # *    代表任何時刻
    # ,    代表分隔時段
    # -    代表時間範圍
    # /N   N為数字,表示執行幾次
    
    • crontab 常用命令

      # 显示當前用戶crontab配置
      crontab -l
      
      # 編輯當前用戶crontab配置
      crontab -e
      
      # root用戶可以幫其他用戶新建/刪除crontab配置
      crontab -u guest
      
    • crontab 配置示例

      # 每1分鐘執行一次
      * * * * * echo $(date) >> /dev/null
      
      # 每5分鐘執行一次後面的命令
      */5 * * * * echo $(date) >> /local/my_crontab.txt
      
      # 每2小時執行一次後面的命令
      * */2 * * * echo $(date) >> /local/my_crontab.txt
      
      # 在3:00與10:00的時候執行一次
      * 3,10 * * * echo $(date) >> /local/my_crontab.txt
      
      # 在10:00到22:00之間每2小時執行一次
      * 10-22/2 * * * echo $(date) >> /local/my_crontab.txt
      
      # 在21:00到21:30之間每5分鐘執行一次
      0-30/5 21 * * * echo $(date) >> /local/my_crontab.txt
      
      # 每周一0點執行一次
      0 0 * * 1 echo $(date) >> /local/my_crontab.txt
      
      # 每年的5月20日00:00分都會給rose發一封情書郵件
      0 0 20 5 * mail rose < /home/jack/lover.txt
      

    df 磁盤使用情況

    df命令用於显示文件系統的磁盤使用信息

    • 語法

      df [選項] 
      
    • 選項

      • -h 以人類可讀的格式显示(K|M|G)
      • -i 显示inode文件的數量和使用量
      • -T 显示磁盤的文件系統類型
      # 显示磁盤使用情況
      df -h
      # 显示inode信息
      df -hi
      

    date 系統時間 / hwclock 硬件時鐘

    linux系統有兩個時鐘:一個是由主板電池驅動的硬件時鐘(Real Time Clock),也叫做RTC或者叫CMOS時鐘。當操作系統關機的時候,用這個來記錄時間,但是對於運行的系統是不用這個時間的;另一個時間是系統時鐘(System clock)也叫內核時鐘或者軟件時鐘,是由軟件根據時間中斷來進行計數的,內核時鐘在系統關機的情況下是不存在的,所以,當操作系統啟動的時候,內核時鐘是要讀取RTC時間來進行時間同步。並且在系統關機的時候將系統時間寫回RTC中進行同步。

    date 命令比較常用,可以用來显示和設定系統的日期和時間,在显示方面還可以自定義格式

    • 語法

      date [+格式] [選項]
      
    • 格式

      • %Y 年 {0000..9999}
      • %m 月 {1..12}
      • %d 日 {01..31}
      • %H 時 {00..23}
      • %M 分 {00..59}
      • %S 秒 {00..59}
      • %N 納秒 {000000000..999999999}
      • %u 星期 {1..7}
      • %j 一年的第多少天 {001..366}
      • %F 完整的日期,相當於 %Y-%m-%d
      • %T 完整的時間,相當於 %H:%M:%S
      • %R 鐘錶上显示的時間, 相當於 %H:%M
      • %s 從1970-01-01 00:00:00 UTC 到現在的秒數
      # 格式化显示當前系統時間
      [root@God ~]# date "+%F %T.%N"
      2020-06-22 20:34:36.179451922
      
      # 显示今天是今年的第多少天
      [root@God ~]# date "+%j"
      174
      
      # 設置系統時間為2012-12-12 12:12:12
      [root@God ~]# date -s "2012-12-12 12:12:12"
      Wed Dec 12 12:12:12 CST 2012
      [root@God ~]# date
      Wed Dec 12 12:12:12 CST 2012
      
    • 選項

      • -d DATESTR 該選項非常強大,可以根據DATESTR的描述显示時間
      • -s DATESTR 根據DATESTR的描述,設置系統時間,把-d換成-s即可
      # 年year 月month 日day 時hour 分min 秒seconds 
      
      # 显示1天前的時間
      date -d "-1day"
      
      # 显示100天後的時間
      date "+%F %T" -d "+100day"
      
      # 显示新中國成立100周年是哪天
      date "+%F" -d "1949-10-01 +100year"
      # 設置日期為新中國成立100周年那天
      date "+%F" -s "1949-10-01 +100year"
      
    • 硬件時鐘hwclock的常用命令

      # 显示硬件時鐘時間
      hwclock
      
      # 將當前系統時間寫入硬件時鐘
      hwclock -w
      
      # 以系統時鐘為準,同步硬件時鐘
      hwclock --systohc
      
      # 以硬件時鐘為準,同步系統時鐘
      hwclock --hctosys
      
      # 將硬件時鐘設置成指定的時間
      hwclock --set --date="2008-08-08 08:08:08"
      
    • 使用ntpdate命令將本機時間與時間服務器的時間進行同步,沒有這個命令使用yum install ntpdate安裝

      # 將本機時間與阿里雲時間服務器時間進行同步 ntp[1-7].aliyun.com
      ntpdate ntp7.aliyun.com
      

    diff 文件比較

    diff命令可以快速比較兩個文件或目錄是否有不同

    • 語法

      # 比較文件
      diff [選項] 文件1 文件2
      # 比較目錄
      diff [選項] 目錄1 目錄2
      
    • 選項

      • -b 忽略一行當中僅有多個空白的區別(例如”about me”與”about me”視為相同)
      • -B 忽略空白行的區別
      • -i 忽略大小寫的區別
      # 比較兩個文件
      diff /etc/hosts /etc/hosts.bak
      

    echo 標準輸出

    echo命令用於打印字符串或變量的值,在shell腳本中極為常用,可以做出進度條效果,也可以打印彩色文字,詳情自行百度

    • 選項

      • -e 開啟轉義字符
      # 轉義:開啟與不開啟的區別
      [root@God test]# echo "Hello \n World"
      Hello \n World
      [root@God test]# echo -e "Hello \n World"
      Hello 
       World
       
      # echo 單引號與雙引號的區別
      [root@God test]# echo "$PATH"
      /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
      [root@God test]# echo '$PATH'
      $PATH
      
      [root@God test]# echo "Hello,World!"
      -bash: !": event not found
      [root@God test]# echo 'Hello,World!'
      Hello,World!
      

    find / locate 文件搜索

    find支持各種姿勢的查找方式,提供了相當多的查找條件,功能很強大。也正因如此它的選項也很多,有時使用起來也是比較耗費系統資源的,特別是直接從 / 下查找的時候,在實際使用中應盡量縮小查找目錄範圍,把/替換成你指定的查找路徑即可

    • 語法

      find [選項] 查找路徑 查找條件 動作
      
    • 選項

      • -L 跟隨符號鏈接,加上此選項意味着會搜索鏈接指向的目錄
    • 條件

      • -name NAME 根據名稱進行查找,支持通配符
      • -mtime +-DAY 根據修改時間按天查找。如+7代表7天(不含)前,-7代表7天(含)內
      • -mmin +-MIN 根據修改時間按分鐘查找。
      • -type TYPE 根據文件類型查找 TYPE的值有d目錄,f普通文件, l符號鏈接等
      • -size +-SIZE 根據文件大小查找。如+100M代表大於100MB的文件,-50M代表小於50MB的文件
      • -perm MODE 根據文件權限查找
      • -maxdepth N N為数字,表示查找深度
      • -user USER 根據用戶名查找
      • -uid UID 根據用戶ID查找
      • -gid GID 根據組ID查找
      • -empty 查找空文件或空目錄,即大小為0bytes
    • 動作

      • -delete 刪除查找出來的文件,目錄只能刪除空目錄
      • -ok CMD {} \; 交互式執行命令,每次執行前會詢問
      • -exec CMD {} \; 直接執行命令,不詢問
      • 說明
        • {} 表示的是查找出來的結果
        • ; 表示的是結束命令,因為;在各個系統中會有不同的意義,所以在前面的\是轉義字符,為了防止系統出錯。如果你不願意\,使用';'結束也是可以的
      # 查找下1層的目錄
      find / -maxdepth 1 -type d 
      
      # 查找下2層的目錄
      find / -maxdepth 2 -type d 
      
      # 根據名稱精確查找
      find / -name "restart_tomcat.sh"
      
      # 根據名稱模糊查找
      find / -name "*.log"
      
      # 根據修改時間查找
      find / -name "*.log" -mtime +7 
      
      # 查找是否有權限為777的文件
      find / -type f -perm 777 | xargs ls -l
      
      # 找到7天前的日誌文件,直接將其刪除
      find / -type f -name '*.log' -mtime +7 -delete
      
      # 找到7天前的日誌文件,並詢問是否將其刪除
      find / -type f -name '*.log' -mtime +7 -ok rm -rf {} \;
      
      # 找到7天前的日誌文件,直接將其刪除
      find / -type f -name '*.log' -mtime +7 -exec rm -rf {} \;
      
      # 使用 xrags 命令實現刪除
      find / -type f -name '*.log' -mtime +7 | xargs rm -rf
      

    locate命令用來查找文件或目錄,要比find命令快很多,原因在於它不搜索具體目錄,而是通過/var/lib/mlocate/mlocate.db自身創建的數據庫進行搜索,這個數據庫含有本地所有文件信息。每天自動更新一次庫中的數據,有時剛創建的文件使用locate搜索不到時就是因為庫中的數據沒有及時更新,為了避免這種情況,在使用locate命令之前可以使用updatedb命令手動更新。如果沒有locate命令,則需要安裝一下yum -y install mlocate

    • 語法

      locate [選項] 查找條件    # 查找條件支持通配符和正則表達式
      
    • 選項

      • -c 只显示找到的數量
      • -i 忽略大小寫
      • -r 使用基礎正則表達式
      • --regex 使用擴展正則表達式
      # 使用前最好先更新一下數據庫
      updatedb
      
      # 查找包含 myfile 的文件和目錄
      locate myfile
      
      # 查找以myfile開頭的文件和目錄
      locate myfile*
      
      # 查找以myfile結尾的文件和目錄
      locate *myfile
      
      # 查找文件名為 1.txt 的文件
      locate -r "/1.txt$"
      

    free 查看內存使用

    free命令可以显示系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩衝區內存

    • 語法

      free [選項]
      
    • 選項

      • -k 以KB為單位進行显示
      • -m 以MB為單位進行显示
      • -g 以GB為單位進行显示
      • -h 以人類可讀的格式显示(K|M|G)
      • -s N N為数字,表示間隔描述,用於持續觀察內存使用狀況
      # 3秒一刷新,显示內存使用情況
      free -h -s 3
      

    head 查看文件前面的內容

    head命令用於查看文件頭部或行內頭部的內容

    • 語法

      head [選項] 文件
      
    • 選項

      • -n N N為数字,表示前N行
      • -c N N為数字,表示行內的前N個字節。UTF-8編碼中一個字母佔1字節,一個漢字佔3字節
    # 显示前100行內容
    head -n 100 /local/
    
    # 显示前5個字節的內容
    echo "Hello,World" | head -c 5
    

    history 命令歷史

    history 命令用於記錄和显示你在命令行敲過的每一條命令,相鄰的重複命令默認會合併成一個。命令歷史記錄太多會讓系統變得不安全,可以根據自己的需求自定義以下環境變量進行限制

    # 記錄命令歷史的文件
    HISTFILE=/root/.bash_history
    # 記錄命令歷史的文件最大記錄條數
    HISTFILESIZE=1000
    # 內存中命令歷史的最大記錄條數
    HISTSIZE=1000
    # 可以通過添加HISTTIMEFORMAT環境變量,記錄命令執行時間
    HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
    
    • 語法

      history [選項] 
      
    • 選項

      • N N為数字,显示最近執行過的N條命令
      • -c 清空內存中的歷史命令
      • -rHISTFILE設置的文件中的內容讀取到內存
      • -w-r相反,把內存中的命令歷史寫入到文件中
      # 查看命令歷史
      history
      
      # 執行第66條命令
      !66
      
      # 執行上一條命令
      !!
      

    ip 網絡配置管理

    ip命令作為iproute2工具包的核心命令,它是linux下管理網絡和流量控制的工具包,旨在替代老牌的工具鏈net-tools,即ifconfig, arp, route, netstat等命令。net-tools通過procfs(/proc)ioctl系統調用去訪問和改變內核網絡配置,而iproute2則通過netlink套接字接口與內核通訊。拋開性能而言,net-tools的用法給人的感覺是比較亂,而iproute2的用戶接口相對net-tools來說相對來說,更加直觀。比如,各種網絡資源(如link、IP地址、路由和隧道等)均使用合適的對象抽象去定義,使得用戶可使用一致的語法去管理不同的對象。如今很多系統管理員依然通過net-tools配置管理網絡,但自2001年起,Linux社區已經對齊停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支持iproute2。如果你仍在使用net-tools,而且尤其需要跟上新版Linux內核中的最新最重要的網絡特性的話,那麼是時候轉到iproute2的陣營了。原因就在於使用iproute2可以做很多net-tools無法做到的事情。ip命令非常強大,如果要完全運用的話估計能寫一本書了。這裏就隨用隨加了,需要深入自行查閱官方文檔。

    • 語法

      ip [選項] 對象 {命令}
      
      • ip 命令的選項不支持連着寫,每個都要加-並用空格分隔
    • 選項

      • -c 加上顏色显示
      • -s 显示更多的信息
    • 對象

      • address IP協議設備
      • link 網絡設備
      • route 路由表
      • 所有對象的名稱均支持完整寫法和縮寫,如address可寫成addr add a
      # 查看IP地址
      ip -c addr
      

    kill 結束進程

    kill命令可以發送一個信號SIGTERM默認為15給進程,可將指定程序終止。程序或工作的編號可以利用ps命令和jobs命令查看

    • 語法

      kill -信號  進程ID|工作ID
      
    • 信號

      • 1 啟動被終止的進程,可讓該PID重新讀取自己的配置文件,類似重新啟動
      • 2 相當於用鍵盤Ctrl+c來中斷一個進程的進行
      • 9 強制中斷一個進程的執行,如果該進程進行到一半,那麼尚未完成的部分可能會有”半產品”產生,比如vim會有.filename.swp保留下來
      • 15 以正常的進程結束方式來結束進程
      • 17 相當於用鍵盤Ctrl+z來暫停一個進程的進行
      # 強制結束PID為8886的進程
      kill -9 8886
      
      # 強制結束JOBNUMBER為2的進程
      kill -9 %2
      
      # 強制結束所有的以httpd啟動的進程
      killall -9 httpd
      

    ln 創建鏈接(快捷方式)

    ln 命令可以為文件或目錄創建一個鏈接(link),鏈接可分為兩種:硬鏈接和軟鏈接。軟鏈接相當於windows下的快捷方式

    • 語法

      ln [選項] 源  目標
      
    • 選項

      • -s 創建為軟鏈接
      # 在家目錄下創建一軟連接
      ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ifcfg-ens33
      

    ls 查看目錄中的內容

    ls命令用於显示指定工作目錄下之內容(列出目前工作目錄所含之文件及子目錄)。ll命令是系統自帶的一個別名命令,主要用於進行長列表显示內容

    • 語法

      ls [選項] [文件或目錄]
      
    • 選項

      • -a 显示所有內容,包括隱藏文件
      • -d 显示目錄本身,而不是目錄中的內容
      • -t 按照時間進行排序,最新的在最上面
      • -r 對排序進行翻轉
      • -l 使用長列表显示內容
      • -h 以人類可讀的格式显示(K|M|G)
      • --full-time 显示精確時間
      # 显示目錄下的所有內容
      ls -a 
      
      # 快速找到修改時間最新的文件,最下面那個就是
      ls -lrth
      

    less 分頁查看文件

    less是對文件或其他輸出進行分頁显示的工具,功能十分強大,而且不會一開始就加載整個文件,在性能和用法上比more更加的有彈性。使用less命令打開的內容可以使用各種功能按鍵來操作,個人感覺完全可以替代more,所以有人說less is more,相比於more,我更喜歡用less

    • 語法

      less [選項] 文件
      
    • 選項

      • -s 显示連續的空行為一個空行
      • -N 显示行號
      • -m 显示類似於more命令的百分比
      • -g 只標記最後搜索的關鍵詞
      • -i 搜索時忽略大小寫
    • 按鍵

      • h 查看幫助
      • ↑↓ 向上或向下一行
      • b 向上滾動一頁 PageUp
      • space 向下滾動一頁 PageDown
      • g 移動到第一行
      • G 移動到最後一行
      • N g/G N為数字,移動到第N行
      • q/Q 退出
      • / KEYWORD 進入向下搜索模式,可根據關鍵字進行搜索,n繼續往下找,N繼續往上找
      • & KEYWORD 輸入關鍵字,可僅显示包含關鍵字的行
      • F 類似於tail -f,實時讀取文件最新內容,按ctrl + c 停止
      # 使用 less 命令查看文件
      less -smN /etc/service
      
      # 使用 less 命令接收其他命令的標準輸出
      history | Dless
      

    mv 剪切 / 重命名 文件或目錄

    mv命令用來為文件或目錄重命名或移動文件或目錄(剪切)

    • 語法

      mv [選項] 源 目標
      
    • 選項

      • -i 若指定目錄已有同名文件,則先詢問是否覆蓋舊文件;
      • -f 如果目標存在,直接覆蓋不提示
      # 移動文件/local/hosts.bak到/local目錄下
      mv /etc/hosts.bak /local
      
      # 重命名文件hosts.bak為hosts
      mv /etc/hosts.bak /etc/hosts
      

    mkdir 創建目錄

    mkdir命令用來創建目錄

    • 語法

      mkdir [選項] 目錄
      
    • 選項

      • -m 創建目錄的同時設置權限
      • -p 如果父目錄不存在,則創建
      # 創建目錄/local/script,如果目錄/local不存在,會報錯
      mkdir /local/script
      
      # 創建目錄/local/script,如果目錄/local不存在,則創建
      mkdir -p /local/script
      
      # 創建目錄/local/script,如果目錄/local不存在,則創建,並給script目錄設定755的權限分數
      mkdir -pm 755 /local/script
      

    ps 查看進程

    ps命令用於显示當前進程的狀態,這個狀態是當前那些進程的快照,如果想要動態查看進程,請使用top命令,常用來通過管道命令搭配grep命令進行查詢,然後通過kill命令,刪除不需要的進程

    • 語法

      ps [選項]
      
    • 選項

      • -e 显示所有進程
      • -f 显示全格式列表,增加 UID、PPID、C與STIME欄位的显示
      # 根據關鍵字查找進程
      ps -ef | grep tomcat
      

    pwd 显示當前目錄

    pwd用於显示當前所在的路徑,加-P可显示真實路徑,而非鏈接路徑

    [root@God /]# ll -d /sbin
    lrwxrwxrwx. 1 root root 8 Jun 21 11:20 /sbin -> usr/sbin
    [root@God /]# cd sbin/
    [root@God sbin]# pwd    
    /sbin
    [root@God sbin]# pwd -P  
    /usr/sbin
    

    passwd 修改密碼

    passwd可以用來更改用戶的密碼,還可以鎖定與解鎖用戶

    • 語法

      passwd [選項] 用戶
      
    • 選項

      • -d 刪除密碼
      • -f 強迫用戶下次登錄時必須修改密碼
      • -w 設置密碼到期前提前警告的天數
      • -l 鎖定賬戶
      • -u 解鎖賬戶
      • -x 設置密碼有效天數
      # 修改當前用戶的密碼
      passwd
      
      # 修改其他用戶的密碼,root用戶修改其他用戶密碼,不需要提供原密碼
      passwd jack
      
      # 鎖定用戶
      passwd -l jack
      
      # 解鎖鎖定的用戶
      passwd -u jack
      

    rm 刪除文件或目錄

    rm 用於刪除文件或目錄,生產服務器執行刪除命令前一定要備份

    • 語法

      rm [選項] 文件或目錄
      
    • 選項

      • -i 刪除前詢問
      • -f 直接刪除,不確認
      • -r 刪除目錄時使用,否則無法刪除目錄
      # 刪除目錄下所有內容,並且不經過確認,慎用
      rm -rf /local
      
      # rm 刪除目錄下所有隱藏文件
      rm /local/.*
      
      # rmdir 只能刪除空目錄,目錄不為空無法刪除
      rmdir /local
      

    su 切換用戶

    su命令用於切換當前用戶,除了root外,需要輸入該用戶的密碼

    su命令和su -命令最大的本質區別就是:前者只是切換了root身份,但Shell環境仍然是普通用戶的Shell;而後者連用戶和Shell環境一起切換成root身份了。只有切換了Shell環境才不會出現PATH環境變量錯誤。su切換成root用戶以後,pwd一下,發現工作目錄仍然是普通用戶的工作目錄;而用su -命令切換以後,工作目錄變成root的工作目錄了。用echo $PATH命令看一下susu -以後的環境變量有何不同。以此類推,要從當前用戶切換到其它用戶也一樣,應該使用su -命令。

    # 切換到用戶執行命令,命令執行完在自動切換回來
    [root@God ~]# su jet -c ls
    ls: cannot open directory .: Permission denied
    [root@God ~]# su - jet -c ls
    1.txt
    

    stat 查看文件詳細信息

    stat命令可以查看文件的詳細信息

    • 語法

      stat [選項] 文件
      
    • 選項

      • -c FORMAT 格式化显示 FORMAT的取值可以查看幫助
      # 查看文件的權限
      [root@God ~]# stat -c %A testfile 
      -rw-r--r--
      [root@God ~]# stat -c %a testdir/
      755
      

    sort 排序 / uniq 去重

    sort命令用於對文本內容或者是對其他命令的輸出進行排序显示。

    • 語法

      sort [選項] 文件
      
    • 選項

      • -u 合併重複的行
      • -r 反向排序
      • -g 按照数字大小排序
      • -t SEP 按照SEP進行分列,默認為空格
      • -k N N為数字,表示根據第N列排序
      # 根據進程號排序查看進程
      ps -ef | sort -rgk 2
      

    uniq 命令用於去除重複的行,一般與sort搭配使用

    • 語法

      uniq [選項]  源數據
      
    • 選項

      • -c 統計重複行出現的次數
      • -d 僅显示重複出現的行
      • -u 僅显示出現一次的行
      # 統計IP地址出現的次數
      cat ip.txt | sort | uniq -c 
      

    split 分割文件

    split可以將大文件分割成若干個小文件

    • 語法

      split [選項] 文件 前綴
      
    • 選項

      • -d 給文件添加数字後綴
      • -b SIZE 根據大小進行分割,可以添加單位(b|k|m|g)等
      • -l N N為數字錶示行數,按照行數進行分割
      # 將catalina.out按照300m的大小進行分割,分割的文件會以catalog00,catalog01,catalog02的方式來建立
      split -db 300m catalina.out catalog
      
      # 將分割后的若干個小文件在還原
      more catalog* >> catalina.out
      

    tar 打包

    tar 命令用來打包或壓縮文件,選項相當多。一般只打包不壓縮的文件以.tar結尾,通過gzip進行打包壓縮的文件以.tar.gz結尾,通過bzip2進行打包壓縮的文件以.tar.bz2 結尾

    • 語法

      tar [選項] 壓縮文件名 操作目標
      
    • 選項

      • -c 創建打包文件
      • -x 釋放打包文件
      • -t 查看包文件內容
      • -v 显示詳細過程
      • -z 使用gzip的方式進行壓縮或解壓
      • -j 使用bzip2的方式進行壓縮或解壓
      • -h 同時打包鏈接指向的文件
      • -C 指定解壓目錄
      # 將目錄/local進行打包並使用gzip進行壓縮
      tar -zcvf local.tar.gz /local
      
      # 將local.tar.gz進行解壓並將打包文件釋放到當前目錄
      tar -zxvf local.tar.gz
      
      # 僅解壓指定的檔案local/script到當前工作目錄
      tar -zxvf local.tar.gz local/script
      
      # 將目錄/local進行打包並使用gzip進行壓縮,但排除以.log結尾的文件
      tar -zcvf local.tar.gz --exclude=*.log /local
      

    top 動態查看進程

    top命令可以實時的查看系統運行的整體情況,是一個綜合了多方信息監測系統性能和運行信息的實用工具。

    • 語法

      top [選項]
      
    • 選項

      • -d N N為数字,表示刷新秒數間隔
      • -b 以追加的方式显示結果
      • -n N N為数字,表示刷新次數
      • -p PIDLIST 只显示指定PID的進程,多個PID之間用,分隔
      • -u USER 只显示指定用戶的進程
      # 以1秒的時間間隔來動態查看進程
      top -d 1
      
      # 查看進程ID為 1 12 38 的進程信息
      top -d 1 -p 1,12,38
      

    tail 查看文件末尾內容

    tail 命令和head命令相反,用於查看文件末尾的內容,而且可以實時刷新

    • 語法

      tail [選項] 文件
      
    • 選項

      • -n N N為数字,表示末尾N行
      • -c N N為数字,表示行內的末尾的N個字節。UTF-8編碼中一個字母佔1字節,一個漢字佔3字節
      • -f 實時刷新显示文件內容
      # 實時查看文件/local/mylog.log末尾100行的內容
      tail -100f  /local/mylog.log
      

    touch 修改文件的時間屬性或創建空文件

    touch命令用於修改文件或者目錄的時間屬性,若文件不存在,則創建一個新的空文件。Linux下的三個時間屬性概念分別是atime(access time)讀取時間 、 mtime(modify time)修改時間、ctime(change time),注意ctime不是create time。實際工作中使用touch修改這些時間屬性的需求極少,相反大多數是用來創建一個或多個空文件。有點喧賓奪主的意思~

    • 語法

      touch [選項] 文件或目錄
      
    • 選項

      • -a 修改文件或目錄的讀取時間
      • -m 修改文件或目錄的修改時間
      • -t STAMP 指定時間戳,格式為[YYYY]MMDDhhmm[.ss]
      • -c 如果文件不存在,不要創建文件
      # 使用{}可一次性創建多個空文件,如 {1..10}  {a..z}  {1,3,5,7,9}
      # 創建一個空文件
      touch olympic.txt
      
      # 創建99空文件
      touch olympic{1..99}.txt
      
      # 修改文件的修改時間 mtime
      touch -cmt 200808080808.08 olympic.txt
      

    useradd / groupadd 用戶和組管理

    Linux系統是一個多用戶多任務的分時操作系統,任何一個要使用系統資源的用戶,都必須首先向系統管理員申請一個賬號,然後以這個賬號的身份進入系統。用戶的賬號一方面可以幫助系統管理員對使用系統的用戶進行跟蹤,並控制他們對系統資源的訪問;另一方面也可以幫助用戶組織文件,併為用戶提供安全性保護。每個用戶賬號都擁有一個唯一的用戶名和各自的密碼。用戶在登錄時鍵入正確的用戶名和密碼后,就能夠進入系統和自己的家目錄。

    • 添加用戶

      # 添加一個普通用戶,不指定組的話會自動創建一個同名組
      useradd jack 
      
      # 添加一個普通用戶,並指定現有的組(組必須先存在)
      useradd -g root jet
      
      # 添加一個系統用戶,並不讓其登錄 -r 代表系統用戶,系統用戶不會有家目錄
      useradd -r -s /sbin/nologin  rose 
      
    • 刪除用戶

      # 只刪除用戶
      userdel jack
      
      # 刪除用戶,並刪除該用戶的家目錄(包括目錄中的內容)
      # 家目錄外的用戶所屬文件會替換成用戶ID,當有新的用戶使用這個ID時,該文件自動歸屬新用戶
      userdel -r jack
      
    • 修改用戶

      # 修改用戶的初始用戶組,通過名稱修改
      usermod -g root jack
      
      # 修改用戶的初始用戶組,通過GID修改
      usermod -g 888 jack
      
      # 相當於passwd -l,鎖定用戶
      usermod -L jack
      
      # 相當於passwd -u,解除鎖定
      usermod -U jack 
      
      # 禁止用戶登錄
      usermod -s /sbin/nologin jack
      
      # 修改用戶ID
      usermod -u 888 jack
      
    • 查看用戶

      # 查看當前用戶
      id
      
      # 查看當前登錄的用戶
      w
      
      # 查看所有的用戶
      cat /etc/passwd
      cat /etc/passwd | cut -d ':' -f 1
      
    • 添加用戶組

      # 建立一個一般用戶組
      groupadd mygroup
      
      # 建立一個系統用戶組
      groupadd -r admingroup
      
    • 刪除用戶組

      # 刪除用戶組
      groupdel admingroup
      
    • 修改用戶組

      # 修改組ID
      groupmod -g 888 mygroup
      
      # 修改組名稱 CIA為新名稱
      groupmod -n CIA mygroup
      
    • 查看用戶組

      cat /etc/group
      

    vi / vim 文本編輯器

    vivim用法基本一致,它們的關係有些類似於Windows下notepad與notepad++的關係,不過vim有時默認沒有安裝,需要yum -y install vim手動安裝一下。因為vim相比vi,功能更強大,又有語法高亮等功能。所以個人還是習慣並推薦使用vim。下面介紹的vim的使用方法,通常在vi上同樣適用,網上介紹vim使用的方式基本上就是說在三種模式下使用總結,即命令模式、輸入模式、底線命令模式,介紹十分詳盡,簡直快把整個vim的幫助給弄下來了。我這裏介紹的常用操作為單位,不是很全,但日常使用應該足夠了。

    • 打開文件

      # 打開一個文件
      vim /tmp/yum.log
      
      # 按 ctrl+w 然後按 上下左右鍵 可在窗口之間切換
      # 打開多個文件,縱向窗口分割,左右一邊一個窗口
      vim -O /etc/hosts /etc/hosts.bak
      # 打開多個文件,橫向窗口分割,上下一遍一個窗口
      vim -o /etc/hosts /etc/hosts.bak
      
    • 編輯文本

      • 打開文件后,按i鍵可在光標處插入內容;按o鍵可在光標處的下一行插入內容。此時底部會显示-- INSERT --字樣,按Esc鍵可退出編輯模式
    • 快速定位

      • : set nu 显示行號, 按 : 然後輸入set nu敲回車
      • : set nonu 取消显示行號
      • : N N為数字,表示行號,按 : 然後輸入11,敲回車即可快速移動光標到第11行,輸入$則移動到最後一行
      • N% N為数字,表示百分比,比如按58然後按一下%,即可移動光標到文件58%的部分
      • H | M | L 按這三個鍵可快速移動光標到屏幕的頂部、中間、底部位置
      • ctrl+u 往上翻半頁
      • ctrl+d 往下翻半頁
      • ↑↓←→ 移動光標
      • Home/End 移動光標到行首或行末
      • PageUp/PageDown 翻頁
    • 快速編輯

      • N yy N為数字,複製光標所在行以下的N行,默認N為1,即當前行。如複製 20 行,就按20,然後按yy就複製了
      • N ddyy用法一樣,只不過它是剪切。所以它也能當刪除使用
      • p 在光標所在行的下一行粘貼剛複製或剪切的內容
      • uu鍵,撤銷剛才的操作
      • ctrl+r 反撤銷
      • v 進入視圖模式,可通過上下左右移動光標選擇一片文本,此時底部會显示-- VISUAL --字樣(按Esc鍵可退出視圖模式)然後按y複製或按d剪切,按p在光標處後面粘貼
      • Vv一樣,只不過是以行為單位
      • ctrl+vv一樣,只不過是以列為單位,類似於在notepad++中,按住Alt選文字
    • 查找

      • / KEYWORD/進入查找,在底部/的後面輸入想查找的內容,按回車搜索,然後按n往下繼續查找,按N往上查找
    • 替換

      • :%s#OLD#NEW#gic 個人習慣先按:%s###g,然後移動光標到OLD位置輸入要替換的字符串,在移動光標到NEW位置,輸入新字符串,敲回車進行文字替換,%表示全文,不加代表當前行,用10,20替換百分號則表示替換10到20行;後面的gicg表示全局替換不加只替換每行的第一個;i 表示忽略大小寫,c表示在替換前進行確認,需要哪個加哪個
    • 退出和保存

      • Esc 當你進入編輯模式、命令模式等其他模式時,都可按Esc鍵退出
      • :w 保存
      • :wq 保存並退出
      • q! 強制退出不保存

    wc 統計字數行數

    wc命令可以統計字節數、行數、單詞數

    • 語法

      wc [選項] 文件
      
    • 選項

      • -l 統計行數
      • -c 統計字節數
      • -m 統計字符數
      # 依次列出/etc/passwd中的 行數、字數、字符數
      wc /etc/passwd
      
      # 查看有多少個進程數
      ps -ef | wc -l
      

    xargs 參數傳遞

    xargs是給命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它可以將管道或標準輸入的數據轉換成命令行參數,也能夠從文件的輸出中讀取數據。它能夠捕獲一個命令的輸出,然後傳遞給另外一個命令,一般與管道在一起使用

    # 找到修改日期在7天前的日誌,並將其刪除
    find /local/server -name "*.log" -mtime +7 | xargs rm -rf
    

    yum 紅帽系列包管理工具

    yum,是Yellow dog Updater, Modified 的簡稱,是杜克大學為了提高RPM 軟件包安裝性而開發的一種軟件包管理器,適用於Redhat系列的系統。用python寫成,yum 的宗旨是自動化地升級,安裝/移除rpm 包,收集rpm 包的相關信息,檢查依賴性並自動提示用戶解決。yum 主要功能是更方便的添加/刪除/更新rpm 包,自動解決包的依賴性問題,便於管理大量系統的更新問題。yum 可以同時配置多個資源庫(Repository),簡潔的配置文件(/etc/yum.conf),自動解決增加或刪除rpm包時遇到的依賴性問題。

    • 語法

      yum [選項] 命令 [包名]
      
    • 選項

      • -y 對所有的確認都回答yes
    • 命令

      • install PACKAGE 安裝包,PACKAGE替換成要安裝的包名
      • update PACKAGE 更新包
      • remove PACKAGE 卸載包
      # 安裝 vim 
      yum -y install vim
      

    zip / unzip 壓縮與解壓

    zip 是個廣泛使用的壓縮程序,壓縮后的文件後綴名為.zip

    # 將當前目錄下所有txt文本壓縮在一起
    zip txt.zip *.txt
    
    # 將目錄/local壓縮成local.zip文件
    zip -r local.zip /local
    
    # 將local.zip解壓縮到指定目錄,不加-d選項,則解壓到當前目錄
    unzip local.zip -d ~/
    

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※教你寫出一流的銷售文案?

  • 【Spring註解驅動開發】關於BeanPostProcessor後置處理器,你了解多少?

    寫在前面

    有些小夥伴問我,學習Spring是不是不用學習到這麼細節的程度啊?感覺這些細節的部分在實際工作中使用不到啊,我到底需不需要學習到這麼細節的程度呢?我的答案是:有必要學習到這麼細節的程度,而且是有機會、有條件一定要學!吃透Spring的原理和源碼!往往拉開人與人之間差距的就是這些細節的部分,當前只要是使用Java技術棧開發的Web項目,幾乎都會使用Spring框架。而且目前各招聘網站上對於Java開發的要求幾乎清一色的都是熟悉或者精通Spring。所以,你,很有必要學習Spring的細節知識點。

    項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

    BeanPostProcessor後置處理器概述

    首先,我們來看下BeanPostProcessor的源碼,看下它到底是個什麼鬼,如下所示。

    package org.springframework.beans.factory.config;
    import org.springframework.beans.BeansException;
    import org.springframework.lang.Nullable;
    public interface BeanPostProcessor {
    	@Nullable
    	default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    	@Nullable
    	default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		return bean;
    	}
    
    }
    

    從源碼可以看出:BeanPostProcessor是一個接口,其中有兩個方法,postProcessBeforeInitialization和postProcessAfterInitialization兩個方法,這兩個方法分別是在spring容器中的bean初始化前後執行,所以spring容器中的每一個bean對象初始化前後,都會執行BeanPostProcessor接口的實現類的這兩個方法。

    也就是說,postProcessBeforeInitialization方法會在bean實例化和屬性設置之後,自定義初始化方法之前被調用,而postProcessAfterInitialization方法會在自定義初始化方法之後被調用。當容器中存在多個BeanPostProcessor的實現類時,會按照它們在容器中註冊的順序執行。對於自定義BeanPostProcessor實現類,還可以讓其實現Ordered接口自定義排序。

    因此我們可以在每個bean對象初始化前後,加上自己的邏輯。實現方式:自定義一個BeanPostProcessor接口的實現類MyBeanPostProcessor,然後在類MyBeanPostProcessor的postProcessBeforeInitialization和postProcessAfterInitialization方法裏面寫上自己的邏輯。

    BeanPostProcessor後置處理器實例

    我們創建一個MyBeanPostProcessor類,實現BeanPostProcessor接口,如下所示。

    package io.mykit.spring.plugins.register.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    /**
     * @author binghe
     * @version 1.0.0
     * @description 測試BeanPostProcessor
     */
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessBeforeInitialization方法,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessAfterInitialization,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    }
    

    接下來,我們運行BeanLifeCircleTest類的testBeanLifeCircle04()方法,輸出的結果信息如下所示。

    調用了postProcessBeforeInitialization方法,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$e8ab4f2e@56528192
    調用了postProcessAfterInitialization,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$e8ab4f2e@56528192
    Cat類的構造方法...
    調用了postProcessBeforeInitialization方法,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@1b1473ab
    Cat的postConstruct()方法...
    Cat的init()方法...
    調用了postProcessAfterInitialization,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@1b1473ab
    Cat的preDestroy()方法...
    Cat的destroy()方法...
    

    可以看到,postProcessBeforeInitialization方法會在bean實例化和屬性設置之後,自定義初始化方法之前被調用,而postProcessAfterInitialization方法會在自定義初始化方法之後被調用。

    也可以讓實現Ordered接口自定義排序,如下所示。

    package io.mykit.spring.plugins.register.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.core.Ordered;
    import org.springframework.stereotype.Component;
    
    /**
     * @author binghe
     * @version 1.0.0
     * @description 測試BeanPostProcessor
     */
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessBeforeInitialization方法,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("調用了postProcessAfterInitialization,beanName = " + beanName + ", bean = " + bean);
            return bean;
        }
    
        @Override
        public int getOrder() {
            return 3;
        }
    }
    

    再次運行BeanLifeCircleTest類的testBeanLifeCircle04()方法,輸出的結果信息如下所示。

    調用了postProcessBeforeInitialization方法,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$b045438a@1ed1993a
    調用了postProcessAfterInitialization,beanName = animalConfig, bean = io.mykit.spring.plugins.register.config.AnimalConfig$$EnhancerBySpringCGLIB$$b045438a@1ed1993a
    Cat類的構造方法...
    調用了postProcessBeforeInitialization方法,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@36c88a32
    Cat的postConstruct()方法...
    Cat的init()方法...
    調用了postProcessAfterInitialization,beanName = cat, bean = io.mykit.spring.plugins.register.bean.Cat@36c88a32
    Cat的preDestroy()方法...
    Cat的destroy()方法...
    

    BeanPostProcessor後置處理器作用

    後置處理器用於bean對象初始化前後進行邏輯增強。spring提供了BeanPostProcessor的很多實現類,例如AutowiredAnnotationBeanPostProcessor用於@Autowired註解的實現,AnnotationAwareAspectJAutoProxyCreator用於SpringAOP的動態代理等等。

    除此之外,我們還可以自定義BeanPostProcessor的實現類,在其中寫入需要的邏輯。下面以AnnotationAwareAspectJAutoProxyCreator為例,說明後置處理器是怎樣工作的。我們都知道springAOP的實現原理是動態代理,最終放入容器的是代理類的對象,而不是bean本身的對象,那麼spring是什麼時候做到這一步的?就是在AnnotationAwareAspectJAutoProxyCreator後置處理器的postProcessAfterInitialization方法,即bean對象初始化完成之後,後置處理器會判斷該bean是否註冊了切面,如果是,則生成代理對象注入容器。Spring中的關鍵代碼如下所示。

    /**
      * Create a proxy with the configured interceptors if the bean is
      * identified as one to proxy by the subclass.
      * @see #getAdvicesAndAdvisorsForBean
      */
    @Override
    public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
        if (bean != null) {
            Object cacheKey = getCacheKey(bean.getClass(), beanName);
            if (this.earlyProxyReferences.remove(cacheKey) != bean) {
                return wrapIfNecessary(bean, beanName, cacheKey);
            }
        }
        return bean;
    }
    

    好了,咱們今天就聊到這兒吧!別忘了給個在看和轉發,讓更多的人看到,一起學習一起進步!!

    項目工程源碼已經提交到GitHub:https://github.com/sunshinelyz/spring-annotation

    寫在最後

    如果覺得文章對你有點幫助,請微信搜索並關注「 冰河技術 」微信公眾號,跟冰河學習Spring註解驅動開發。公眾號回復“spring註解”關鍵字,領取Spring註解驅動開發核心知識圖,讓Spring註解驅動開發不再迷茫。

    部分參考:https://www.cnblogs.com/dubhlinn/p/10668156.html

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※別再煩惱如何寫文案,掌握八大原則!

  • 2015年京津冀公共服務新能源車將達20222輛

    22日,中國工信部、發改委及科技部等七部委聯合印發《京津冀公交等公共服務領域新能源汽車推廣工作方案》,提出2014年到2015年,京津冀地區公共交通服務領域共推廣20,222輛新能源汽車。其中北京市8,507輛,天津市6,000輛,河北省5,715輛,京津冀地區公交車中新能源汽車到2015年底比例不低於16%,京津出租車中新能源汽車比例不低於5%。   2014年到2015年,京津冀地區共新建充/換電站94座,充電樁新增1.62萬個。到2015年底,京津冀地區充換電站總數將達到112座,充電樁總數將達到19,657個,基本建成以保障運行為前提,建設規模適度超前的充電設施網絡。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※教你寫出一流的銷售文案?

  • 新物種!泰國發現巨大「鯊齒龍」 位居食物鏈頂端

    摘錄自2019年10月11日自由時報報導

    由泰國、日本大學合力進行的研究,在泰國發現一種具有鯊狀齒的大型肉食性恐龍,長逾8公尺,是同一時期已知最大體型的掠食性恐龍。

    這份研究由泰國NRRU大學及日本福井縣立大學的研究人員合作進行,9日發表於,研究人員表示,從泰國出土、帶有鯊魚狀牙齒的掠食性恐龍被證實是前所未見的新物種,生存於1.15億年前的下白堊紀,並獲命名為「Siamraptor suwati」。

    研究報告指出,在這次考古研究中,科學家發現的化石至少來自4隻不同恐龍的個別部位,其中包括頭骨、齒骨、脊椎、尾部及四肢,推測其行進時以後二肢站立,前足則負責抓扣、撕扯。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司"嚨底家"!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※推薦評價好的iphone維修中心

  • 菲南民答那峨島規模6.3強震

    摘錄自2019年10月17日中央社報導

    菲律賓南部民答那峨島北可塔巴托省(North Cotabato)杜路南鎮(Tulunan)東南方約22公里處,16日7時37分發晚間發生規模6.3強震,震源深度僅15公里,附近省份都感受到地震震波。已知造成2人死亡,至少20多人受傷。ABS-CBN新聞網報導,根據菲律賓火山暨地震研究所(Phivolcs)資訊,這起地震沒有海嘯風險。美國地質研究所測得地震規模為6.4。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • 自來水源遭廢油污染 河內數十萬戶受影響

    摘錄自2019年10月16日中央社報導

    河內市若干區域民眾10日起發現自來水有異味,主管單位獲報後取樣送驗,相關單位隨後查出自來水水源上游小溪被歹徒偷倒廢油,使水質受污染。目擊者說,8日看到一輛貨車在小溪偷倒廢油,當地翌日下大雨,大量廢油流出大河,再往下游流去。

    河內市政府15日公布自來水檢驗結果,水中苯乙烯(Styrene)含量超標1.3倍至3.65倍,是水源廢油污染所致,勸告民眾停止飲用遭污染自來水,指示相關單位安排水罐車免費供水給受影響社區民眾。

    事件影響當地數十萬戶居民,由於自來水供應商和主管單位對此事處理進度緩慢,引起民眾激烈反應。

     

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

  • 歐盟執委會副主席被提名人 力挺2030碳排降50%目標

    環境資訊中心綜合外電;姜唯 編譯;林大利 審校

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    新北清潔公司,居家、辦公、裝潢細清專業服務

    ※教你寫出一流的銷售文案?

  • 稻米進口米價暴跌 菲農民世界糧食日上街抗議

    摘錄自2019年10月16日中央社報導

    菲律賓總統杜特蒂(Rodrigo Duterte)2月簽署稻米關稅法,取消稻米進口數量限制,允許民間貿易商選擇國家進口稻米,盼藉此改善國內稻米供應情形,降低市場價格。

    但在16日世界糧食日這一天,菲律賓農民運動(KMP)、全國務農婦女聯盟(Amihan)和守護稻米(Bantay Bigas)等農民組織率領10多名農民,帶著全空的鍋瓢到農業部前抗議稻米關稅法讓農民無米可下鍋。他們表示稻米關稅法(RTL)實施後,越南、泰國的廉價稻米進口使菲律賓米價暴跌,嚴重影響農民生計。

    菲律賓農民運動主席、農業改革部(DAR)前部長馬利安諾(Rafael Mariano)說,稻米關稅法實施後,「世界糧食日」在菲律賓已變成「世界無糧食日」。

    因應米價暴跌和農民訴求,馬尼拉當局正研議對進口稻米設定建議零售價。與此同時,「守護稻米」和婦女組織「嘉布瑞拉」(Gabriela)也發起連署,預計11月把連署書呈交參眾兩院議員,希望促成廢除稻米關稅法。

    本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司"嚨底家"!

    ※幫你省時又省力,新北清潔一流服務好口碑

    ※別再煩惱如何寫文案,掌握八大原則!

  • DNS篇(詳解DNS)

    DNS篇(詳解DNS)

    *文章來源:https://blog.egsec.cn/archives/601

    *本文將主要說明:本文主要敘述什麼是DNS、域名的層級、DNS 解析過程、DNS的緩存時間、DNS 的記錄類型、DNS 報文結構、DNS劫持與HTTP劫持以及手動清理本地緩存的方法。

     

    DNS屬於應用層。DNS即域名系統,其作用是將字符串域名解析成相對於的服務器IP地址,免除人們記憶IP地址的單調和苦惱,屬於為用戶排憂解難之舉,因此劃歸為應用層。DNS不屬於協議,它是域名解析。

     

    什麼是DNS

    DNS是 Domain Name System 的縮寫,也就是 域名解析系統,它的作用非常簡單,就是根據域名查出對應的 IP地址。

    你可以把它想象成一本巨大的電話本,比如當你要訪問域名www.egsec.cn,首先要通過DNS查出它的IP地址是118.31.61.137。

    域名層級

    DNS 的解析過程中,需要對域名的層級有了解:

    • 根域名 :.root 或者 . ,通常是省略的
    • 頂級域名,如 .com,.cn 等
    • 次級域名,如 baidu.com 里的 baidu,這個是用戶可以進行註冊購買的
    • 主機域名,比如 baike.baidu.com 里的baike,這個是用戶可分配的 
    主機名.次級域名.頂級域名.根域名
    baike.baidu.com.root
    

    DNS 解析過程

    咱們以訪問 www.egsec.cn 這個域名為例,來看一看當你訪問 www.egsec.cn 時,會發生哪些事:

    1. 先查找本地 DNS 緩存(自己的電腦上),有則返回,沒有則進入下一步
    2. 查看本地 hosts 文件有沒有相應的映射記錄,有則返回,沒有則進入下一步
    3. 向本地 DNS 服務器(一般都是你的網絡接入服務器商提供,比如中國電信,中國移動)發送請求進行查詢,本地DNS服務器收到請求后,會先查下自己的緩存記錄,如果查到了直接返回就結束了,如果沒有查到,本地DNS服務器就會向DNS的根域名服務器發起查詢請求:請問老大, www.egsec.cn 的ip是啥?
    4. 根域名服務器收到請求后,看到這是個 .cn 的域名,就回信說:這個域名是由 .cn 老弟管理的,你去問他好了,這是.cn老弟的聯繫方式(ip1)。
    5. 本地 DNS 服務器接收到回信后,照着老大哥給的聯繫方式(ip1),馬上給 .cn 這個頂級域名服務器發起請求:請問 .cn 大大,www.egsec.cn 的ip 是啥?
    6. .cn 頂級域名服務器接收到請求后,看到這是 egsec.cn 的域名,就回信說:這個域名是 .egsec.cn 老弟管理的,你就去問他就行了,這是他的聯繫方式(ip2)
    7. 本地 DNS 服務器接收到回信后,按照前輩的指引(ip2),又向 .egsec.cn 這個權威域名服務器發起請求:請問 egsec.cn 大大,請問 www.egsec.cn 的ip是啥?
    8. egsec.cn 權威域名服務器接收到請求后,確認了是自己管理的域名,馬上查了下自己的小本本,把 www.egsec.cn 的ip告訴了 本地DNS服務器。
    9. 本地DNS服務器接收到回信后,非常地開心,這下總算拿到了www.egsec.cn的ip了,馬上把這個消息告訴了要求查詢的客戶(就是你的電腦)。由於這個過程比較漫長,本地DNS服務器為了節省時間,也為了盡量不去打擾各位老大哥,就把這個查詢結果偷偷地記在了自己的小本本上,方便下次有人來查詢時,可以快速回應。

    總結起來就是三句話:

    • 從”根域名服務器”查到”頂級域名服務器”的NS記錄和A記錄(IP地址)
    • 從”頂級域名服務器”查到”次級域名服務器”的NS記錄和A記錄(IP地址)
    • 從”次級域名服務器”查出”主機名”的IP地址

    DNS的緩存時間

    上面的幾個步驟里,可以看到有兩個地方會緩存 DNS 的查詢記錄,有了緩存,在一定程度上會提高查詢效率,但同時在準確率上會有所損失。

    因此我們在配置 DNS 解析的時候,會有一個 TTL 參數(Time To Live),意思就是這個緩存可以存活多長時間,過了這個時間,本地 DNS 就會刪除這條記錄,刪除了緩存后,你再訪問,就要重新走一遍上面的流程,獲取最新的地址。

    DNS 的記錄類型

    當我們在阿里雲買了一個域名后,可以配置我們主機域名解析規則,也就是 記錄。  

    阿里雲域名雲解析(不管是哪個服務商都一樣):

    常見的 DNS 記錄類型如下

    • A:地址記錄(Address),返回域名指向的IP地址。
    • NS:域名服務器記錄(Name Server),返回保存下一級域名信息的服務器地址。該記錄只能設置為域名,不能設置為IP地址。
    • MX:郵件記錄(Mail eXchange),返回接收电子郵件的服務器地址。
    • CNAME:規範名稱記錄(Canonical Name),返回另一個域名,即當前查詢的域名是另一個域名的跳轉,詳見下文。
    • PTR:逆向查詢記錄(Pointer Record),只用於從IP地址查詢域名,詳見下文。

    DNS報文結構

    1. 事務 ID:DNS 報文的 ID 標識。對於請求報文和其對應的應答報文,該字段的值是相同的。通過它可以區分 DNS 應答報文是對哪個請求進行響應的。
    2. 標誌:DNS 報文中的標誌字段。
    3. 問題計數:DNS 查詢請求的數目。
    4. 回答資源記錄數:DNS 響應的數目。
    5. 權威名稱服務器計數:權威名稱服務器的數目。
    6. 附加資源記錄數:額外的記錄數目(權威名稱服務器對應 IP 地址的數目)

    DNS劫持與HTTP劫持

    通過上面的講解,我們都知道了,DNS 完成了一次域名到 IP 的映射查詢,當你在訪問 www.egsec.cn 時,能正確返回給你 我網站首頁的 ip。

    但如果此時 DNS 解析出現了一些問題,當你想要訪問 www.egsec.cn 時,卻返回給你 www.baidu.com 的ip,這就是我們常說的 DNS 劫持。

    與之容易混淆的有 HTTP 劫持。

    什麼是 HTTP 劫持?

    你一定見過當你在訪問 某個網站時,右下角也突然彈出了一個扎眼的廣告彈窗。這就是 HTTP 劫持。

    藉助別人文章里的例子,它們倆的區別就好比是

    • DNS劫持是你想去機場的時候,把你給丟到火車站。
    • HTTP劫持是你去機場途中,有人給你塞小廣告。

    DNS劫持 是如何產生的?

    下面大概說幾種DNS劫持方法:

    1.本機DNS劫持

    攻擊者通過某些手段使用戶的計算機感染上木馬病毒,或者惡意軟件之後,惡意修改本地DNS配置,比如修改本地hosts文件,緩存等

    2. 路由DNS劫持

    很多用戶默認路由器的默認密碼,攻擊者可以侵入到路由管理員賬號中,修改路由器的默認配置

    3.攻擊DNS服務器

    直接攻擊DNS服務器,例如對DNS服務器進行DDOS攻擊,可以是DNS服務器宕機,出現異常請求,還可以利用某些手段感染dns服務器的緩存,使給用戶返回來的是惡意的ip地址

    如何在本地查詢 DNS 解析結果?

    nslookup命令:

    命令格式:nslookup [查詢的域名] [指定DNS服務器]

    你也可以指定公網的域名服務器進行查詢,比如常見的 114.114.114.114

    手動清理DNS緩存

    MacOS:

    sudo dscacheutil -flushcache
    $ sudo killall -HUP mDNSResponder
    

    Windows:

    $ ipconfig /flushdns
    

    Linux:

    使用NSCD的DNS緩存
    $ sudo /etc/init.d/nscd restart
    
    # 服務器或者路由器使用DNSMASQ
    $ sudo dnsmasq restart
    

      

    DNS詳解篇完

    轉發請註明出處(EG Blog:blog.egsec.cn),謝謝!

     

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※教你寫出一流的銷售文案?