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)
放置在/home/user/.ssh
將公鑰複製到ubuntu2
登入ubuntu2
將指令串接在後面
ubuntu1~$ ssh user@ubuntu2 "pwd"
將file檔案傳送到ubuntu2的tmp資料夾下
將ubuntu2下的tmp資料夾裡的file傳送到本地端
將test資料夾傳送到ubuntu2的tmp資料夾下
參數 -r:遞迴複製
將ubuntu2下的tmp資料夾裡的test資料夾傳送到本地端
參數 -r:遞迴複製
使得 Linux 之間可以共享資料夾
安裝伺服端
/etc/exports
,加入下列程式碼
/nfs-server *(rw,sync,no_subtree_check,all_squash)
ubuntu1:~# systemctl restart nfs-kernel-server
安裝客戶端
建立資料夾
mount -t nfs -o rw,resvport ubuntu1:/nfs-server /nfs-client
取消連結
ubuntu2:~#umount /nfs-client (要離開nfs-client資料夾)
插入USB後查看掛載點
建立新的資料夾當USB的掛載點
ubuntu1:~# mkdir /mydisk
ubuntu1:~#mount /dev/sdb1 /mydisk
常用參數:
-h:以常見格式顯示大小(如 GB、MB)
-T:顯示文件系統類型
-i:顯示 inode 使用情況
Note
僅顯示出某個欄位 (腳本程式常用)
將指令存儲成變數 (腳本程式常用)
Important
正則表達式:
常用參數:
-h:以常見格式顯示大小(如 GB、MB)
-s:僅顯示總大小
常用參數:
-c:顯示 CPU 使用率
-n:顯示網絡流量
-d:顯示磁碟的讀寫數據
數據解析:
Total DISK READ/WRITE:顯示整體系統的磁碟讀寫速度
USER:運行進程的用戶
DISK READ/WRITE:該進程的磁碟讀取/寫入速率。
IO%:進程的 I/O 使用率
ubuntu1:~$ sudo apt install apt-transport-https curl
ubuntu1:~$ sudo mkdir -p /etc/apt/keyrings
sudo curl -o /etc/apt/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
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
安裝MariaDB
ubuntu1:~$ sudo apt install mariadb-server
檢查伺服器狀態
ubuntu1:~$ systemctl status mariadb
初始化MariaDB
ubuntu1:~# mysql_secure_installation
預設MariaDB沒有密碼,直接按enter就好了
沒有強制使用,輸入 n。
修改資料庫root帳號密碼,輸入y
輸入root密碼
移除匿名帳號,輸入y
不允許遠端使用root帳號登入,輸入n
移除測試資料庫與帳號,輸入y
重新載入權限設定,輸入y
登入MariaDB
編輯/etc/mysql/mariadb.conf.d/50-server.cnf,將bind-address=127.0.0.1改成bind-address=0.0.0.0,使得所有人都可以連線
重啟MariaDB伺服器
ubuntu1:~$ systemctl restart mariadb
新增資料庫權限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'user' WITH GRANT OPTION;
更新系統權限表
FLUSH PRIVILEGES;
關閉防火牆,並且設為開機不自啟動
ubuntu2:~$ sudo apt install mysql-client
create database 資料庫名稱;
use 資料庫名稱;
create table 資料表名稱(資料表欄位1,資料表欄位2,…);
insert into 資料表名稱(資料表欄位1,資料表欄位2) values (欄位1值,欄位2值);
select 欄位1,欄位2 from 資料表名稱;
select 欄位1,欄位2 from 資料表名稱 where 欄位="搜尋目標";
update 資料表名稱 set 欄位="更改的值" where 欄位="更改的目標";
硬連結是一個直接指向文件數據塊的條目
1. 硬連結不是指向文件路徑,而是直接指向文件的數據塊
2. 即使目標文件被刪除,硬連結仍然有效,因為數據仍保存在磁碟中(除非所有指向該數據的硬連結都被刪除)
3. 只能在同一個文件系統中創建,不能跨分區
4. 不能指向目錄
符號連結是一個類似於快捷方式的文件。它指向另一個文件或目錄的路徑,而不是數據本身
1. 符號連結是一個獨立的文件,存儲的是目標文件的路徑。
2. 如果目標文件被刪除或移動,符號連結會失效(變成“斷開的連結”)。
3. 可以跨文件系統創建(目標和連結可以位於不同的磁碟分區)。
4. 可以指向文件或目錄。
特性 | 符號連結 (Symbolic Link) | 硬連結 (Hard Link) |
---|---|---|
概念 | 指向文件的路徑 | 指向文件的數據 |
是否可以指向目錄 | 可以 | 不可以 |
跨磁碟分割區 | 支持 | 不支持 |
目標文件刪除影響 | 連結失效(斷開連結) | 不受影響(數據仍存在) |
文件系統inode | 使用新的 inode | 與原始文件共享同一個 inode |
inode
用於描述每個文件和目錄的元數據(metadata),每個文件或目錄都對應著一個唯一的 inode,即使檔案內容相同inode仍不一樣,包含以下內容:
ubuntu1:~$ sudo apt install curl
- 回傳值為0,網頁正常
- 回傳值為非0,網頁不正常(-connect-timeout 秒數:指定執行秒數結束)
ubuntu1:~$sudo apt -y install apache2 apache2-utils
ubuntu1:~$ systemctl status apache2
使用ubuntu1的IP嘗試連接
ubuntu1:~$ sudo apt-get install apache2-utils
ubuntu1:~$ sudo htpasswd -c /etc/apache2/.htpasswd 使用者名稱
ubuntu1:~$ sudo htpasswd /etc/apache2/.htpasswd 使用者名稱
ubuntu1:/var/www/html/sec# echo "This is a private webpage" > index.html
<Directory "/var/www/html/sec">
AuthType Basic
AuthName "You need to login"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
ubuntu1:~# systemctl restart apache2
Caution
查看/etc/apache2/.htpasswd 可以知道加入了幾個使用者
密碼有加密
ubuntu1:~$ sudo a2enmod userdir
<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>
ubuntu1:~$ systemctl restart apache2
www-a-com
和 www-b-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>
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>
192.168.44.140 www.a.com
192.168.44.140 www.b.com
ubuntu1:~# a2ensite www-a-com.conf
ubuntu1:~# a2ensite www-b-com.conf
ubuntu1:~# systemctl reload apache2
連線紀錄放置在/var/log/apache2/access.log
使用:
grep:篩選符合條件的行
awk:對文本進行更靈活的處理和過濾
sort:排序文件
uniq:處理重複數據的工具
查看使用 Firefox 瀏覽器進行訪問的IP和作業系統
ubuntu1:~$ sudo apt install software-properties-common
ubuntu1:~$ sudo add-apt-repository ppa:ondrej/php
ubuntu1:~$ sudo apt update
ubuntu1:~$ sudo a2enmod php8.1
ubuntu1:~$ sudo systemctl restart apache2
ubuntu1:~$ sudo vim /var/www/html/info.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";
}
?>
Python flask
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)
Tree
介紹: 以樹狀結構顯示目錄和文件的工具
安裝: ubuntu1:~$ sudo apt install tree
使用:
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
ubuntu1:~# ngrok config add-authtoken 2nmQc5kaIFBLMwY4dcEtVYZqCMN_dDfDuHSFhnxRJiNvDZxC
ngrok http http://localhost:80 (使用 Apache2 的端口,也可使用別的)
ubuntu1:~# ngrok http 80 --basic-auth "使用者名稱1:密碼1" --basic-auth "使用者名稱2:密碼2"
ubuntu1:~# su 使用者名稱
不會切換到使用者家目錄
ubuntu1:~# su - 使用者名稱
會切換到使用者家目錄
ubuntu1:~# useradd -m 使用者名稱 -s 使用的shell
(腳本程式常用)常見參數:
1. -m: 自動創建使用者的家目錄
2. -s: 指定使用者所使用的shell
3. -g: 指定使用者的主要群組 (預設為創建與使用者名稱相同的群組)
4. -G: 指定使用者的附加群組
5. -u: 指定使用者的UID (預設為現有 UID +1)
6. -d: 指定使用者家目錄
ubuntu1:~# adduser 使用者名稱
以問答的方式新增
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
存儲帳號訊息的位置
存放在/etc/passwd
所有人都可以讀取
使用者名稱:密碼(不存放在這):UID:GID:comment:家目錄:使用的shell
存儲群組訊息的位置
存放在/etc/group
所有人都可以讀取
暫時停止使用者登入
修改/etc/passwd
中的使用者所使用的shell,修改為/usr/sbin/nologin
即可停止帳號登入
查詢使用者UID、GID、GROUPS
ubuntu1:~$ id 使用者名稱
希望新的使用者也可以使用管理者權限
將新的使用者的附屬群組加入 sudo
存儲密碼訊息的位置
僅管理員可以讀取
存放在/etc/shadow
(有加密)
Linux 與 Windows 之間共享資料夾
ubuntu1:~$sudo apt install samba samba-common -y
目標:
資料夾1 => 主要測試所有人都可以直接進入不需要打帳號密碼即可存取
資料夾2 => 主要測試需要輸入ubuntu 主機設定的sambs 帳號密碼才可以進入存取
到根目錄下建立要進行分享的資料夾
ubuntu1:/# mkdir 資料夾名稱1
ubuntu1:/# mkdir 資料夾名稱2
確認分享的資料夾權限為777
ubuntu1:/# ls -ld 資料夾名稱
建立本機測試帳號
ubuntu1:/# useradd 使用者名稱1
ubuntu1:/# useradd 使用者名稱2
建立samba密碼
ubuntu1:/# smbpasswd –a 使用者名稱1
ubuntu1:/# smbpasswd –a 使用者名稱2
編輯伺服器配置檔,配置檔位於 /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
檢查 Samba 配置文件是否正確性
ubuntu1~# testparm -s
重啟 Samba 伺服器
ubuntu1:~# systemctl restart smbd
在 Windows 檔案總管搜尋 \\UbuntuIP
即可看到設定分享的資料夾
測試在sharea
中建立檔案
在 Ubuntu 中也可以看到該檔案
測試在shareb
中建立檔案
進入 shareb 需要進行身分驗證
cmd: net use * /delete
ubuntu2:~# apt install smbclient -y
ubuntu2:~# smbclient --list=Samba Server IP --user=使用者名稱
ubuntu2:~$ smbclient --user=使用者名稱 //Samba Server IP/要連接的資料夾
上傳檔案
smb: \> put 檔案
下載檔案
smb: \> get 檔案
ubuntu1:~#apt install pptpd
ubuntu1:~# iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
/etc/ppp/chap-secrets
,加入以下內容
"帳號" * "密碼" *
localip 192.168.34.1
remoteip 192.168.34.2-200
192.168.44.132
w
pts: 使用ssh連線登入的
tty: 本地登錄伺服器
第一行:
當前時間: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
who
簡單地檢查用戶登入狀態
last
查看曾登入此系統之使用者
-h :以易讀格式顯示內存(例如 KB, MB, GB,自動選擇合適單位)
-t :顯示記憶體的總量(包括內存和交換區)
-s :每隔指定秒數持續顯示內存狀態
-c :限制 -s 的輸出次數
能顯示系統當前運行的process、CPU 和記憶體使用情況
常用快捷鍵:
u: 僅顯示指定使用者的process
k: 終止指定進程(需要輸入 PID)。
使得 H1 和 H2 雖然在不同的區域網,卻可以互相傳送封包
Router
ens33: NAT
ens37: LAN10
ens38 :LAN20
R1:~# ip addr add 192.168.10.254/24 dev ens37
也可使用圖形化介面進行設置
R1:~# ip addr add 192.168.20.254/24 dev ens38
也可使用圖形化介面進行設置
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
檢查配置檔是否有錯誤
使用R1:~# netplan apply
應用修改過後的配置
修改配置檔固定路由功能預設開啟
在/etc/sysctl.conf
中,找到net.ipv4.ip_forward=1
,將開頭的#
刪除
使用R1:~# sysctl -p /etc/sysctl.conf
應用修改過後的配置
H1
H1:~# ifconfig
H1:~# ip addr add 192.168.10.1/24 dev ens33
H1:~# ip route add default via 192.168.10.254
H1:~# ip route show
也可使用圖形化介面進行設置
修改配置檔固定網路卡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
檢查配置檔是否有錯誤
使用H1:~# netplan apply
應用修改過後的配置
H2
H2:~# ifconfig
H2:~# ip addr add 192.168.20.1/24 dev ens33
H2:~# ip route add default via 192.168.20.254
H2:~# ip route show
也可使用圖形化介面進行設置
也可使用圖形化介面進行設置
修改配置檔固定網路卡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
檢查配置檔是否有錯誤
使用H2:~# netplan apply
應用修改過後的配置
網路卡設置
ifconfig 網路卡名稱 0
ifconfig 網路卡名稱 down
ifconfig 網路卡名稱 up
使得 H1 和 H2 雖然在不同的區域網,卻可以互相傳送封包
新增兩張網路卡,並設定不同的區域網
確認兩張網路卡名稱
ens33: NAT
ens37: LAN10
ens38 :LAN20
設置 ens37 IP 為192.168.10.254
R1:~# ip addr add 192.168.10.254/24 dev ens37
也可使用圖形化介面進行設置
設置 ens38 IP 為192.168.20.254
R1:~# ip addr add 192.168.20.254/24 dev ens38
也可使用圖形化介面進行設置
確認 IP 設置
開啟路由器
R1:~# echo 1 > /proc/sys/net/ipv4/ip_forward
修改配置檔固定路由功能預設開啟
在/etc/sysctl.conf
中,找到net.ipv4.ip_forward=1
,將開頭的#
刪除
使用R1:~# sysctl -p /etc/sysctl.conf
應用修改過後的配置
安裝 DHCP Server
R1:~# apt install isc-dhcp-server -y
進行原始的DHCP Server配置檔備份,檔案在/etc/dhcp/dhcpd.conf
R1:~# cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.backup
修改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;
}
重啟DHCP Server
R1:~# systemctl restart isc-dhcp-server
未開啟網路卡連接時:
開啟網路卡連接時:
(自動分配IP)未開啟網路卡連接時:
開啟網路卡連接時:
(自動分配IP)
private network
,另一台在public network
,加入DHCP Server ,使客戶端不需手動設置IP設置參考第二部分,僅Router需多加設定
R1:~# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens38 -j MASQUERADE
R1:~# apt install wireshark-*
R1:~# wireshark
H1傳送封包給H2
可以發現 Source 的 IP 被更改,保護(192.168.10.0/24)中的客戶端
可以發現 Source 的 IP 沒有被更改
設置參考第二部分,使用DHCP Server 為H1
和H2
自動分配IP
Router1:
設定ens37
和ens38
兩張網路卡IP
確認路由功能開啟 (1為開啟狀態)
R1:~# cat /proc/sys/net/ipv4/ip_forward
查看路由表
R1:~# route -n
檢測R1
和H1
之間的網路連通性
H1:~# ping 192.168.10.254
H1:~# ping 12.1.1.1
檢測H2
和R1
之間的網路連通性,因為H2
和R1
不在同個區域往內,所以需要經由R2
將封包轉發到R1
H2:~# ping 12.1.1.1
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
再次查看路由表
再次檢測H2
和R1
之間的網路連通性
H2:~# ping 12.1.1.1
Router2:
設定ens37
和ens38
兩張網路卡IP
確認路由功能開啟 (1為開啟狀態)
R2:~# cat /proc/sys/net/ipv4/ip_forward
查看路由表
R2:~# route -n
檢測R2
和H2
之間的網路連通性
H2:~# ping 192.168.20.254
H2:~# ping 12.1.1.
檢測H1
和R2
之間的網路連通性,因為H1
和R2
不在同個區域往內,所以需要經由R1
將封包轉發到R2
H1:~# ping 12.1.1.2
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
再次查看路由表
再次檢測H1
和R2
之間的網路連通性
H1:~# ping 12.1.1.2
H1:~#ping 192.168.10.254
H1:~#ping 12.1.1.1
H1:~#ping 12.1.1.2
H1:~#ping 192.168.20.254
H1:~#ping 192.168.20.1
H2:~#ping 192.168.20.254
H2:~#ping 12.1.1.2
H2:~#ping 12.1.1.1
H2:~#ping 192.168.10.254
H2:~#ping 192.168.10.1
private network
,另一台在public network
,並使用DNAT
,將外部請求引導到內部伺服器時使用設置參考第二部分,使用DHCP Server 為H1
和H2
自動分配IP
Router1:
設定ens37
和ens38
兩張網路卡IP
確認路由功能開啟 (1為開啟狀態)
R1:~# cat /proc/sys/net/ipv4/ip_forward
查看路由表
R1:~# route -n
檢測R1
和H1
之間的網路連通性
H1:~# ping 192.168.10.254
H1:~# ping 12.1.1.1
檢測H2
和R1
之間的網路連通性,因為H2
和R1
不在同個區域往內,所以需要經由R2
將封包轉發到R1
H2:~# ping 12.1.1.1
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
再次查看路由表
再次檢測H2
和R1
之間的網路連通性
H2:~# ping 12.1.1.1
將通過 ens38
的封包源地址轉換為 R1
的 ens38
地址,去讓在私有網路裡的H1
,也可以訪問公開網路
R1:~# iptables -t nat -A POSTROUTING -o ens38 -j MASQUERADE
將發往 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
Router2:
設定ens33
和ens37
兩張網路卡IP
確認路由功能開啟 (1為開啟狀態)
R2:~# cat /proc/sys/net/ipv4/ip_forward
查看路由表
R2:~# route -n
因為H1
和R2
不在同個區域往內,所以無法連接
echo
ubuntu1:~$ echo "hi\n123"
-e
ubuntu1:~$ echo -e "hi\n123"
指令執行後,必定會回傳一個「結束狀態碼」
環境變數
ubuntu1:~$ echo $變數
印出變數
HOME: 目前使用者的家目錄
IFS: 用來分隔欄位的字元清單 (預設為空白鍵)
PATH: 用分號分隔的一連串目錄,代表執行指令時的搜尋路徑清單
範例: 在PATH
中加入新的路徑 (當前視窗有效)
ubuntu1:~$ export PATH=$PATH:/home/user/shelltest
ubuntu1:~/shelltest$ hello.sh
範例: 在PATH
中加入新的路徑 (永久)
修改配置檔/home/user/.bashrc
,加入下列程式碼
export PATH=$PATH:/home/user/shelltest
重新加載
ubuntu1:~$ source .bashrc
or
ubuntu1:~$ . .bashrc
USER: 目前使用者帳號名稱
UID: 目前使用者的uid
HISTFILE: 儲存下過的指令清單的檔案位置
history
顯示曾經用過的指令
使用:
ubuntu1:~$ !11
RANDOM: 每次取得變數資料,都會給一個0到32767的亂數
ubuntu1:~$ echo $RANDOM
常用搭配:
計算 MD5 哈希值
ubuntu1:~$ echo 'hello world' | md5sum
提取部分內容
ubuntu1:~$ echo 'hello world' | cut -c 1-5
產生固定長度的亂碼
ubuntu1:~$ echo $RANDOM | md5sum | cut -c 1-5
env 或 set
env
顯示當前 shell 的所有環境變數及其值
set
顯示當前 shell 的所有環境變數及其值,比env
更詳細
取得使用者輸入變數值
read
範例:
#!/usr/bin/bash
read -p "Enter your name: " name
echo "Welcome, $name!"
單引號與雙引號
條件判斷: test
-d 檔案: 測試檔案是否為目錄?
-e 檔案: 測試檔案是否存在
-r 檔案: 測試檔案是否可讀?
-w 檔案: 測試檔案是否可寫入?
-x 檔案: 測試檔案是否可執行?
-L 檔案: 測試檔案是否為連結(link) ?
-z 字串: 測試字串長度是否為0(空字串)?
字串 = 字串: 測試等號左右邊字串是否相等?
字串 != 字串: 測試等號左右邊字串是否不相等?
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
接受命令列的參數
利用$1 $2 $3等取得第一個、第二個、等三個等參數值
n1=$1
n2=$2
echo $n1
echo $n2
test $n1 -gt $n2
echo $?
bash -x
用於執行腳本時顯示命令的執行過程
判斷式
if test 條件
then
結果為真執行的命令
else
結果為假執行的命令
fi
for迴圈
for 變數 in 資料集合
do
要重複的指令
done
#!/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
* | * | * | * | * | 指令 |
---|---|---|---|---|---|
分 | 時 | 日 | 月 | 星期 | |
0-59 | 0-23 | 1-31 | 1-12 | 0-7 (0 = 星期日) |
1 * * * * 指令
每小時的第一分鐘執行一次* * * * * 指令
每時每分都執行一次*/n * * * * 指令
每小時的第n分鐘執行一次1 1 * * * 指令
每天的1點1分執行一次* 1 * * * 指令
每天1點的每分鐘執行一次20 2 1,15 * * 指令
每月的1號和15號的2點20分執行一次0 7,21 * * * 指令
每天的7點和21點 執行一次0 1-4 * * * 指令
每天的1點到4點執行一次ubuntu1:~# crontab -e
2
使用 vim
*/1 * * * * date >> /tmp/mytime
每1分鐘將最新的時間加入 /tmp/mytime
/tmp/mytime
,使用 ubuntu1:~# tail -f /tmp/mytime
,即時的讀取新加入/tmp/mytime
的時間ubuntu1:~# crontab -l
ubuntu1:~# crontab -r
ubuntu1:~# crontab -u 使用者名稱
at
at 時間
EOT
或是ctrl + D
後結束ubuntu1:~# atq
ubuntu1:~$ atrm 工作編號
-c:建立一個新的 tar 檔
-v:顯示運作過程的資訊
-f:指定檔案名稱
-z:呼叫 gzip 壓縮指令執行壓縮、解壓縮
-j:呼叫 bzip2 壓縮指令執行壓縮、解壓縮
-t:檢視壓縮檔案內容
-x:解開 tar 檔
ubuntu1:~# tar -cvzf 打包後檔名 要打包的檔案
ubuntu1:~# tar -xvzf 要解壓縮的檔名
軟體套件管理程式
參數:-l 以清單方式呈現
查詢網路狀態
參數:
意義:
1. 伺服器端:任意介面
2. 客戶端:任一個節點
3. 一般PC:尚未取得IP
產生一個名為file的空白檔案
產生大量的空白檔
將ubuntu2IP加進配置檔裡
ubuntu1:~#vim /etc/hosts
參數:
1. -L:使用者帳號檔案來源
2. -P:使用者密碼檔案來源
暫時提升權限 ubuntu1:~$ sudo bash -c 'echo hi > hi.htm'
在命令模式下輸入: set number
ubuntu1:~$ sudo apt update
ubuntu1:~$ sudo apt install snapd
ubuntu1:~$ sudo snap install john-the-ripper
ubuntu1:~$ sudo apt install john
ubuntu1:~# unshadow /etc/passwd /etc/shadow > mypasswd.txt
ubuntu1:~# john --wordlist=準備的密碼檔 --format="crypt" mypasswd.txt
#!/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
ubuntu1:~$ chmod +x useradd.sh
ubuntu1:~# ./useradd.sh
ubntu1:~$ ls -ld 目錄名稱
查看目錄的權限
ubntu1:~$ ls -l 目錄名稱
查看目錄內檔案的權限
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
ubuntu:~$ sudo update-grub
rw init=/bin/bash
Ctrl + x
或按F10
啟動系統,即可進入單人模式passwd root
ubuntu1:~# ps -u 使用者名稱
ps 常用參數:aux 顯示所有進程,並附加 CPU 和內存使用率信息
ubuntu1:~# kill PID
強制結束進程(process)
ubuntu1:~# kill -9 PID
範例: 強制結束一個包含for迴圈的進程
ubuntu1:~$ ./for.sh
for.sh
ubuntu1:~# ps -u 使用者名稱
ubuntu1:~# kill -9 PID
ubuntu1:~# find / -u 使用者名稱 -print -exec rm -rf {} \;
ubuntu1:~# userdel 使用者名稱
加上-v
根據進程名稱或其他條件終止進程的命令
apt
安裝或更新軟體包時無法解析某些網址
更新 DNS 配置
編輯 /etc/resolv.conf
,加入下列程式碼
nameserver 8.8.8.8
crontab
編輯器ubuntu1:~# select-editor
cat > 檔案 <<結束文字