---
# System prepended metadata

title: liunx Ubuntu 筆記
tags: [liunx]

---

---
tags  : liunx
title : liunx Ubuntu 筆記
---
#  Ubuntu 筆記

:::spoiler 關於 apt-get
:::success
apt-get 通常是對某些套件進行操作,可能是安裝或移除等等行為
(下載及安裝)
基本格式：apt-get [選項] [命令] [套件名稱1, 套件名稱2, …]
:::info
apt-cache 通常是用來取得套件的資訊

基本格式：apt-cache [命令] [套件名稱1, 套件名稱2, …]
參考資料:[apt-get 指令一覽](https://b9532026.wordpress.com/2010/03/30/apt-get-%E6%8C%87%E4%BB%A4%E4%B8%80%E8%A6%BD-2/)
:::

:::spoiler 關於軟連結與硬連結
1.使用方式：
ln [參數] source_file dist_file
:::success
ln -s test.txt test_softlink.txt
(這樣就會建立一個 test_softlink.txt 軟連結檔，指向 test.txt 這個檔案。)
ln test.txt test_hardlink.txt
(這樣就會建立一個 test_hardlink.txt 硬連結檔，指向 test.txt 這個檔案。)

-f 建立時，將同檔案名刪除。
-i 刪除前進行詢問。




                    
2.軟連結與硬連結的區別（通俗）：
硬連結可認為是一個檔案擁有兩個檔名，而軟連結則是系統新建一個連結檔案，此檔案指向其所要指的檔案。
:::warning
1.軟連線可以對一個不存在的檔名進行連線 。

2.軟連線可以對目錄進行連線。

3.硬連結檔是直接使用相同的 inode，所以不管是用相對路徑或絕對路徑，效果都相同。
4.軟連結的 inode 就會跟原始的檔案不相同。
5.硬連結會跟原來的檔案有相同的 inode。
:::info
參考來源:[ubuntu下的軟連結和硬連結](https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/429151/)
參考來源:[Linux 建立連結檔 ln 指令教學與範例](https://blog.gtwang.org/linux/linux-ln-command-tutorial-examples/)
:::

:::spoiler 關於systemd
:::success
如果要立即啟動服務:
systemctl start 服務名稱.servic
如果要立即停止服務:
systemctl stop 服務名稱.servic
(課本104)
:::

## BSAH 內建指令介紹
 :::spoiler alias : 定義指令及參數的別名
 allias=[-p] [別名] [=指令]
 :::success
 allias=[-p] [別名] [=指令]
 EX:$alias='./hello'
 alias -p 列出目前所有的別名設定
 unalias [參數][別名]
 unalias -a 移除所有已定義的別名
 :::
 
 
 :::spoiler cd : 切換目錄
:::success
EX : 切換目錄到/opt $cd /opt
EX : 切換目錄到上層 $cd ../
 :::
 
 
 :::spoiler declare : 宣告shell變數
 declare [參數] name[=value]
 :::success
 declare[參數]name[=value]
 顯示幕前的shell變數 declare
 顯示所有的環境變數 declare -x
 :::
 
 :::spoiler enable : 啟動或關閉shell的內建指令
 enable [-a]
 enable [-n] 指令
 :::success
 顯示幕前shell內建的指令 enable -a
 關閉shell內建的指令cd enable -n cd
 cd從shell內建指令中移除後，就無法執行改指令。
 若要將cd加回shell enable cd
 :::
 
 :::spoiler exit : 離開目前的shell
 exit
 簡單來說就是你多開終端機用exit就會關掉你所在的，也可以把終端機關掉。
:::

:::spoiler export : 宣告環境變數
export [參數]變數名稱[=變數設定值]
:::success
##### 宣告DOG變數的內容為yubi yubi
EX:export DOG=yubiyubi
echo $DOG 
輸出:yubiyubi

設定變數名稱為某一函數名稱 export -f
移除變數名稱 export -n
列出shell上的環境變數 export -p或不加
:::

:::spoiler help : shell內建指令說明
help (shell內建指令)
:::success
$help exit
:::

:::spoiler history : 列出使用過的指令
history [欲查詢最近使用過的指令個數][參數]
:::success
清除之前history的紀錄。 help -c
刪除history紀錄中指定編號的那一項。 history -d 編號
讀取尚未讀到的歷史紀錄。 history -n 歷史檔案
讀取history檔案，不會加上紀錄。 history -r 歷史檔案
複寫原有的history檔案。 history -w 歷史檔案

列出最近五個使用過的指令
EX:history 5
:::

:::spoiler unset : 移除變數設定
unset [參數] 變數
:::success
僅將函數移除。 unset -f
僅將變數移除。 unset -v

移除變數num的設定
EX:unset num
:::

## 檔案管理指令
:::spoiler du : 顯示目錄或是檔案大小
du [參數] [檔案]
:::success
顯示目前目錄的使用狀況。
$ du

顯示/var目錄下所有檔案的容量，僅顯示總計，並以KB為單位。
$ du -sk /var/*

:::

:::spoiler file : 顯示檔案類型
file [參數]
列出/var下的檔案。 $ ls /etc
列出目前目下的檔案，包含隱藏檔。 $ ls -a
以色彩表示檔案的屬性，並以長列表來表示。 $ ls -l --color=tty
以字母相反的順序表示。 $ ls -r
列出inodes的數目。 $ ls -i
[關於inodes]("https://www.itread01.com/content/1542281710.html")
:::

:::spoiler stat : 顯示檔案或檔案系統的狀態
stat [參數] 檔案或檔案系統
:::success
顯示檔案系統，而非單獨的檔案。 $ stat -f
顯示連結檔案。 $ stat -L
以簡單的模式列出資訊。 $ stat -t
顯示檔案report.txt的狀態。 $ stat report.txt
顯示檔案系統/dev/sdal的狀態。 $ stat -f /dev/sdal
:::

:::spoiler mkdir : 新增目錄
mkdir [參數] 目錄
:::success
在目前下新增一個名為data的子目錄。 $ mkdir data
新增一個目錄/data/www/test。 $ mldir /data/www/test

加上-p的參數，可以自動幫我們產生所有不存在的上層目錄。 
$ mkdir -p /data/www/test
:::

:::spoiler touch : 更改檔案的時間標記
touch [參數] 檔案名稱 
:::success
更改檔案被存取的時間。 $ touch -a
不要新增檔案。 $ touch -c
更改檔案被修改的時間。 $ touch -m
時間格式為MMDDhhmm。 $ touch -t 時間

新增一個名為test1的檔案。 $ touch test1

更改已存在檔案/ect/mail/access的時間標記。 

:::

:::spoiler cp : 複製檔案或目錄
cp [參數] 檔案名稱或目錄 檔案名稱或目錄 /路徑
:::success
覆蓋時會先備份，備份檔案會在字尾加~。 $ cp -b
強迫複製。 cp -f
交談模式，覆蓋檔案前會詢問使用者。 $ cp -i
保留原有檔案的屬性。 $ cp -p
遞迴處理，保留特殊檔案的屬性 $ cp -R
僅複製時間差異的檔案 $ cp -u

將檔案testfile複製為testfile1。 $ cp testfile testfile1
將/tmp目錄複製到目前的目錄之下。 $ cp -r /tmp ./
複製檔案時，保留原檔案的所有屬性。 $ cp -p /usr/bin/passwd ./
:::

:::spoiler mv : 移動或更名檔案或目錄
mv [參數] 來源檔或目錄 來源檔或目錄
:::success
若目的檔存在，在覆蓋時會將舊有檔案備份(在檔名後加上~)。 $ mv -b
強迫執行，若目的檔存在，則會強迫覆蓋。 $ mv -f
交談模式，覆蓋就檔時會先詢問使用者。 $ mv -i
在移動或是變更檔名時，若目的檔已經存在且檔案更新時間比來源新，則不會執行。 $ mv -u
列出詳細的過程。 $ mv -u


將檔案file1更名為file2。 $ mv file file2
將檔案file1移動到/tmp之下。 $ mv file1 /tmp/
將目錄/home/dir1更名為/home/dir2。 $ mv dir1 dir2

:::

:::spoiler rm : 刪除檔案或目錄
rm [參數] 檔案或目錄
:::success
直接刪除目錄，而不刪除目錄下的檔案。(暴力刪除法，詳細請閱062頁)。 $ rm -d
強制刪除檔案或是目錄。 $ rm -f
在刪除檔案或目錄之前，會先詢問使用者。 $ rm -i
將該檔案或是目錄底下的所有檔案與子目錄一併處理。 $ rm -r
顯示完整的執行過程。 $ rm -v

以交談模式刪除檔案。 $ rm -i abc*
強制刪除test這個目錄與目錄下的檔案與子目錄(若正確刪除，則不會有任何的輸出)
$ rm -rf test/

:::

:::spoiler diff : 比較並顯示檔案差異的部分
diff [參數] 檔案1 檔案2
:::success
比對file1與file2的不同。 $ diff file1 file2
比對file1與file2，並列出前後一行的異同 $ diff -c file1 file2
比對file1與file2，並以並列顯示。 $ diff -y file1 file2
:::

:::spoiler cat : 列出檔案內容
cat [參數] 檔案名稱
::: success
顯示/etc/hosts.allow的內容。
$ cat /etc/hosts.allow

顯示/etc/hosts.allow的內容，並在非空白列上標示編號。
$ cat -b /etc/hosts.allow

:::

:::spoiler tac : 將檔案內容由尾到頭的顯示
tac [參數] [檔案名稱]
:::success
將檔案由尾到頭相反的顯示。 $ tac aaa
:::

:::spoiler head : 輸出檔案內容最前面的部分
head [參數] 檔案名稱
:::success
顯示1.txt的前三行。
$ head -n 3 hosts.allow

顯示hosts.allow的前25個bytes。
$ head -c 25 1.txt
:::

:::spoiler less : 顯示檔案內容
less [參數][檔案名稱]
參考課本067頁
:::success
$ less vsftpd.conf
:::


:::spoiler more : 顯示檔案內容
more [參數] [檔案名稱]
:::success
瀏覽/etc/samba/smb.conf，每次顯示10行。
$ more -10 /etc/samba.conf
:::


:::spoiler nl : 加上檔案中的行列編號
pg [參數] [檔案名稱]
:::success
使用不同的編號位置。
$ nl /etc/hosts -w 2
編號每次增加3，並且在編號後面加上符號=。
$ nl /etc/hosts -i 3 -s=
:::

:::spoiler tail : 顯示檔案最後面的部份
tail [參數] [檔案名稱]
:::success
顯示/var/log/message的最後10行。
$ tail -n 10 /var/log/message
持續的監控/var/log/maillog這個檔案。
$ tail -f /var/log/maillog
:::

:::spoiler tee : 同時輸出到畫面與檔案中
tee [參數] [檔案名稱]
:::success 
使用tee新增一個檔案aaa。
$ tee aaa
(參考課本071頁)
同時輸出一列文字到檔案與畫面上。
$ echo "This is a test line" |tee test.txt
:::



## 文書編輯
### vi編輯器
:::success
1. 輸入vi進入編輯環境。
2. 一開始入的是命令模式，在任何模式裡按下esc鍵就會回到命令模式。
3. 按下i進入插入模式。(簡單來說就是可以編輯了)
4. 在命令模式輸入[:]進入底線模式。
:::info
底線模式指令
處存並離開。 :wq
存檔。 :w
強迫存檔，如果要寫入唯讀檔，則必須是檔案的擁有者。 :w!
令存檔名為name的新檔。 :wname
離開vi。 :q
強迫離開vi(捨棄變更)。 :q!
編輯名稱為name的檔案。 e name
再編輯，捨棄原先的邊更。 e!
編輯下一個檔。若使用 vi file1 file2，在編輯完file1後使用此指令，即可編輯file 2。 n
顯示目前的檔名，游標所在的行數以及比例。 f
:::

### nano編輯器
###### tags: 待施工



## 在Liunx Ubuntu 使用C
:::spoiler 安裝C編譯器
:::success 
首先打開終端機，安裝前先更新一下：
    $ sudo apt-get update
    $ sudo apt-get upgrade
安裝編譯器與vim：
    $ sudo apt-get install vim
    $ sudo apt-get install build-essential
    $ sudo apt-get install libc6-dev
安裝man page---查詢指令的時候可以使用
    $ sudo apt-get install manpages
    $ sudo apt-get install manpages-posix
    $ sudo apt-get install manpages-posix-dev
    $ sudo apt-get install manpages-dev
  參考網站:[在Ubuntu上的第一支C語言程式](https://hanmajor.blogspot.com/2013/10/ubuntuc.html)
:::



:::spoiler 關於編輯C
### 開啟編輯
$ vim hello.c or $ nano hello.c
:::success
###  Hello.c

```cpp=
#include<stdio.h>
int main(){
printf("Hello\n");
return 0;
}
```
:::info
### 編譯 hello.c
$gcc hello.c -o hello
將 hello.c 的內容編譯到 hello 成可以執行的檔案
### 執行 hello.c
$ ./hello
:::

## 訊號管理
:::info


要了解所有的訊號，可執行kill -1 or trap -1來看系統有哪些signal。
需要記住的只有終止程序六個:
:::success
SIGHUP -1 掛斷訊號。
SIGINT -2 如同Ctrl+c的作用。
SIGKILL -9 強制中止。
SIGTERM -15 預設中止訊號。
SIGUSR1 -10 使用者自訂的訊號。
SIGUSR2 -12 使用者自訂的訊號。
:::info
要強制中止程序。我們要先知道程序的PID為何，在利用指令中止該程序。
如:某程序為akua
kill -SIGKILL akua
or
kill -s -SIGKILL akua
or
kill -9 akua
::: danger
如果不家參數直接kill aqua等同於傳遞SIGTERM的訊號
:::

## 檔案與目錄結構

### ls -l 
:::success
我們可以藉由第一個值去了解該檔案或是目錄的種類。
*   [-] 一般檔案
*   d 目錄
*   l 連結
*   b block special
*   c character special
*   s socket
:::

## 帳號與權限
UID 是User ID的簡稱，為帳號識別碼。UID位於/etc/passwd的第三欄位。
### 帳號管理
#### 新增帳號指令
:::success
useradd [-u UID][-g GID][-c 註解][-s shell][-m] 帳號名稱
:::info
* c 備註 被祝文在加在/etc/passwd中第五欄位置。
* d 根目錄 指定使用者登入石所進入的目錄，並賦予使用者對該目錄的完全控制全。
* D 變更建立帳號的預設值。 -b 根目錄;-e有效日期;-f緩衝日數;-g主群組;-G次群組;-s shell
* e 有效日期 格式YYYY-MM-DD，將儲存在/etc/shadow。
* g 主群組。
* G 次群組。
* m 建立使用者的根目錄，並將/etc/skel當中的檔案複製到使用者根目錄下。
* o 允許建立相同uid使用者。
* p 密碼
* s shell
* u uid
:::

#### 修改帳號指令
:::success
usermod [-u UID][-g GID][-c 註解][-s shell][-m] 帳號名稱
:::info
修改參數與新增帳號相同。
:::
#### 刪除帳號指令
:::success
userdel [-r] 帳號名稱
:::info
不加-r會保留帳號的加目錄，加上會連同家目錄一起刪除。
:::

#### 群組管理
:::success
- 新增群組指令:groupadd
  - groupadd[-g GID] 群組名稱
- 管理群組成員指令:gpasswd
   - 將使用者user加入群組group1:gpasswd -a user group1
   - 將使用者user移除群組group1:gpasswd -d user group1
- 刪除群組指令:groupdel
  - groupdel 群組名稱
:::

#### /etc/passwd
是一個文字檔，包含帳號的相關資訊。
:::info
帳號:密碼:UID:GID:備註:目錄:shell
:::
#### /etc/shadow
是一個文字檔，包含帳號的相關資訊。
:::info
登入名稱:加密密碼:上次密碼變更日其:密碼最短使用期限:密碼過期警告期限:密碼暫停使用期限:保留欄位
:::
#### /etc/group
是一個文字檔，定義群組名稱、GID以及帳號的對應。
:::info
group_name:passwd:GID:user_list
:::
##### 	新增使用者帳號並在新增時指定經典的預設值
請新增一個使用者帳號

該帳號的shell必須為BASH，且有屬於它自己的家目錄。

請在新增後，切換為該使用者，並用cd回到他的家目錄。

:::success
![](https://imgur.com/7Hf3uyj.jpg)

:::






