SSH伺服器

介紹

​​​​1. 有加密
​​​​2. 預設戶號 22

安裝方式

​​​​apt install openssh-server (預設已安裝)

查詢伺服器狀態

​​​​1. systemctl status sshd  :查詢狀態
​​​​2. systemctl start sshd   :啟動伺服器
​​​​3. systemctl stop sshd    :停止伺服器
​​​​4. systemctl enable sshd  :開啟開機自啟動
​​​​5. systemctl disable sshd :關閉開機自啟動
​​​​6. systemctl restart sshd :重新啟動(會中斷)
​​​​7. systemctl reload sshd  :重新加載(不會中斷)

使用

​​​​ubuntu1~$ ssh user@ubuntu2位置

預設不讓使用root登入
需要修改SSH伺服器配置檔(/etc/ssh/sshd_config)

  1. ubuntu2~#vim sshd_config (要使用root權限)
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  2. 修改要重啟伺服器
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

無密碼登入(Root登入步驟一樣)

  1. ubuntu1~$ ssh-keygen (產生公鑰私鑰)

    放置在/home/user/.ssh

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  2. ubuntu1~$ ssh-copy-id user@ubuntu2IP位置

    將公鑰複製到ubuntu2

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  3. ubuntu1~$ ssh user@ubuntu2位置

    登入ubuntu2

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

到ubuntu2執行指令

將指令串接在後面

ubuntu1~$ ssh user@ubuntu2 "pwd"

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

ubuntu1~$ ssh user@ubuntu2 "cd /tmp && pwd"
Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

複製 (sftp)

複製檔案

  1. ubuntu1:~$ scp file user@ubuntu2:/tmp

    將file檔案傳送到ubuntu2的tmp資料夾下

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

    查看ubuntu2
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

  2. ubuntu1:~$ scp user@ubuntu2:/tmp/file .

    將ubuntu2下的tmp資料夾裡的file傳送到本地端

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

複製資料夾

  1. ubuntu1:~$ scp -r test user@ubuntu2:/tmp

    將test資料夾傳送到ubuntu2的tmp資料夾下

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

    查看ubuntu2
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

    參數 -r:遞迴複製

  2. ubuntu1:~$ scp -r user@ubuntu2:/tmp/test .

    將ubuntu2下的tmp資料夾裡的test資料夾傳送到本地端

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

    參數 -r:遞迴複製

NFS Server

​​​​使得 Linux 之間可以共享資料夾

伺服端

  1. ubuntu1:~$ sudo apt install -y nfs-kernel-server

    安裝伺服端

  2. 建立資料夾並產生四個檔案
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  3. 更改資料夾擁有者
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  4. 修改配置檔 /etc/exports,加入下列程式碼
    ​​​​/nfs-server *(rw,sync,no_subtree_check,all_squash)
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  5. 重新啟動
    ​​​​ubuntu1:~# systemctl restart nfs-kernel-server
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

客戶端

  1. ubuntu2:~$sudo apt install nfs-common -y

    安裝客戶端

  2. ubuntu2:~#mkdir /nfs-client

    建立資料夾

  3. 將遠端的資料夾掛載到本地端的資料夾

    mount -t nfs -o rw,resvport ubuntu1:/nfs-server /nfs-client

  4. 查看客戶端資料夾是否有四個檔案
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

取消連結
ubuntu2:~#umount /nfs-client (要離開nfs-client資料夾)

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

使用USB

插入USB後查看掛載點

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

修改USB掛載點

  1. ubuntu1:~#mkdir /myusb

    建立新的資料夾當USB的掛載點

  2. 將USB掛載到myusb資料夾上
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

新增硬碟

  1. 先檢查新加入的硬碟
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  2. 磁碟切割
    1. ubuntu1:~# fdisk /dev/sdb
      Image Not Showing Possible Reasons
      • The image was uploaded to a note which you don't have access to
      • The note which the image was originally uploaded to has been deleted
      Learn More →
    2. 輸入n (新增分區)
      Image Not Showing Possible Reasons
      • The image was uploaded to a note which you don't have access to
      • The note which the image was originally uploaded to has been deleted
      Learn More →
    3. 輸入p (選擇主要分割區,皆使用預設)
      Image Not Showing Possible Reasons
      • The image was uploaded to a note which you don't have access to
      • The note which the image was originally uploaded to has been deleted
      Learn More →
    4. 輸入w (寫入設定)
      Image Not Showing Possible Reasons
      • The image was uploaded to a note which you don't have access to
      • The note which the image was originally uploaded to has been deleted
      Learn More →
  3. 格式化硬碟
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  4. 建立要掛載的資料夾

    ubuntu1:~# mkdir /mydisk

  5. 將sdb1掛載到mydisk資料夾上,就可以使用

    ubuntu1:~#mount /dev/sdb1 /mydisk

  6. 檢查掛載是否成功
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  7. 查詢新增硬碟的UUID
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  8. 編輯/etc/fstab
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →
  9. 重開機
  10. 檢查是否有自動掛載到mydisk資料夾上
    Image Not Showing Possible Reasons
    • The image was uploaded to a note which you don't have access to
    • The note which the image was originally uploaded to has been deleted
    Learn More →

存儲空間

1. lsblk

列出系統的塊設備(block devices),主要用於查看磁碟、分區和掛載信息

image

2. df

顯示文件系統的的可用空間、已用空間及總大小,還提供已掛載設備的信息

​​​​常用參數:
​​​​-h:以常見格式顯示大小(如 GB、MB)
​​​​-T:顯示文件系統類型
​​​​-i:顯示 inode 使用情況

image

Note

僅顯示出某個欄位 (腳本程式常用)
image
將指令存儲成變數 (腳本程式常用)
image
image

Important

正則表達式:

  1. $ 匹配字符串的結尾
    image
  2. ^ 匹配字符串的開頭
    image

3. du

顯示目錄或文件的大小

​​​​常用參數:
​​​​-h:以常見格式顯示大小(如 GB、MB)        
​​​​-s:僅顯示總大小

image

4. dstat

監控磁碟讀寫狀況 (預設沒有安裝)

​​​​常用參數:
​​​​-c:顯示 CPU 使用率
​​​​-n:顯示網絡流量
​​​​-d:顯示磁碟的讀寫數據

image

5. iotop

監控磁碟I/O活動(預設沒有安裝)

​​​​數據解析:
​​​​Total DISK READ/WRITE:顯示整體系統的磁碟讀寫速度
​​​​USER:運行進程的用戶
​​​​DISK READ/WRITE:該進程的磁碟讀取/寫入速率。
​​​​IO%:進程的 I/O 使用率

image

MariaDB

安裝流程

伺服端

1. 安裝金鑰

  1. 安裝apt-transport-https和curl

    ubuntu1:~$ sudo apt install apt-transport-https curl

  2. 建立資料夾

    ubuntu1:~$ sudo mkdir -p /etc/apt/keyrings

  3. 下載金鑰

    sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'

2. 加入儲存庫

ubuntu1:~# vim /etc/apt/sources.list.d/mariadb.sources,加入下列程式碼

# MariaDB 11.1 repository list - created 2023-11-08 06:16 UTC # https://mariadb.org/download/ X-Repolib-Name: MariaDB Types: deb # deb.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details. # URIs: https://deb.mariadb.org/11.1/ubuntu URIs: https://ftp.ubuntu-tw.org/mirror/mariadb/repo/11.7.1/ubuntu Suites: jammy Components: main main/debug Signed-By: /etc/apt/keyrings/mariadb-keyring.pgp

image

3. 安裝 MariaDB Server

  1. 安裝MariaDB

    ubuntu1:~$ sudo apt install mariadb-server

  2. 檢查伺服器狀態

    ubuntu1:~$ systemctl status mariadb

  3. 初始化MariaDB

    1. ubuntu1:~# mysql_secure_installation
      image

    2. 預設MariaDB沒有密碼,直接按enter就好了
      image

    3. 沒有強制使用,輸入 n。
      image

    4. 修改資料庫root帳號密碼,輸入y
      image

    5. 輸入root密碼
      image

    6. 移除匿名帳號,輸入y
      image

    7. 不允許遠端使用root帳號登入,輸入n
      image

    8. 移除測試資料庫與帳號,輸入y
      image

    9. 重新載入權限設定,輸入y
      image

  4. 登入MariaDB
    image

  5. 編輯/etc/mysql/mariadb.conf.d/50-server.cnf,將bind-address=127.0.0.1改成bind-address=0.0.0.0,使得所有人都可以連線
    image

  6. 重啟MariaDB伺服器

    ubuntu1:~$ systemctl restart mariadb

  7. 新增資料庫權限

    ​​​​GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'user' WITH GRANT OPTION;

    image

  8. 更新系統權限表

    ​​​​FLUSH PRIVILEGES;

    image

  9. 關閉防火牆,並且設為開機不自啟動
    image

客戶端

1. 安裝MariaDB Client

​​​​ubuntu2:~$ sudo apt install mysql-client

2. 登入MariaDB

image

使用

  1. 顯示目前有的資料庫
    image
  2. 創建新的資料庫

    create database 資料庫名稱;
    image

  3. 使用資料庫

    use 資料庫名稱;
    image

  4. 顯示目前有的資料表
    image
  5. 創建資料表

    create table 資料表名稱(資料表欄位1,資料表欄位2,);
    image

  6. 加入資料到資料表中

    insert into 資料表名稱(資料表欄位1,資料表欄位2) values (欄位1值,欄位2值);
    image

  7. 顯示資料表中的資料

    select 欄位1,欄位2 from 資料表名稱;
    image
    select 欄位1,欄位2 from 資料表名稱 where 欄位="搜尋目標";
    image

  8. 更新資料表中的資料

    update 資料表名稱 set 欄位="更改的值" where 欄位="更改的目標";
    image

連結 (捷徑)

硬連結

​​​​硬連結是一個直接指向文件數據塊的條目

特性

​​​​1. 硬連結不是指向文件路徑,而是直接指向文件的數據塊
​​​​2. 即使目標文件被刪除,硬連結仍然有效,因為數據仍保存在磁碟中(除非所有指向該數據的硬連結都被刪除)
​​​​3. 只能在同一個文件系統中創建,不能跨分區
​​​​4. 不能指向目錄

ubuntu1:~$ ln 檔名 硬連結檔名

image

符號連結

​​​​符號連結是一個類似於快捷方式的文件。它指向另一個文件或目錄的路徑,而不是數據本身

特性

​​​​1. 符號連結是一個獨立的文件,存儲的是目標文件的路徑。
​​​​2. 如果目標文件被刪除或移動,符號連結會失效(變成“斷開的連結”)。
​​​​3. 可以跨文件系統創建(目標和連結可以位於不同的磁碟分區)。
​​​​4. 可以指向文件或目錄。

ubuntu1:~$ ln -s 檔名 符號連結檔名

image

兩者比較

特性 符號連結 (Symbolic Link) 硬連結 (Hard Link)
概念 指向文件的路徑 指向文件的數據
是否可以指向目錄 可以 不可以
跨磁碟分割區 支持 不支持
目標文件刪除影響 連結失效(斷開連結) 不受影響(數據仍存在)
文件系統inode 使用新的 inode 與原始文件共享同一個 inode

inode

用於描述每個文件和目錄的元數據(metadata),每個文件或目錄都對應著一個唯一的 inode,即使檔案內容相同inode仍不一樣,包含以下內容:

  1. 文件屬性:
  • 文件大小
  • 文件類型(普通文件、目錄、符號連結等)
  • 文件的許可權(如 rwx 權限)
  • 所有者(用戶 ID 和組 ID)
  1. 數據位置:
  • 指向存儲數據塊的指針(即文件的實際數據位置)

Curl

安裝

​​​​ubuntu1:~$ sudo apt install curl

介紹

  1. 是一種文字版的瀏覽器,可將網頁抓回來(以html格式回傳)
  2. 可用於測試網頁
    1. 回傳值為0,網頁正常
      image
    2. 回傳值為非0,網頁不正常(-connect-timeout 秒數:指定執行秒數結束)
      image

Apache 伺服器

安裝伺服器與網頁管理工具

​​​​ubuntu1:~$sudo apt -y install apache2 apache2-utils

確認伺服器狀態

ubuntu1:~$ systemctl status apache2
image
使用ubuntu1的IP嘗試連接
image

加密網頁

  1. 安裝apache2-utils
    ​​​​ubuntu1:~$ sudo apt-get install apache2-utils
    
  2. 產生htpasswd (第一次安裝需要加 -c 產生密碼檔)
    ​​​​ubuntu1:~$ sudo htpasswd -c /etc/apache2/.htpasswd 使用者名稱
    
  3. 設定使用者密碼
    image
  4. 設置第二位使用者 (不需要加 -c 產生密碼檔)
    ​​​​ubuntu1:~$ sudo htpasswd /etc/apache2/.htpasswd 使用者名稱
    
    image
  5. 到 /var/www/html/sec 產生要加密的網頁
    ​​​​ubuntu1:/var/www/html/sec# echo "This is a private webpage" > index.html
    
  6. 修改Apache virtual host設定檔 (預設在 /etc/apache2/sites-enabled/000-default.conf )
    ​​​​<Directory "/var/www/html/sec">
    ​​​​AuthType Basic
    ​​​​AuthName "You need to login"
    ​​​​AuthUserFile /etc/apache2/.htpasswd
    ​​​​Require valid-user
    ​​​​</Directory>
    
    image
  7. 重新啟動 Apache2 伺服器
    ​​​​ubuntu1:~# systemctl restart apache2
    
  8. 確認網頁是否需要密碼驗證
    image

Caution

查看/etc/apache2/.htpasswd 可以知道加入了幾個使用者
密碼有加密
image

啟用UserDir

  1. 啟用userdir功能
    ubuntu1:~$ sudo a2enmod userdir
  2. 編輯 /etc/apache2/mods-enabled/userdir.conf ,將內容修改成下列程式碼
    ​​​​<IfModule mod_userdir.c>
    ​​​​    UserDir public_html
    ​​​​    UserDir disabled root
    ​​​​    <Directory /home/*/public_html>
    ​	AllowOverride All
    ​	Options MultiViews Indexes SymLinksIfOwnerMatch
    ​	<Limit GET POST OPTIONS>
    ​	    Require all granted
    ​	</Limit>
    ​	<LimitExcept GET POST OPTIONS>
    ​		Require all denied
    ​	</LimitExcept>
    ​​​​    </Directory>
    ​​​​</IfModule>
    
  3. 重新啟動 Apache 伺服器
    ubuntu1:~$ systemctl restart apache2
  4. 建立 public_html 目錄,在 index.html 裡加入內容
    image
  5. 因為 public_html 放置在各個使用者的家目錄裡,所以需要將使用者的目錄權限修改,讓所有人都可以進行訪問
    image
  6. 確認網頁
    image
    image

設置虛擬主機(Virtual Hosts)

  1. /var/www中建立兩個不同網站的家目錄 www-a-comwww-b-com
  2. 確認 /var/www 是否為所有人都可以進行訪問
    image
  3. 在各自網站的家目錄中建立 index.html
    image
  4. /etc/apache2/sites-available 中建立新的虛擬主機文件
    1. www-a-com:
      ubuntu1:~# vim /etc/apache2/sites-available/www-a-com.conf
      加入下列程式碼
      ​​​​​​​​<VirtualHost *:80>
      ​​​​​​​​    ServerAdmin admin@www.a.com
      ​​​​​​​​    ServerName a.com
      ​​​​​​​​    ServerAlias www.a.com
      ​​​​​​​​    DocumentRoot /var/www/www-a-com
      ​​​​​​​​    ErrorLog ${APACHE_LOG_DIR}/error.log
      ​​​​​​​​    CustomLog ${APACHE_LOG_DIR}/access.log combined
      ​​​​​​​​</VirtualHost>
      
    2. www-b-com:
      ubuntu1:~# vim /etc/apache2/sites-available/www-b-com.conf
      加入下列程式碼
      ​​​​​​​​<VirtualHost *:80>
      ​​​​​​​​    ServerAdmin admin@www.b.com
      ​​​​​​​​    ServerName b.com
      ​​​​​​​​    ServerAlias www.b.com
      ​​​​​​​​    DocumentRoot /var/www/www-b-com
      ​​​​​​​​    ErrorLog ${APACHE_LOG_DIR}/error.log
      ​​​​​​​​    CustomLog ${APACHE_LOG_DIR}/access.log combined
      ​​​​​​​​</VirtualHost>
      
  5. 將下列加入 Windows 電腦中的 C:\Windows\System32\drivers\etc\hosts
    ​​​​192.168.44.140 www.a.com
    ​​​​192.168.44.140 www.b.com
    
  6. 啟動新增的虛擬主機文件
    ubuntu1:~# a2ensite www-a-com.conf
    ubuntu1:~# a2ensite www-b-com.conf
  7. 重新載入伺服器
    ubuntu1:~# systemctl reload apache2
  8. 確認網頁
    image
    image

查看伺服器連線紀錄

連線紀錄放置在/var/log/apache2/access.log
image

管理範例

​​​​使用:
​​​​grep:篩選符合條件的行
​​​​awk:對文本進行更靈活的處理和過濾
​​​​sort:排序文件
​​​​uniq:處理重複數據的工具
​​​​
​​​​查看使用 Firefox 瀏覽器進行訪問的IP和作業系統

image

PHP 伺服器 (動態網頁)

安裝

  1. 增加 PHP 套件庫來源

    ubuntu1:~$ sudo apt install software-properties-common

  2. 新增 PHP 8 的 PPA 來源

    ubuntu1:~$ sudo add-apt-repository ppa:ondrej/php

  3. 更新 apt 來源

    ubuntu1:~$ sudo apt update

  4. 安裝 PHP 相關套件
    1. ubuntu1:~$ sudo apt install php8.1 libapache2-mod-php8.1 php8.1-gd php8.1-mysql php8.1-curl php8.1-mbstring php8.1-intl -y
    2. ubuntu1:~$ sudo apt install php8.1-gmp php8.1-bcmath php8.1-imagick php8.1-xml php8.1-zip -y
  5. 啟用 Apache 的 PHP 模組

    ubuntu1:~$ sudo a2enmod php8.1

  6. 重新啟動 Apache 伺服器

    ubuntu1:~$ sudo systemctl restart apache2

  7. 確認 Apache 伺服器狀態
    image
  8. 測試 PHP 版本資訊
    1. 編輯 /var/www/html/info.php

      ubuntu1:~$ sudo vim /var/www/html/info.php
      image

    2. 確認網頁

      image

  9. 編輯連結資料庫測試網頁
    1. 將下列程式碼加入/var/www/html/test.php
      ​​​​​​​​<?php
      ​​​​​​​​$servername="192.168.44.140";
      ​​​​​​​​$username="root";    
      ​​​​​​​​$password="user";
      ​​​​​​​​$dbname="testdb";
      
      ​​​​​​​​$conn = new mysqli($servername, $username, $password, $dbname);
      
      ​​​​​​​​if($conn->connect_error){
      ​​​​​​​​    die("connection failed: " . $conn->connect_error);
      ​​​​​​​​}
      ​​​​​​​​else{
      ​​​​​​​​    echo "connect OK!" . "<br>";
      ​​​​​​​​}
      
      ​​​​​​​​$sql="select name,phone from addrbook";
      ​​​​​​​​$result=$conn->query($sql);
      
      ​​​​​​​​if($result->num_rows>0){
      ​​​​​​​​    while($row=$result->fetch_assoc()){
      ​​​​​​​​        echo "name: " . $row["name"] . "\tphone: " . $row["phone"] . "<br>";
      ​​​​​​​​    }
      ​​​​​​​​} else {
      ​​​​​​​​    echo "0 record";
      ​​​​​​​​}
      ​​​​​​​​?>
      
    2. 確認測試網頁是否連接到資料庫
      image

Python flask

  1. ubuntu1:~$ sudo apt install python3 python3-pip
  2. ubuntu1:~$ sudo pip3 install flask
  3. ubuntu1:~$ vim test.py
    加入下列程式碼
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
 return '<h2>Hello, World!</h2>'

if __name__ == '__main__':
 app.run(host='0.0.0.0', port=3000, debug=True)
  1. ubuntu1:~$ python3 test.py
    image
  2. 確認測試網頁
    image

Tree

介紹: 以樹狀結構顯示目錄和文件的工具
安裝: ubuntu1:~$ sudo apt install tree
使用:
image

Ngrok

用於將本地伺服器公開到互聯網上

安裝

  1. 通過以下命令使用 Apt 安裝 ngrok:
    ​​​​ubuntu1:~# curl -sSL https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
    ​| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
    ​&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
    ​| sudo tee /etc/apt/sources.list.d/ngrok.list \
    ​&& sudo apt update \
    ​&& sudo apt install ngrok
    
  2. 將authtoken添加到預設的 ngrok.yml 配置文件中
    ​​​​ubuntu1:~# ngrok config add-authtoken 2nmQc5kaIFBLMwY4dcEtVYZqCMN_dDfDuHSFhnxRJiNvDZxC
    

使用

​​​​ngrok http http://localhost:80 (使用 Apache2 的端口,也可使用別的)

image
image

網頁加密 (密碼長度要大於8個字元)

ubuntu1:~# ngrok http 80 --basic-auth "使用者名稱1:密碼1" --basic-auth "使用者名稱2:密碼2"

image

帳號管理

Root

家目錄:

image

一般使用者

家目錄 /home/使用者名稱 :

image

切換使用者

  1. ubuntu1:~# su 使用者名稱

    不會切換到使用者家目錄

  2. ubuntu1:~# su - 使用者名稱

    會切換到使用者家目錄

新增一般使用者

1.ubuntu1:~# useradd -m 使用者名稱 -s 使用的shell (腳本程式常用)

​​​​常見參數:
​​​​1. -m: 自動創建使用者的家目錄 
​​​​2. -s: 指定使用者所使用的shell
​​​​3. -g: 指定使用者的主要群組 (預設為創建與使用者名稱相同的群組)
​​​​4. -G: 指定使用者的附加群組 
​​​​5. -u: 指定使用者的UID (預設為現有 UID +1)
​​​​6. -d: 指定使用者家目錄

2.ubuntu1:~# adduser 使用者名稱

​​​​以問答的方式新增

image

新增群組

ubuntu1:~# groupadd 群組名稱

刪除一般使用者

ubuntu1:~# userdel 使用者名稱

刪除群組

ubuntu1:~# groupdel 群組名稱

兩者比較

root 一般使用者
帳號名稱 root 建立時自訂
家目錄位置 /root /home/使用者名稱
對檔案的權限 可讀取、修改系統中所有檔案及目錄的內容及權限 僅能讀取、修改具有權限的檔案及目錄
執行指令的權限 可執行系統中所有指令 僅能執行具有權限的指令
UID UID = 0 從1000開始 (預設 user UID = 1000)
GID GID = 0 從1000開始 (預設 user GID = 1000)

查看一般使用者可執行的管理員指令

ubuntu1:~$sudo -l
image

存儲帳號訊息的位置

存放在/etc/passwd
所有人都可以讀取
image

使用者名稱:密碼(不存放在這):UID:GID:comment:家目錄:使用的shell

存儲群組訊息的位置

存放在/etc/group
所有人都可以讀取
image

暫時停止使用者登入

修改/etc/passwd中的使用者所使用的shell,修改為/usr/sbin/nologin
image
即可停止帳號登入
image

查詢使用者UID、GID、GROUPS

ubuntu1:~$ id 使用者名稱
image

希望新的使用者也可以使用管理者權限

將新的使用者的附屬群組加入 sudo

存儲密碼訊息的位置

僅管理員可以讀取
存放在/etc/shadow (有加密)

SAMBA 伺服器

​​​​Linux 與 Windows 之間共享資料夾

安裝 Samba 及其相關組件

ubuntu1:~$sudo apt install samba samba-common -y

設定

目標:
  資料夾1 => 主要測試所有人都可以直接進入不需要打帳號密碼即可存取
  資料夾2 => 主要測試需要輸入ubuntu 主機設定的sambs 帳號密碼才可以進入存取
  1. 到根目錄下建立要進行分享的資料夾

    ​​​​ubuntu1:/# mkdir 資料夾名稱1
    ​​​​ubuntu1:/# mkdir 資料夾名稱2
    
  2. 確認分享的資料夾權限為777

    ​​​​ubuntu1:/# ls -ld 資料夾名稱
    

    image

  3. 建立本機測試帳號

    ​​​​ubuntu1:/# useradd 使用者名稱1
    ​​​​ubuntu1:/# useradd 使用者名稱2
    
  4. 建立samba密碼

    ​​​​ubuntu1:/# smbpasswd –a  使用者名稱1
    ​​​​ubuntu1:/# smbpasswd –a  使用者名稱2
    

    image

  5. 編輯伺服器配置檔,配置檔位於 /etc/samba/smb.conf,加入下列程式碼

    ​​​​[sharea]
    ​​​​  path = 資料夾1位置    
    ​​​​  comment = guest access folder   
    ​​​​  writable = yes  
    ​​​​  browseable = yes  
    ​​​​  guest ok = yes   
    ​​​​
    ​​​​[shareb]
    ​​​​  path = 資料夾2位置 
    ​​​​  comment =  have auth can access  
    ​​​​  writable = yes  
    ​​​​  browseable = yes  
    ​​​​  valid users=使用者名稱1,使用者名稱2
    ​​​​  write list=使用者名稱1,使用者名稱2
    
  6. 檢查 Samba 配置文件是否正確性

    ​​​​ubuntu1~# testparm -s
    

    image

  7. 重啟 Samba 伺服器
    ubuntu1:~# systemctl restart smbd

  8. Windows 檔案總管搜尋 \\UbuntuIP 即可看到設定分享的資料夾
    image

  9. 測試在sharea中建立檔案
    image
    在 Ubuntu 中也可以看到該檔案
    image

  10. 測試在shareb中建立檔案
    進入 shareb 需要進行身分驗證
    image

cmd: net use * /delete

Linux 與 Linux 之間共享資料夾

客戶端安裝

  1. 安裝 SambaCliebt
    ubuntu2:~# apt install smbclient -y
  2. 查看 Samba 伺服器共享的資料夾
    ubuntu2:~# smbclient --list=Samba Server IP --user=使用者名稱
    image
  3. 連接共享資料夾
    ubuntu2:~$ smbclient --user=使用者名稱 //Samba Server IP/要連接的資料夾
    image

上傳檔案

smb: \> put 檔案
image

下載檔案

smb: \> get 檔案
image

架設 PPTP Server

安裝

ubuntu1:~#apt install pptpd

設定PPTPD Server

  1. Ubunut:
    1. 允許內網中的客戶端通過 ens33 網卡訪問外網
      ubuntu1:~# iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
    2. 編輯 /etc/ppp/chap-secrets,加入以下內容
      ​​​​​​​​"帳號" * "密碼" *
    3. 編輯 /etc/pptpd.conf ,設定要分配的 IP
      ​​​​​​​​localip 192.168.34.1 ​​​​​​​​remoteip 192.168.34.2-200
  2. Windows:
    1. 在「網路和共用中心」,按下「設定新的連線或網路」
      image
    2. 選擇連線到工作地點
      image
    3. 選擇使用我的網際網路連線
      image
    4. 接著要填入要連線的 VPN Server IP 192.168.44.132
      image
    5. 選擇剛建立的項目,按下連線
      image
    6. 輸入帳號密碼
      image

檢視系統資訊

查看線上的使用者

  1. w

    ​​​​pts: 使用ssh連線登入的   
    ​​​​tty: 本地登錄伺服器
    

    image

    ​​​​第一行:
    ​​​​    當前時間:16:08:59
    ​​​​    系統運行時間:up 1:14
    ​​​​    登入用戶數:4 users
    ​​​​    系統負載:
    ​​​​        1. 1分鐘CPU平均負載:0.00
    ​​​​        2. 5分鐘CPU平均負載:0.06
    ​​​​        3. 15分鐘CPU平均負載:0.14
    ​​​​表格部分:
    ​​​​    USER:登入用戶名
    ​​​​    TTY:終端名稱(如 pts/0 表示虛擬終端)
    ​​​​    FROM:用戶的來源 IP 或主機名
    ​​​​    LOGIN@:用戶登入時間
    ​​​​    IDLE:用戶閒置時間
    ​​​​    JCPU:該終端執行的所有進程耗費的 CPU 時間
    ​​​​    PCPU:當前進程耗費的 CPU 時間
    ​​​​    WHAT:用戶正在執行的命令
    

    增加負載查看w輸出變化

    ubuntu1:~$ dd if=/dev/zero of=/dev/null
    image

  2. who
    簡單地檢查用戶登入狀態
    image

  3. last
    查看曾登入此系統之使用者
    image

顯示記憶體使用狀態

free

常用參數:

​​​​-h :以易讀格式顯示內存(例如 KB, MB, GB,自動選擇合適單位)
​​​​-t :顯示記憶體的總量(包括內存和交換區)
​​​​-s :每隔指定秒數持續顯示內存狀態
​​​​-c :限制 -s 的輸出次數

image

查看系統資源的使用狀況

  1. top
    能顯示系統當前運行的process、CPU 和記憶體使用情況
    image
    ​​​​常用快捷鍵:
    ​​​​    u: 僅顯示指定使用者的process
    ​​​​    k: 終止指定進程(需要輸入 PID)。
    

網路實驗

1. 由一台 Ubuntu 當路由器,連接另外兩客戶端 (客戶端需手動設置IP)

​​​​使得 H1 和 H2 雖然在不同的區域網,卻可以互相傳送封包

架構圖

Router1

設定

  1. Router

    1. 新增兩張網路卡,並設定不同的區域網
      image
      image
    2. 確認兩張網路卡名稱
      ​​​​​​​​ens33: NAT ​​​​​​​​ens37: LAN10 ​​​​​​​​ens38 :LAN20
      image
    3. 設置 ens37 IP 為192.168.10.254
      ​​​​​​​​R1:~# ip addr add 192.168.10.254/24 dev ens37

      也可使用圖形化介面進行設置

      image

    4. 設置 ens38 IP 為192.168.20.254
      ​​​​​​​​R1:~# ip addr add 192.168.20.254/24 dev ens38

      也可使用圖形化介面進行設置

      image

    5. 確認 IP 設置
      image
    6. 開啟路由器
      ​​​​​​​​R1:~# echo 1 > /proc/sys/net/ipv4/ip_forward

    修改配置檔固定網路卡IP

    /etc/netplan/01-network-manager-all.yaml加入下列程式碼

    # Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: true ens37: addresses: - 192.168.10.254/24 ens38: addresses: - 192.168.20.254/24

    使用R1:~# netplan try 檢查配置檔是否有錯誤
    image
    使用R1:~# netplan apply 應用修改過後的配置
    image

    修改配置檔固定路由功能預設開啟

    /etc/sysctl.conf 中,找到net.ipv4.ip_forward=1,將開頭的#刪除
    image
    使用R1:~# sysctl -p /etc/sysctl.conf 應用修改過後的配置

  2. H1

    1. 將網路卡設置為區域網:LAN10
      image
    2. 確認網路卡名稱
      ​​​​​​​​H1:~# ifconfig
      image
    3. 手動設置 IP 為192.168.10.1
      ​​​​​​​​H1:~# ip addr add 192.168.10.1/24 dev ens33
    4. 手動設置預設路由為192.168.10.254
      ​​​​​​​​H1:~# ip route add default via 192.168.10.254
    5. 確認 IP 和預設 Router 設置正確
      ​​​​​​​​H1:~# ip route show
      image

    也可使用圖形化介面進行設置

    image

    修改配置檔固定網路卡IP

    /etc/netplan/01-network-manager-all.yaml加入下列程式碼

    # Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: ens33: addresses: - 192.168.10.1/24 routes: - to: default via: 192.168.10.254

    使用H1:~# netplan try 檢查配置檔是否有錯誤
    image
    使用H1:~# netplan apply 應用修改過後的配置
    image

  3. H2

    1. 將網路卡設置為區域網:LAN20
      image
    2. 確認網路卡名稱
      ​​​​​​​​H2:~# ifconfig
      image
    3. 手動設置 IP 為192.168.20.1
      ​​​​​​​​H2:~# ip addr add 192.168.20.1/24 dev ens33
    4. 手動設置預設路由為192.168.20.254
      ​​​​​​​​H2:~# ip route add default via 192.168.20.254
    5. 確認 IP 和預設 Router 設置正確
      ​​​​​​​​H2:~# ip route show
      image

    也可使用圖形化介面進行設置

    image

    也可使用圖形化介面進行設置

    image

    修改配置檔固定網路卡IP

    /etc/netplan/01-network-manager-all.yaml加入下列程式碼

    # Let NetworkManager manage all devices on this system network: version: 2 renderer: NetworkManager ethernets: ens33: addresses: - 192.168.20.1/24 routes: - to: default via: 192.168.20.254

    使用H2:~# netplan try 檢查配置檔是否有錯誤
    image
    使用H2:~# netplan apply 應用修改過後的配置
    image

確認封包可以傳達

image

image

網路卡設置

  1. 清除網路卡ip , network mask等設定
    ifconfig 網路卡名稱 0
  2. 關閉網路卡
    ifconfig 網路卡名稱 down
  3. 啟動網路卡
    ifconfig 網路卡名稱 up

2. 由一台 Ubuntu 當路由器,連接另外兩台客戶端,加入DHCP Server ,使客戶端不需手動設置IP

​​​​使得 H1 和 H2 雖然在不同的區域網,卻可以互相傳送封包

架構圖

Router1

設定

  1. Router
    1. 新增兩張網路卡,並設定不同的區域網
      image
      image

    2. 確認兩張網路卡名稱

      ​​​​​​​​ens33: NAT ​​​​​​​​ens37: LAN10 ​​​​​​​​ens38 :LAN20

      image

    3. 設置 ens37 IP 為192.168.10.254

      ​​​​​​​​R1:~# ip addr add 192.168.10.254/24 dev ens37

      也可使用圖形化介面進行設置

      image

    4. 設置 ens38 IP 為192.168.20.254

      ​​​​​​​​R1:~# ip addr add 192.168.20.254/24 dev ens38

      也可使用圖形化介面進行設置

      image

    5. 確認 IP 設置
      image

    6. 開啟路由器

      ​​​​​​​​R1:~# echo 1 > /proc/sys/net/ipv4/ip_forward

      修改配置檔固定路由功能預設開啟

      /etc/sysctl.conf 中,找到net.ipv4.ip_forward=1,將開頭的#刪除
      image
      使用R1:~# sysctl -p /etc/sysctl.conf 應用修改過後的配置

    7. 安裝 DHCP Server

      ​​​​​​​​R1:~# apt install isc-dhcp-server -y
    8. 進行原始的DHCP Server配置檔備份,檔案在/etc/dhcp/dhcpd.conf

      ​​​​​​​​R1:~# cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.backup
    9. 修改DHCP Server配置檔

      ​​​​​​​​R1:~# vim /etc/dhcp/dhcpd.conf

      加入下列程式碼:

      ​​​​​​​​subnet 192.168.10.0 netmask 255.255.255.0 { ​​​​​​​​ range 192.168.10.1 192.168.10.100; ​​​​​​​​ option subnet-mask 255.255.255.0; ​​​​​​​​ option routers 192.168.10.254; ​​​​​​​​ option broadcast-address 192.168.10.255; ​​​​​​​​ default-lease-time 600; ​​​​​​​​ max-lease-time 7200; ​​​​​​​​} ​​​​​​​​subnet 192.168.20.0 netmask 255.255.255.0 { ​​​​​​​​ range 192.168.20.1 192.168.20.100; ​​​​​​​​ option subnet-mask 255.255.255.0; ​​​​​​​​ option routers 192.168.20.254; ​​​​​​​​ option broadcast-address 192.168.20.255; ​​​​​​​​ default-lease-time 600; ​​​​​​​​ max-lease-time 7200; ​​​​​​​​}
    10. 重啟DHCP Server

      ​​​​​​​​R1:~# systemctl restart isc-dhcp-server
  2. H1
    未開啟網路卡連接時:
    image
    開啟網路卡連接時: (自動分配IP)
    image
  3. H2
    未開啟網路卡連接時:
    image
    開啟網路卡連接時: (自動分配IP)
    image

確認封包可以傳達

image
image

3. 由一台 Ubuntu 當路由器,連接另外兩台客戶端,一台在private network,另一台在public network,加入DHCP Server ,使客戶端不需手動設置IP

設置參考第二部分,僅Router需多加設定

架構圖

未命名

Router

  1. 允許內網(192.168.10.0/24)中的客戶端通過 ens38 網卡訪問外網
    ​​​​R1:~# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens38 -j MASQUERADE

查看封包

  1. 安裝 wireshark
    ​​​​R1:~# apt install wireshark-*
  2. 執行 wireshark
    ​​​​R1:~# wireshark
    image
  3. 檢查封包
    1. 抓取通過ens38網卡的封包
      H1傳送封包給H2
      image
      可以發現 Source 的 IP 被更改,保護(192.168.10.0/24)中的客戶端
      image
    2. 抓取通過ens37網卡的封包
      可以發現 Source 的 IP 沒有被更改
      image

4. 靜態路由拓樸

架構圖

1

設定

設置參考第二部分,使用DHCP ServerH1H2自動分配IP

  1. Router1:

    1. 設定ens37ens38 兩張網路卡IP
      image

    2. 確認路由功能開啟 (1為開啟狀態)
      R1:~# cat /proc/sys/net/ipv4/ip_forward
      image

    3. 查看路由表
      R1:~# route -n
      image

    4. 檢測R1H1之間的網路連通性
      H1:~# ping 192.168.10.254
      image
      H1:~# ping 12.1.1.1
      image

    5. 檢測H2R1之間的網路連通性,因為H2R1不在同個區域往內,所以需要經由R2將封包轉發到R1
      H2:~# ping 12.1.1.1
      image

      H2 和 R1 之間的網路不連通

      因為此時R1的路由表中並沒有可以到達192.168.20.0/24的紀錄,所以R1沒辦法回應H2,所以需要在R1的路由表中加入192.168.20.0/24 並將封包轉發給R2
      R1:~# ip route add 192.168.20.0/24 via 12.1.1.2
      再次查看路由表
      image

    6. 再次檢測H2R1之間的網路連通性
      H2:~# ping 12.1.1.1
      image

  2. Router2:

    1. 設定ens37ens38 兩張網路卡IP
      image

    2. 確認路由功能開啟 (1為開啟狀態)
      R2:~# cat /proc/sys/net/ipv4/ip_forward
      image

    3. 查看路由表
      R2:~# route -n
      image

    4. 檢測R2H2之間的網路連通性
      H2:~# ping 192.168.20.254
      image
      H2:~# ping 12.1.1.
      image

    5. 檢測H1R2之間的網路連通性,因為H1R2不在同個區域往內,所以需要經由R1將封包轉發到R2
      H1:~# ping 12.1.1.2
      image

      H1 和 R2 之間的網路不連通

      因為此時R2的路由表中並沒有可以到達192.168.10.0/24的紀錄,所以R2沒辦法回應H1,所以需要在R2的路由表中加入192.168.10.0/24 並將封包轉發給R1
      R2:~# ip route add 192.168.10.0/24 via 12.1.1.1
      再次查看路由表
      image

    6. 再次檢測H1R2之間的網路連通性
      H1:~# ping 12.1.1.2
      image

確認封包可以傳達

  1. H1
    H1:~#ping 192.168.10.254
    image
    H1:~#ping 12.1.1.1
    image
    H1:~#ping 12.1.1.2
    image
    H1:~#ping 192.168.20.254
    image
    H1:~#ping 192.168.20.1
    image
  2. H2
    H2:~#ping 192.168.20.254
    image
    H2:~#ping 12.1.1.2
    image
    H2:~#ping 12.1.1.1
    image
    H2:~#ping 192.168.10.254
    image
    H2:~#ping 192.168.10.1
    image

5. 靜態路由拓樸,一台在private network,另一台在public network,並使用DNAT,將外部請求引導到內部伺服器時使用

架構圖

未命名

設定

設置參考第二部分,使用DHCP ServerH1H2自動分配IP

  1. Router1:

    1. 設定ens37ens38 兩張網路卡IP
      image

    2. 確認路由功能開啟 (1為開啟狀態)
      R1:~# cat /proc/sys/net/ipv4/ip_forward
      image

    3. 查看路由表
      R1:~# route -n
      image

    4. 檢測R1H1之間的網路連通性
      H1:~# ping 192.168.10.254
      image
      H1:~# ping 12.1.1.1
      image

    5. 檢測H2R1之間的網路連通性,因為H2R1不在同個區域往內,所以需要經由R2將封包轉發到R1
      H2:~# ping 12.1.1.1
      image

      H2 和 R1 之間的網路不連通

      因為此時R1的路由表中並沒有可以到達192.168.20.0/24的紀錄,所以R1沒辦法回應H2,所以需要在R1的路由表中加入192.168.20.0/24 並將封包轉發給R2
      R1:~# ip route add 192.168.20.0/24 via 12.1.1.2
      再次查看路由表
      image

    6. 再次檢測H2R1之間的網路連通性
      H2:~# ping 12.1.1.1
      image

    7. 將通過 ens38的封包源地址轉換為 R1ens38 地址,去讓在私有網路裡的H1,也可以訪問公開網路
      R1:~# iptables -t nat -A POSTROUTING -o ens38 -j MASQUERADE
      image

    8. 將發往 12.1.1.1:80 的流量轉發到內部伺服器 192.168.10.1:80
      R1:~# iptables -t nat -A PREROUTING -p tcp -d 12.1.1.1 --dport 80 -j DNAT --to-destination 192.168.10.1:80
      image

  2. Router2:

    1. 設定ens33ens37 兩張網路卡IP
      image

    2. 確認路由功能開啟 (1為開啟狀態)
      R2:~# cat /proc/sys/net/ipv4/ip_forward
      image

    3. 查看路由表
      R2:~# route -n
      image

    4. 因為H1R2不在同個區域往內,所以無法連接
      image

Shell Script 程式設計

基礎指令與功能

  1. echo

    1. 表達特殊字元,如跳行、tab等
      • 無法表達特殊字元
        ​​​​​​​​​​​​ubuntu1:~$ echo "hi\n123"
        image
      • 表達特殊字元需加參數:-e
        ​​​​​​​​​​​​ubuntu1:~$ echo -e "hi\n123"
        image
    2. 查看上一個指令是否執行成功
      指令執行後,必定會回傳一個「結束狀態碼」
      1. 結束狀態碼為0: 指令正常結束
        image
      2. 結束狀態碼為非0: 指令錯誤或不正常結束
        image
  2. 環境變數
    ubuntu1:~$ echo $變數 印出變數

    1. HOME: 目前使用者的家目錄
      image

    2. IFS: 用來分隔欄位的字元清單 (預設為空白鍵)
      image

    3. PATH: 用分號分隔的一連串目錄,代表執行指令時的搜尋路徑清單
      image

      範例: 在PATH中加入新的路徑 (當前視窗有效)

      ubuntu1:~$ export PATH=$PATH:/home/user/shelltest ubuntu1:~/shelltest$ hello.sh

      image

      範例: 在PATH中加入新的路徑 (永久)

      修改配置檔/home/user/.bashrc,加入下列程式碼

      export PATH=$PATH:/home/user/shelltest

      重新加載

      ubuntu1:~$ source .bashrc or ubuntu1:~$ . .bashrc

      image

    4. USER: 目前使用者帳號名稱

    5. UID: 目前使用者的uid

    6. HISTFILE: 儲存下過的指令清單的檔案位置

      history

      顯示曾經用過的指令
      image
      使用:
      ubuntu1:~$ !11
      image

    7. RANDOM: 每次取得變數資料,都會給一個0到32767的亂數
      ubuntu1:~$ echo $RANDOM
      image

      常用搭配:

      1. md5sum:
        計算 MD5 哈希值
        ubuntu1:~$ echo 'hello world' | md5sum
        image
      2. cut
        提取部分內容
        ubuntu1:~$ echo 'hello world' | cut -c 1-5
        image
      3. 合併使用:
        產生固定長度的亂碼
        ubuntu1:~$ echo $RANDOM | md5sum | cut -c 1-5
        image

    env 或 set

    env顯示當前 shell 的所有環境變數及其值
    image
    set顯示當前 shell 的所有環境變數及其值,比env更詳細
    image

  3. 取得使用者輸入變數值
    read
    範例:

    ​​​​#!/usr/bin/bash ​​​​ ​​​​read -p "Enter your name: " name ​​​​echo "Welcome, $name!"

    image

  4. 單引號與雙引號

    • 單引號: 當文字內容不需特別解譯或是單純的一段文字時
    • 雙引號: 文字內容中若需要解譯變數(如$USER)以顯示變數的內容
      image
  5. 條件判斷: test

    1. 檔案相關測試
      ​​​​​​​​-d 檔案: 測試檔案是否為目錄? ​​​​​​​​-e 檔案: 測試檔案是否存在 ​​​​​​​​-r 檔案: 測試檔案是否可讀? ​​​​​​​​-w 檔案: 測試檔案是否可寫入? ​​​​​​​​-x 檔案: 測試檔案是否可執行? ​​​​​​​​-L 檔案: 測試檔案是否為連結(link) ?
    2. 字串測試
      ​​​​​​​​-z 字串: 測試字串長度是否為0(空字串)? ​​​​​​​​字串 = 字串: 測試等號左右邊字串是否相等? ​​​​​​​​字串 != 字串: 測試等號左右邊字串是否不相等?
      image
    3. 數值比較測試
      ​​​​​​​​n1 -eq n2 : 測試n1等於n2 ​​​​​​​​n1 -ne n2 : 測試n1不等於n2 ​​​​​​​​n1 -ge n2 : 測試n1大於等於n2 ​​​​​​​​n1 -gt n2 : 測試n1大於n2 ​​​​​​​​n1 -le n2 : 測試n1小於等於n2 ​​​​​​​​n1 -lt n2 : 測試n1小於n2
      image
  6. 接受命令列的參數
    利用$1 $2 $3等取得第一個、第二個、等三個等參數值

    ​​​​n1=$1 ​​​​n2=$2 ​​​​echo $n1 ​​​​echo $n2 ​​​​test $n1 -gt $n2 ​​​​echo $?

    image

    bash -x 用於執行腳本時顯示命令的執行過程

    image

  7. 判斷式

    ​​​​if test 條件 ​​​​then ​​​​ 結果為真執行的命令 ​​​​else ​​​​ 結果為假執行的命令 ​​​​fi

    image

  8. for迴圈

    ​​​​for 變數 in 資料集合 ​​​​do ​​​​ 要重複的指令 ​​​​done
    1. 印出1~10
      image
    2. 印出指定目錄下的所有檔案
      image
    3. 印出指定目錄下的子目錄
      image

範例

  1. 使用腳本安裝
    ​​​​#!/usr/bin/bash ​​​​if test $UID -ne 0 ​​​​then ​​​​ echo "change to root first" ​​​​ exit 0 ​​​​fi ​​​​ans=`dpkg -l | grep $1 | wc -l` ​​​​if test $ans -ne 0 ​​​​then ​​​​ echo "$1 has already been installed" ​​​​ exit 0 ​​​​fi ​​​​apt install apache2 -y 2>&1 > /dev/null ​​​​result=`echo $?` ​​​​if test $result -eq 0 ​​​​then ​​​​ echo "$1 has been installed successfully" ​​​​fi
    image

排程

格式

* * * * * 指令
星期
0-59 0-23 1-31 1-12 0-7 (0 = 星期日)

範例

  1. 1 * * * * 指令 每小時的第一分鐘執行一次
  2. * * * * * 指令 每時每分都執行一次
  3. */n * * * * 指令 每小時的第n分鐘執行一次
  4. 1 1 * * * 指令 每天的1點1分執行一次
  5. * 1 * * * 指令 每天1點的每分鐘執行一次
  6. 20 2 1,15 * * 指令 每月的1號和15號的2點20分執行一次
  7. 0 7,21 * * * 指令 每天的7點和21點 執行一次
  8. 0 1-4 * * * 指令 每天的1點到4點執行一次

編輯使用者的排程表

  1. ubuntu1:~# crontab -e
  2. 選擇2使用 vim
    image
  3. 加入範例程式*/1 * * * * date >> /tmp/mytime
    每1分鐘將最新的時間加入 /tmp/mytime
  4. 讀取 /tmp/mytime,使用 ubuntu1:~# tail -f /tmp/mytime ,即時的讀取新加入/tmp/mytime 的時間
    image

檢視目前排程的工作

ubuntu1:~# crontab -l
image

刪除排程的工作

ubuntu1:~# crontab -r
image

指定某個使用者

ubuntu1:~# crontab -u 使用者名稱

用於執行一次性任務 at

  1. 設定執行時間 at 時間
  2. 進入交互模式,輸入指令,輸入EOT或是ctrl + D後結束
    image

查看排程

ubuntu1:~# atq
image

刪除排程

ubuntu1:~$ atrm 工作編號
image

打包檔案

tar 指令的參數

  1. -c:建立一個新的 tar 檔
  2. -v:顯示運作過程的資訊
  3. -f:指定檔案名稱
  4. -z:呼叫 gzip 壓縮指令執行壓縮、解壓縮
  5. -j:呼叫 bzip2 壓縮指令執行壓縮、解壓縮
  6. -t:檢視壓縮檔案內容
  7. -x:解開 tar 檔

範例

  1. 壓縮: ubuntu1:~# tar -cvzf 打包後檔名 要打包的檔案
    image
    image
  2. 解壓縮: ubuntu1:~# tar -xvzf 要解壓縮的檔名
    image
    image

補充

dpkg -l

軟體套件管理程式
參數:-l 以清單方式呈現

netstat -tunlp

查詢網路狀態
參數:

  1. t:tcp
  2. u:udp
  3. n:not resolve
  4. l:listen
  5. p:process
0.0.0.0

意義:
1. 伺服器端:任意介面
2. 客戶端:任一個節點
3. 一般PC:尚未取得IP

touch file

產生一個名為file的空白檔案
image

touch a.txt

產生大量的空白檔
image

ubuntu2去代替IP位置

將ubuntu2IP加進配置檔裡
ubuntu1:~#vim /etc/hosts
image

Hydra
  1. 安裝Hydra
    ubuntu1:~$ sudo apt install hydra
  2. 建立一個常見帳號的文字檔或上網抓
  3. 建立一個常見密碼的文字檔或上網抓
    image
  4. 進行攻擊
    ubuntu1:~$ hydra -L user.txt -P passwd.txt ssh://ubuntu2
    image

參數:
1. -L:使用者帳號檔案來源
2. -P:使用者密碼檔案來源

當編輯檔案權限不夠

暫時提升權限 ubuntu1:~$ sudo bash -c 'echo hi > hi.htm'
image

在vim編輯器中顯示行數

在命令模式下輸入: set number
image

John the Ripper 進行密碼破解
  1. 先更新 apt ubuntu1:~$ sudo apt update
  2. 安裝snapd ubuntu1:~$ sudo apt install snapd
  3. 安裝John the Ripper ubuntu1:~$ sudo snap install john-the-ripper
  4. 安裝john ubuntu1:~$ sudo apt install john
  5. 準備一個密碼檔去破解
  6. /etc/passwd/etc/shadow 合併到mypasswd.txt
    ubuntu1:~# unshadow /etc/passwd /etc/shadow > mypasswd.txt
  7. 進行破解 ubuntu1:~# john --wordlist=準備的密碼檔 --format="crypt" mypasswd.txt
    image
使用腳本程式新增大量使用者範例
  1. 編輯 useradd.sh 加入下列程式碼
#!/usr/bin/bash
groupadd student
for user in user1 user2 user3
do
  useradd -g student -d /home/${user} ${user}
  echo "${user}:${user}" | chpasswd
  echo "${user} is added"
done
  1. useradd.sh 新增可執行權限
    ubuntu1:~$ chmod +x useradd.sh
  2. 執行 useradd.sh
    ubuntu1:~# ./useradd.sh
    image
查看目錄的權限

ubntu1:~$ ls -ld 目錄名稱 查看目錄的權限
ubntu1:~$ ls -l 目錄名稱 查看目錄內檔案的權限

單人模式-忘記root密碼可以進入此模式修改
  1. 修改 /etc/default/grub ,去延長開機選單的時間
    GRUB_TIMEOUT_STYLEGRUB_TIMEOUT 修改為
    GRUB_TIMEOUT_STYLE=menu
    GRUB_TIMEOUT=5
  2. 更新選單檔案
    ubuntu:~$ sudo update-grub
  3. 重開機後按下 e 進入選單
    image
  4. 加上rw init=/bin/bash
    image
  5. Ctrl + x 或按F10 啟動系統,即可進入單人模式
    image
  6. 更改密碼 passwd root
查看某用戶的進程(process)

ubuntu1:~# ps -u 使用者名稱
image
ps 常用參數:aux 顯示所有進程,並附加 CPU 和內存使用率信息

結束進程(process)

ubuntu1:~# kill PID

強制結束進程(process)

ubuntu1:~# kill -9 PID
範例: 強制結束一個包含for迴圈的進程

  1. 執行腳本
    ubuntu1:~$ ./for.sh
    image
  2. 查詢該進程的PID (PID = 3533 : 這個是腳本本身)
    image
  3. 結束for.sh
    image
移除使用者帳號與檔案
  1. 找出使用者所有的進程(process)
    ubuntu1:~# ps -u 使用者名稱
  2. 強制結束所有進程(process)
    ubuntu1:~# kill -9 PID
  3. 找到使用者所有檔案並刪除
    ubuntu1:~# find / -u 使用者名稱 -print -exec rm -rf {} \;
  4. 刪除帳號
    ubuntu1:~# userdel 使用者名稱
grep排除不符合的

加上-v
image

pkill

根據進程名稱或其他條件終止進程的命令
image

DNS 配置問題

apt 安裝或更新軟體包時無法解析某些網址
更新 DNS 配置
編輯 /etc/resolv.conf,加入下列程式碼

nameserver 8.8.8.8
重新選擇 crontab 編輯器
ubuntu1:~# select-editor
將輸入的文字附加到檔案中,直到輸入結束文字才停止(結束文字不會附加到檔案中)

cat > 檔案 <<結束文字
image