## 文件操作和用戶 ### 複製移動和刪除 在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
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。