跟運維學 Linux - 02

来源:https://www.cnblogs.com/pengjiali/archive/2023/07/18/17563624.html
-Advertisement-
Play Games

## 文件操作和用戶 ### 複製移動和刪除 在Windows中我們可以通過快捷鍵 ctrl + c 複製,ctrl + v 粘貼,在 linux 中需要使用命令。 #### 複製移動 `cp` 就是 copy 的意思。請看示例: ```javascript // 將 a.txt 複製一份,重命名為 ...


文件操作和用戶

複製移動和刪除

在Windows中我們可以通過快捷鍵 ctrl + c 複製,ctrl + v 粘貼,在 linux 中需要使用命令。

複製移動

cp 就是 copy 的意思。請看示例:

// 將 a.txt 複製一份,重命名為 b.txt
test11@pj-pc:~$ cp a.txt b.txt
test11@pj-pc:~$ ls
模板  桌面  a.txt  b.txt  dir1
// 將 a.txt 複製到 dir1 目錄中
test11@pj-pc:~$ cp a.txt dir1
test11@pj-pc:~$ ls dir1
a.txt
// 將 dir1/a.txt 複製到當前目錄
test11@pj-pc:~$ cp dir1/a.txt .

如果當前目錄有同名的文件,需要詢問是否覆蓋,可以使用參數 -i

// -i 會詢問是否覆蓋
test11@pj-pc:~$ cp -i dir1/a.txt .
cp:是否覆蓋'./a.txt'? n
test11@pj-pc:~$ rm a.txt
// 沒有同名文件,則無需詢問
test11@pj-pc:~$ cp -i dir1/a.txt .
test11@pj-pc:~$

文件夾的拷貝需要使用參數 -r,否則會提示錯誤:

// 報錯:缺少 -r
test11@pj-pc:~$ cp dir1 dir2
cp: 未指定 -r;略過目錄'dir1'
// 拷貝目錄
test11@pj-pc:~$ cp -r dir1 dir2
test11@pj-pc:~$ ls
模板  桌面  dir1  dir2

拷貝文件比較清晰,而拷貝文件夾就沒那麼好理解,我們分幾種情況詳細介紹:

// 將 dir1 文件夾拷貝到 dir2目錄中
test11@pj-pc:~/dir$ cp -r dir1 dir2
test11@pj-pc:~/dir$ ls dir2
c.txt  dir1
test11@pj-pc:~/dir$
// tree 可通過包管理器安裝
test11@pj-pc:~/dir$ tree
.
├── a.txt
├── dir1
│   └── b.txt
└── dir2
    └── c.txt

2 directories, 3 files
// 將dir1文件夾中的內容拷貝到 dir2 中
test11@pj-pc:~/dir$ cp dir1/* dir2
test11@pj-pc:~/dir$ ls dir2
b.txt  c.txt

dir1/a.txt 拷貝到當前目錄,以下兩種寫法一個有提示,一個沒有提示,是什麼原因?

test11@pj-pc:~/dir$ tree
.
├── a.txt
├── dir1
│   ├── a.txt
│   └── b.txt
└── dir2
    ├── b.txt
    └── c.txt

2 directories, 5 files
// 沒有提示
test11@pj-pc:~/dir$ \cp dir1/a.txt .
// 有提示
test11@pj-pc:~/dir$ cp dir1/a.txt .
cp:是否覆蓋'./a.txt'? y

通過 alias 命令我們得知 cp 其實等同於 cp -i,所以有提示,而 \cp 表示不使用別名,表示純 cp 命令。

test11@pj-pc:~/dir$ alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

Tip:alias 顯示當前定義的別名。創建一個新的別名 alias ll='ls -l',刪除一個別名 unalias ll

刪除

刪除文件和目錄需要使用 rm 命令。

文件直接即可刪除:

test11@pj-pc:~/dir$ ls
a1.txt  a2.txt  a3.txt  dir1  dir2
// 刪除文件
test11@pj-pc:~/dir$ rm a1.txt
// -i 刪除前確認
test11@pj-pc:~/dir$ rm -i a2.txt
rm:是否刪除普通空文件 'a2.txt'?n
test11@pj-pc:~/dir$

刪除文件夾需要使用 -r 參數,否則報錯:

// 報錯:需要使用 -r
test11@pj-pc:~/dir$ rm dir1
rm: 無法刪除'dir1': 是一個目錄
// 刪除目錄
test11@pj-pc:~/dir$ rm -r dir1
test11@pj-pc:~/dir$ ls
a2.txt  a3.txt  dir2
// 刪除前確認
test11@pj-pc:~/dir$ rm -ir dir2
rm:是否進入目錄'dir2'? y
rm:是否刪除普通空文件 'dir2/c.txt'?y
rm:是否刪除普通空文件 'dir2/b.txt'?y
rm:是否刪除目錄 'dir2'?y
test11@pj-pc:~/dir$ ls
a2.txt  a3.txt

Tip: 一名合格的運維工程師在修改文件之前需要對源文件(文件夾)進行備份。否則一旦改錯,又改不回去,就很麻煩。

查找文件和隱藏文件

比如知道文件或文件夾的名字,但忘記在哪裡,可以使用 find 命令。

// 在當前目錄中查找名字是 dir2 的文件或名錄
test11@pj-pc:~/dir$ find . -name dir2
./dir1/dir2
./dir2

ls 顯示的是非隱藏文件(文件夾),如果需要查看隱藏文件(文件夾),可以增加參數 -a

test11@pj-pc:~/dir$ ls
a3.txt  dir1
// 顯示隱藏文件和隱藏目錄
test11@pj-pc:~/dir$ ls -a
// . 當前目錄
// .. 上一層目錄
.  ..  .a2.txt  a3.txt  dir1  .dir2

隱藏文件(文件夾)以點(.)開頭,也是一種保護機制。

隱藏文件查看方式和普通文件相同:

test11@pj-pc:~/dir$ cat .a2.txt
apple

如果需要將隱藏文件或隱藏目錄轉成非隱藏,重命名(刪除.)即可。

test11@pj-pc:~/dir$ mv .a2.txt a2.txt
test11@pj-pc:~/dir$ mv .dir2 dir2
// a2.txt 和 dir2 不在隱藏
test11@pj-pc:~/dir$ ls
a2.txt  a3.txt  dir1  dir2

一切皆文件

我們現在一直圍繞著文件學習 linux 命令,為什麼總是圍繞文件?因為 Linux 中一切皆文件。

筆者的 linux 有一塊磁碟 /dev/sda 931G。

/dev/sda 是一個文件,用它來表示硬碟。

// fdisk -l 查看本地磁碟信息
pj@pj-pc:/home/test11/dir$ sudo fdisk -l
Disk /dev/sda:931.53 GiB,1000204886016 位元組,1953525168 個扇區
Disk model: WDC WD10EZEX-75W
單元:扇區 / 1 * 512 = 512 位元組
...

這個文件和其他文件一樣,也有自己的屬性:

pj@pj-pc:/home/test11/dir$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 7月  17 14:52 /dev/sda

最前面的一位 b,b=block,也就是塊設備,說白了就是硬碟。

於是我們知道在 linux 中,用文件表示各種東西。

路徑

登陸後預設來到用戶的家目錄,但對於 linux 來說,家目錄不是不是最原始的起點。

Linux 下所有目錄最開始的起點叫做“根”,也就是/。所有目錄都以它為起點,如樹杈一樣,一層一層向下擴展。

感覺根有點虛,其實是可以看見的:

pj@pj-pc:~$ ls /
backup  bin  boot  cdrom  data  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

這裡顯示的就是一級目錄,不同發行版,一級目錄都差不多(目錄名)

pj@pj-pc:~$ tree -L 1 /
/
├── backup
├── bin -> usr/bin
├── boot
├── cdrom
├── data
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib32 -> usr/lib32
├── lib64 -> usr/lib64
├── libx32 -> usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

25 directories, 0 files

如果一個路徑從 / 開始,例如 "/home/user1/xx" 就是一個絕對路徑。

無敵的 root

接下來我們得真正用 linux 乾點活了。

主管:來了2個新人,你(運維工程師)給他們在伺服器A中給他們創建賬號並郵件通知他們(省去許多其他要求...)

在 windows 中,給用戶創建賬號,最好是管理員角色。在 linux 中不叫管理員,而是 root,也是一個特殊的用戶。

root 在 linux 中擁有最高的許可權,無所不能。所以公司通常會加以限制,root賬戶只對少數人開放(其他人不允許用root登錄),例如運維工程師,為了伺服器和系統的穩定需要隨時擁有最高許可權。

通過 whoami 查看當前用戶:

pj@pj-pc:~$ whoami
user-pj

Tip: 筆者沒有測試伺服器的 root 賬號。

useradd 創建用戶(sudo 讓普通用戶臨時擁有root的許可權),並通過 id 查看用戶是否真的被創建出來:

// 創建一個叫 test18 的用戶
pj@pj-pc:~$ sudo useradd test18
// 用戶創建成功
pj@pj-pc:~$ id test18
uid=1005(test18) gid=1005(test18) 組=1005(test18)
pj@pj-pc:~$

Tip:adduser 和 useradd 功能類似,但有一些區別。adduser 是一個高級的用戶管理工具;而 useradd 更基本,比如 useradd 不會創建家目錄;

root 不是角色,而是一個實實在在的用戶。雖然 root 用戶只有一個,但是通過許可權和分組,可以讓普通用戶擁有root一樣高的許可權。

// 創建一個叫 root 的用戶
pj@pj-pc:~$ sudo useradd root
輸入密碼
useradd:用戶“root”已存在

現在我們創建了 test18 用戶,接下來得給他分配密碼。通過 passwd 給用戶創建密碼:

pj@pj-pc:~$ sudo passwd test18
新的密碼:
// linux 中密碼有一定規範
無效的密碼:密碼少於 8 個字元
新的密碼:
無效的密碼:密碼包含的字元類型少於 2 種
新的密碼:
重新輸入新的密碼:
passwd:已成功更新密碼

Tip: 如果你使用root給新用戶創建密碼,即使使用一個不符合規則的密碼,也能創建成功,因為 root 有最高許可權。

如果需要切換用戶登錄,可以使用 su - 用戶名

pj@pj-pc:~$ su - test18
輸入密碼
$
// 再次確定是否切換成功
$ whoami
test18
$ id
uid=1006(test18) gid=1006(test18) 組=1006(test18)
$

登錄後修改自己的密碼,直接輸入 passwd 即可:

$ passwd
為test18更改密碼
當前密碼:
新的密碼:
無效的密碼:與舊密碼相同
新的密碼:

系統賬號

前面我們已經對linux 賬號有所瞭解(root、普通用戶),這裡我們在認識一下系統賬號

系統賬號不是給人用的,而是給程式用的。系統賬號長什麼樣子?比如 mail:

pj@pj-pc:~$ id mail
uid=8(mail) gid=8(mail) 組=8(mail)

系統賬號安裝軟體時,程式自動創建的。例如現在沒有ntp賬號,安裝 ntp 只有就有該賬號了:

// 沒有 ntp 賬號
pj@pj-pc:~$ id ntp
id: “ntp”:無此用戶
// 安裝 ntp
pj@pj-pc:~$ sudo apt install ntp
正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹
...
// 有 ntp 賬號
pj@pj-pc:~$ id ntp
uid=124(ntp) gid=132(ntp) 組=132(ntp)

系統賬號不能拿來直接使用,而是軟體運行時,由它們自己來使用。

Tip:約定Uid小於1000的是系統賬號。

第一個配置文件

只是學會用命令創建賬號、修改密碼,這是最基本的入門。

我們要深入探索 Linux 用戶賬號,先學慣用戶賬號的管理。

要掌握 linux 用戶管理,首先得知道全部用戶都定義在哪裡。如下操作:

pj@pj-pc:~$ head /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

/etc 目錄放置的都是配置文件,全部用戶就定義在 /etc/passwd 配置文件中。

這些都是用戶:root、daemo、bin...

pj@pj-pc:~$ id root
uid=0(root) gid=0(root) 組=0(root)

pj@pj-pc:~$ id daemon
uid=1(daemon) gid=1(daemon) 組=1(daemon)

pj@pj-pc:~$ id bin
uid=2(bin) gid=2(bin) 組=2(bin)

先來認識一下什麼是配置文件

我們的 linux 上面運行著各種各樣的軟體,軟體到了底層,就是程式在運行。

如果想改變程式的運行方式,直接跟程式說沒用,因為程式不接受你的直接調遣。如果你通過配置文件讓其改變,程式就會乖乖就範。

上文我們學習的用戶管理,背後也是有對應的程式在運行。

我們直接通過命令 useradd 創建用戶,根本沒有接觸配置文件,其實這是表象。做一個試驗就知道了。我們直接修改 /etc/passwd 模仿 test18 增加一條數據:

pj@pj-pc:~$ id test19
id: “test19”:無此用戶
pj@pj-pc:~$ tail -n 2 /etc/passwd
test18:x:1006:1006::/home/test18:/bin/sh
test19:x:1007:1007::/home/test19:/bin/sh

用戶(test19)創建成功:

// 不一樣
pj@pj-pc:~$ id test19
uid=1007(test19) gid=1007 組=1007
pj@pj-pc:~$ id test18
uid=1006(test18) gid=1006(test18) 組=1006(test18)

這樣編輯一下 /etc/passwd 創建創建出來的用戶,是不完整的,缺少一些東西,接下來將圍繞這個遺留問題,繼續操作和講解。

用戶組

用戶 test18 使用useradd 命令創建,而 test19 是直接編輯配置文件創建的。通過 id 就會發現有所不同:

pj@pj-pc:~$ id test18
uid=1006(test18) gid=1006(test18) 組=1006(test18)
// gid=1007(缺少) 組=1007(缺少)
pj@pj-pc:~$ id test19
uid=1007(test19) gid=1007 組=1007

為了講清楚這部分差異,我們下麵分幾個步驟。

在linux中,每個用戶必須屬於一個組織,這個組織就是主組(gid)和附屬組(groups,筆者這裡就是)。

以 test18 為例,gid=1006(test18) 其主組是 test18,組=1006(test18) 附屬組也是 test18。

當執行 useradd,系統會給 test18 創建一個同名的組 test18,並讓該用戶的主組是它。

主組只有一個,附屬組可以沒有或者有多個。下麵我們給 test18 增加一個附屬組(usermod -aG):

// 通過 usermod 給 test18 增加一個附屬組
pj@pj-pc:~$ sudo usermod -aG mail test18
輸入密碼
pj@pj-pc:~$ id test18
uid=1006(test18) gid=1006(test18) 組=1006(test18),8(mail)
pj@pj-pc:~$

組在哪裡定義的,我們可以自己創建嗎?

pj@pj-pc:~$ cat /etc/group |grep 'test18'
mail:x:8:test18
test18:x:1006:

/etc/group 配置文件中定義了所有的組,其中用戶test18的主組gid=1006(test18)就在其中:

pj@pj-pc:~$ id test18
uid=1006(test18) gid=1006(test18) 組=1006(test18),8(mail)

而 test19 對應的組 1007 根本不存在

pj@pj-pc:~$ id test19
uid=1007(test19) gid=1007 組=1007

給配置文件增加一行(test19:x:1007:):

pj@pj-pc:~$ cat /etc/group |egrep "test18|test19"
mail:x:8:test18
test18:x:1006:
// 增加這一行(shift+g定位到最後一行)
test19:x:1007:

這樣就顯示正常了:

pj@pj-pc:~$ id test19
uid=1007(test19) gid=1007(test19) 組=1007(test19)
pj@pj-pc:~$

我們在看下麵段代碼,1007:1007 是什麼?

pj@pj-pc:~$ cat /etc/passwd |egrep "test18|test19"
test18:x:1006:1006::/home/test18:/bin/sh
test19:x:1007:1007::/home/test19:/bin/sh

前一個1007表示系統分配給用戶 test19 的 ID,不可以隨便改變,後一個1007是主組ID

Tip:在Linux用戶管理系統中,每個用戶和組都有一個唯一的數字標識符(UID和GID)。雖然用戶名和組名更加易於人類理解,但實際上,系統在內部使用對應的數字來識別用戶和組。

做一個小實驗,看主組能否改變。

將 test19 的主組id改成test18的主組id:

pj@pj-pc:~$ tail -n 2 /etc/passwd
test18:x:1006:1006::/home/test18:/bin/sh
test19:x:1007:1006::/home/test19:/bin/sh

真的改成功了,現在 test19 的用戶組是 test18:。

pj@pj-pc:~$ id test19
uid=1007(test19) gid=1006(test18) 組=1006(test18)

我們再做一個實驗,如果一個用戶,一個組都不屬於會怎麼樣?

pj@pj-pc:~$  tail -n 2 /etc/passwd
test18:x:1006:1006::/home/test18:/bin/sh
test19:x:1007:::/home/test19:/bin/sh

用戶信息報錯:

pj@pj-pc:~$ id test19
id: “test19”:無此用戶

用戶家目錄

我們編輯配置文件創建了 test19,前文已經知道 1007:1007 的含義:

test19:x:1007:1007::/home/test19:/bin/sh

現在再來看一下 /home/test19,表示test19的家目錄。

pj@pj-pc:~$ ls /home/test19
ls: 無法訪問'/home/test19': 沒有那個文件或目錄

既然沒有這個目錄,我們自己創建:

// 創建目錄
pj@pj-pc:~$ sudo mkdir /home/test19
pj@pj-pc:~$ ls -l /home
drwxr-xr-x  2 root    root    4096 7月  18 15:08 test19
// 將 /home/test19 目錄及其所有子目錄和文件的所有者和所屬群組都修改為 test19
pj@pj-pc:~$ sudo chown -R test19:test19 /home/test19
pj@pj-pc:~$ ls -l /home
drwxr-xr-x  2 test19  test19  4096 7月  18 15:08 test19

Tip:chown 用於修改許可權,後面會講到。

現在路徑是/home/demo,切換 test19 登錄後,自動進入對應的家目錄:

pj@pj-pc:~$ pwd
/home/demo
pj@pj-pc:~$ su - test19
輸入密碼
$ pwd
/home/test19
$

Tip: 這裡如果使用 su test19,則不會進入該用戶的家目錄。su -su 是兩個命令,su -會同時載入該用戶的所有環境變數和配置文件。

用戶登錄的角度認識bash

所謂登錄,到底是登錄什麼?

有同學說是 linux。對也不對!linux前文我們說是 linux 內核,是深不見底的東西。是有什麼東西在協助我們?

是 Shell。表示 linux 內核外的一層殼。而 bash 是最知名的一種 shell。

現在 test19 最後一個欄位是 /bin/bash,表示該用戶登錄後,給他 bash。

test19@pj-pc:~$ tail -3 /etc/passwd
test19:x:1007:1007::/home/test19:/bin/bash
// 當前所使用的 shell 的路徑
test19@pj-pc:~$ echo $SHELL
/bin/bash

// 輸出當前 shell 的名稱
test19@pj-pc:~$ echo $0
-bash

Tip/bin 目錄下還有許多常用命令,比如vi,所有用戶都可以使用。

如果你將 test19 的 /bin/bash 改成 /bin/vi,登錄後就不會給bash,而是vi,感興趣的同學可以試一下。

我們還看到:

ntp:x:124:132::/nonexistent:/usr/sbin/nologin

nologin 就是禁止登錄,我們將其分配給 test19 看看會怎麼樣?

// sbin 就是 usr/sbin(sbin -> usr/sbin)
test19:x:1007:1007::/home/test19:/sbin/nologin

用戶無法登錄

pj@pj-pc:~$ su - test19
輸入密碼
// 這個帳號當前不可用
This account is currently not available.

Tip:不建議將 root 設置成這種登錄方式,對於初學者比較麻煩。

使用 sudo 切換用戶

前面我們用 su 切換用戶,相等於註銷當前用戶,換一個用戶來使用。

在日常中,較少使用 su,更多是使用 sudo

普通用戶直接查看 /root 不允許:

$ ls /root
ls: 無法打開目錄'/root': 許可權不夠

臨時使用 root 的用戶運行 ls /root

test19@pj-pc:~$ sudo -u root ls /root
模板  桌面
test19@pj-pc:~$ whoami
test19

Tip:直接使用 sudo 可能提示不在 sudoers 文件中,需要通過 visudo 命令修改 sudo 配置文件

test19@pj-pc:~$ sudo ls /root
輸入密碼
test19 不在 sudoers 文件中。此事將被報告。
pj@pj-pc:~$ sudo visudo

root ALL=(ALL:ALL) ALL
// 增加一行
// <用戶名> <主機名>=(<身份>:<終端>) <命令>
test19 ALL=(ALL:ALL) ALL

指定了 test19 用戶在任何主機、以任何用戶身份、在任何終端上都可以使用 sudo 命令

密碼管理

前面我們通過編輯配置文件 /etc/passwd 創建用戶,我們也知道用 passwd 給用戶創建密碼。

密碼沒有存在 /etc/passwd,而是在 /etc/shadow 中,加密之後保存的。例如搜索用戶 test19 的密碼:

pj@pj-pc:~$ sudo cat /etc/shadow |grep 'test19'
test19:$6$7ZkiOkEth7bdStHU$GWt/YVaD/KlJ5b21afWhqXPECRDj5tDmNBx.TDKW                                                                                                                                     6M2jd1jvtMlYFcrGVoWsmSkJ5hnIaEQyI8nLs4PDNJOm4.:19556::::::

雖然密碼並不是使用 md5sum 加密,但我們可以使用其模擬一下:

// 輸入不變,輸出也不變
pj@pj-pc:~$ echo -n '123456' | md5sum
e10adc3949ba59abbe56e057f20f883e  -
pj@pj-pc:~$ echo -n '123456' | md5sum
e10adc3949ba59abbe56e057f20f883e  -
pj@pj-pc:~$

本地用戶和遠程用戶

機器就在身邊是本地登錄,更多的是遠程登錄。

無論是本地登錄還是遠程登錄,都是 linux 本地賬號密碼

在一個系統中,如果兩個用戶都使用 root 身份進行登錄,一個是本地登錄,另一個是遠程登錄,那麼它們之間可能會互相不知道對方的存在。這種情況下可以被看作是一種多用戶管理模式,其中每個用戶都以獨立的身份登錄並運行各自的操作。

作者:彭加李
出處:https://www.cnblogs.com/pengjiali/p/17563624.html
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文介紹了C#面向對象編程語言的三個基礎特征:封裝、繼承和多態。其中,封裝可以通過public、private、protected、internal等關鍵字來實現,目的是保護程式內部數據的完整性;繼承可以幫助實現基類的內容復用,但也要結合場景使用;多態是指相同類型對象調用相同方法卻表現出不同行為,使... ...
  • ###內置日誌用法: 1. 引入**Microsoft.Extensions.Logging**命名空間:用於定義和實現日誌記錄功能 2. ILogger介面 a. 內置日誌系統的主要介面,用於記錄日誌信息,可以通過一來註入將ILogger實例註入到記錄日誌的類中,並使用它來記錄不同級別的日誌消息 ...
  • # 什麼?博客園主題比我的個人博客好看?😮 # 夢開始的地方🛸 最近逛博客園,發現我的園子還挺好看,但是還不夠好看,所以通過我百度發現SimpleMemory主題還可以繼續添加新的東西,當然這些東西不一定非得用SimpleMemory主題才行,但是搭配SimpleMemory主題是真的好看呀(比 ...
  • 前段時間小編檢查同事代碼,發現居然寫的太複雜看不太懂,代碼命名不規範,重覆冗長代碼一堆,這時候就可以通過重構來改進代碼的質量。代碼重構是提高代碼質量和可維護性的關鍵過程,它旨在通過優化代碼結構和設計來提高代碼的可讀性、可理解性和可擴展性。本文講述在C#中重構代碼的幾個案例,供大家參考。 **1、命名 ...
  • ## 一:背景 ### 1. 講故事 前幾天寫了一篇 `如何洞察 .NET程式 非托管句柄泄露` 的文章,文中使用 WinDbg 的 `!htrace` 命令實現了句柄泄露的洞察,在文末我也說了,WinDbg 是以侵入式的方式解決了這個問題,在生產環境中大多數情況下是不能走附加進程的模式,所以這也是 ...
  • 文章代碼分析基於linux-5.19.13,架構基於aarch64(ARM64)。 # 1. 前言 複雜IC內部有很多具有獨立功能的硬體模塊,例如CPU cores、GPU cores、USB控制器、MMC控制器、等等,出於功耗、穩定性等方面的考慮,有些IC在內部為這些硬體模塊設計了複位信號(res ...
  • 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接[ 微信公眾號「ENG八戒」](https://mp.weixin.qq.com/s/w8YV_TUb4QwsgChu3AspHg)[https://mp.weixin.qq.com/s/w8YV\_TUb4QwsgChu3AspHg](https ...
  • Atom N2600, N2800 的某些舊型號機器, 安裝 Ubuntu 時在安裝界面選擇安裝後, 啟動過程中會卡住, 或者數秒即黑屏, 再無反應. 這個問題對於Debian系的其他發行版 Lubuntu, Linux Mint, Debian 都一樣, 但是用Win PE盤可以正常啟動. 經各種... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...