關於 Linux 介紹

上禮拜系上的資安社團講了 Linux 相關的知識,但是我覺得學弟實在是沒有準備的很好,我覺得講得太簡單了(嗎?

(其實是系上網管團隊要教相關的東西)

(原本偷懶想叫他們直接去看學弟準備的教材)

(但不夠用… QAQ)

簡單說一下 Linux 是什麼?

通常我們說 Linux,大部分是指 Linux kernel,是作業系統的核心。

使用 Linux kernel 的作業系統(Linux 家族):Ununtu、Kali、CentOs…

關於 Linux 的檔案結構

在 Linux 當中的檔案結構通常有 bin boot cdrom dosc etc home lib mnt proc root sbin usr var

可能會根據不同的作業系統有些微的不同。所以下面列舉常用的的

檔案名稱 簡介
bin Linux 的執行檔
boot Linux 開機要載入的檔案
etc 各種東西的設定檔
home 使用者的家目錄
lib 各種東西的函式庫
usr 各種應用
var 各種應用或是系統的變數檔案

為什麼用 Linux ?

為什麼不用 Window Server 就好?Linux 有什麼優點嗎?

  • Linux 不會突然跟你說要更新。也不會突然跳藍藍的畫面然後死給你看。
  • Linux 是開源系統,歷經開發者們長年累月的更新與維護,是一個成熟的系統了,搵定性與安全性都不錯。
  • Linux 速度比 Window 較快。
  • Linux 系統權限設計比較嚴謹。

那接來呢…?

接下來的幾篇我會開始介紹 Linux 的指令。安裝什麼的就交給網路上其他文章吧。

不過為了練習 Linux,把整個 window 換掉重灌,之後還怎麼打遊戲呢!!

參考資料:

TypeScript Utility Types

突然覺得好像都沒在寫文章,最今剛好在幫系上寫系統,用了 TypeScript,雖然網路上已經很多相關的文章了,但是我寫了自己的筆記,之後如果忘了就不用花時間找了,所以就來寫寫相關的東西吧!

(現在有 chatgpt 為什麼還需要技術文章呢?!)

(也許就是紀錄一下學習歷程吧)

Utility Types 是什麼東西?

在 TypeScript 當中,常常會需要寫很多的 interface。

像是用戶系統當中…

1
2
3
4
5
interface I_User {
name: string;
birthday: Date;
...
}

那如果我在 api 要修該資料,這些資料當作參數傳入,不過這個參數並不是所有欄位都需要,所以也許就會寫成這樣…

1
2
3
4
interface I_UserEdit {
name?: string;
birthday?: Date;
}

不過在 typescript 當中提供了另一種寫法…

1
2
3
function editUser(payload: Partial<U_User>) {
...
}

那接下來就來看看 TypeScript 中,有哪些這種寫法。

Centent

Pick & Omit

Pick<Type, Keys>

從一個 Type 中取出特定的 Keys,若要取出多個 Keys,可以利用 | 隔開。

1
2
3
4
5
6
7
8
9
10
interface I_User {
userId: string;
name: string;
birthday: Date;
}

type UserId = Pick<I_User, 'userId'>
// UserId {
// userId: string;
// }

Omit<Type, Keys>

從一個 Type 當中,指定特定的 Keys 除外,多個 Keys 同樣可以用 | 隔開。

1
2
3
4
5
6
7
8
9
10
11
interface I_User {
userId: string;
name: string;
birthday: Date;
}

type UserInfo = Omit<I_User, 'userId'>
// UserInfo {
// name: string;
// birthday: Date;
// }

Partial & Required

Partial<Type>

把一個 Type 裡的所有 Keys 都變成非必要的欄位 (optional)。

1
2
3
4
5
6
7
8
9
10
11
12
interface I_User {
userId: string;
name: string;
password: string;
}

type I_USER = Partial<I_User>
// I_USER {
// userId?: string;
// name?: string;
// password?: string;
// }

Required<Type>

Required 正好跟 Partial 相反,把所有的 Keys 變成必要欄位。

1
2
3
4
5
6
7
8
9
10
11
12
interface I_User {
userId?: string;
name?: string;
password?: string;
}

type I_USER = Required<I_User>
// I_USER {
// userId: string;
// name: string;
// password: string;
// }

Exclude & Extract

接下來這兩個分別是「差集」與「交集」

用法如下:

1
2
3
4
5
6
7

type foo = Exclude<'A' | 'B' | 'C', 'B' | 'D'>
// foo = 'A' | 'C'

type bar = Extract<'A' | 'B' | 'C' , 'B', 'C' | 'D'>
// bar = 'B' | 'C'

以上介紹了六種 utility types,其實還有 AwaitedReadonlyRecordNonNullable,有興趣的話可以到下面參考資料看看喔!

參考資料:

澎湖遊記

Aug 20 ~ Aug 22

[!NOTE]
這次三天的行程基本上是在本島以騎機車能到的地方(馬公市、湖西鄉、白沙鄉、西嶼鄉)。

隨然說是遊記,但我完全不知道要寫什麼,所以直接先來幾張圖片吧!

澎湖西嶼西臺

啊啊啊啊!我應該要放具有地標性的照片對吧 XD

澎湖跨海大橋

不過放太多照片的話,整個畫面跑太久了,所以…

就用這個吧…. https://imgur.com/a/7217Ji5

我的資料庫被駭客勒索了

昨天學弟突然跑來私訊我,說老闆計畫的網站壞掉了,於是我趕緊登入機器來看看發生什麼事情。結果發現原來是資料庫被清空,後端的程式碼抓不到資料庫因此報錯。

好好的資料庫為什麼資料空了

我打開了資料庫一看,發現除了原本的資料庫不見,還多了一個資料庫,叫做 “RECOVERY_YOUR_DATA”。我心裡想原來 mysql 有資料回覆的功能嗎?結果…

原來 docker 可以繞過 ufw ?

如果使用 -p 來映射 port 到外部使用的時候,這個 port 不會被 ufw 阻擋,就相當與直接暴露在網路當中。原因是 ufw 是 iptables 的前端介面,使用 ufw 相當於修改 iptables,而 docker 在映射 port 的時候,也會修改 iptables,這就導致了 docker 會無視 ufw 所建立的規則。

要怎麼防止 docker 映射出來的 port 繞過防火牆?

1. 設定 docker 不要修改 iptables

到 /etc/default/docker 的設定檔中,把 DOCKER_OPTS 改成…

1
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --iptables=false"

不過我自己在這個路徑當中找不到設定檔QAQ,所以我找了另一個方法來使 docker 不修改 iptables。

在相同的路徑上,建立 daemon.json 然後把下面的設定寫到檔案中

1
2
3
{
"iptables": false
}

2. 完整設定 docker 的映射規則

在啟用容器的時候把 port 映射到本機的 port 當中。

1
2
# 容器的 80 port -> 外部 127.0.0.1:80
$ docker run -p 127.0.0.1:80:80 nginx

別忘記在設定完之後要重新啟動 docker 喔!

1
2
3
$ sudo systemctl restart docker
# or
$ sudo service docker restart

參考資料: