# **【Linux 一條龍架站】ft.常見指令**
:::info
* 安裝 Linux through ubuntu server
* Linux 常見指令
* 設置 MariaDB(mysql)
* 設置 MongoDB
* 設置 Apache2、PHP、NOIP
* 設置 NFS、SAMBA
:::
## 安裝 Linux
#### :+1: **下載Server版**
destop版也可以,但容量差很~大
直接看網友文章~
:::spoiler
[VirtualBox 安裝 Ubuntu Server 設定與教學-使用 subiquity 安裝程式](https://www.kjnotes.com/linux/102)
:::
#### :+1: **系統更新**
```=
sudo apt-get update
sudo apt-get upgrade
```
#### :+1: **安裝基本net-tool、openssh、git、MariaDB(mysql)、MongoDB**
```=
sudo apt install net-tools (=> ifconfig 可以查看ip)
sudo apt-get install openssh-client
sudo apt install git
sudo apt install mariadb(mysql)-server
sudo apt install mongodb
```
#### :+1: **安裝Python**
```=
python3 --version
sudo apt install python3-pip
```
> Python 套件
>sudo pip list
>sudo pip install pymysql
>sudo pip install selenium
>sudo pip install pandas......
#### :+1: **設置root密碼**
```=
sudo passwd root
```
#### :+1: **建立使用者**
```=
sudo adduser newusername
sudo passwd newusername
- PS /etc/default/useradd (可以看到創建使用者的規則)
```
切換到使用者,試試看能不能登入
```=
su - newusername
```
#### :+1: **刪除使用者**
```=
sudo passwd sudo userdel newusername
```
#### :+1: **創群組,把使用者加入**
```=
sudo groupadd groupname
sudo usermod -aG groupname newusername (加到特定組別)
sudo usermod -aG sudo newusername (加到sudo組,就可以擁有sudo權限)
- PS cat /etc/group (查看所有GROUP訊息)
- PS id <username> (查看特定用戶的身分訊息)
```
#### :+1: **刪除群組**
```=
sudo groupdel groupname
```
#### :+1: **直接給予使用者root權限**
```=
sudo visudo
%<username> ALL=(ALL) ALL
```
#### :+1: **也可以創文件群組**
沒特別設置時,文件的群組通常是文件創建者的主要群組,但可以更改文件的群組,來控製文件的訪問權限
```=
chgrp newgroup myfile.txt
- PS chown newowner:newgroup filename (一起更改文件所有者和群組)
```
#### :+1: **搭配grep**
```=
sudo grep emp1 /etc/group (在 /etc/group 文件中搜尋包含 emp1 的行)
```
```=
sudo groupadd -g 1100 devb (創建一個名為 devb 的群組,同時指定群組ID(GID)為 1100)
```
#### :+1: **設立時區、語言**
```=
sudo dpkg-reconfigure tzdata
sudo dpkg-reconfigure locales ( zh_TW.UTF-8 UTF-8)
```
#### :+1: **crontab 設置排程**
```=
crontab-e
sudo systemctl status cron (查看crontab狀態)
sudo systemctl restart cron (正常修改完crontab -e是不用重啟的。)
```
```=
30 10 * * * echo "hello world" >> /home/catalina/hello_01.txt (每天的10:30)
0 */6 * * * echo "hello world" >> /home/catalina/hello_01.txt (每六小時)
30 22 * * * python3 ~/ptt.py >> ~/cron_ptt.log 2>&1 (22:30運行Python腳本ptt.py,並輸出到cron_ptt.log)
```
```=
ps aux | grep ptt.py (確認所有python運行狀態)
cat cron_ptt.log (查看log紀錄)
```
練習
```=
mkdir scripts (/home/cata下,創建一個資料夾,專門用來放shell script 檔案)
cd scripts (/home/cata/scripts)
vi date_1.sh (資料夾中創建一個.sh檔案,/home/cata/scripts/date_1.sh)
[進入後輸入資料,目的是獲取當前日期和時間,輸入到指定檔案]
#!/bin/bash
mdate=`date`
echo $mdate >> /home/cata/date_1.txt (> 覆蓋 >> 附加)
crontab -e (設定排程、log檔)
0 20 * * * /bin/bash /home/cata/scripts/date_1.sh >> /home/cata/scripts/date_1.log 2>&1
```
直接看網友文章補充~
:::spoiler
[Ubuntu 排程設定 :Crontab 排程使用教學](https://jqnets.com/blog/ubuntu-%E6%8E%92%E7%A8%8B%E8%A8%AD%E5%AE%9A-%EF%BC%9Acrontab-%E6%8E%92%E7%A8%8B%E4%BD%BF%E7%94%A8%E6%95%99%E5%AD%B8/)
:::
<br/>
## Linux 常見指令
#### :+1: **查看現在位置**
```=
pwd
```
#### :+1: **到指定位置**
```=
cd
cd ..(回到上一層)
cd - (回到前一步驟用的目錄)
cd ~ (回到home/)
```
#### :+1: **複製資料**
```=
cp <來源> <目的> (複製檔案)
cp-r <來源> <目的> (複製資料夾)
```
#### :+1: **刪除資料**
```=
rm <檔案> (刪除檔案)
rm -r <檔案> (刪除資料夾)
rm -rf <檔案> (強制刪除檔案)
```
#### :+1: **移動資料**
```=
mv <原路徑> <新路徑> (移動檔案 剪下 貼上)
mv <原檔名> <新檔名> (重新命名)
```
假設home/catalina/file_1 要移去 home/josh/
=> 現在在home/catalina => mv file_1 /home/josh/
=> 現在在home/josh => mv /home/catalina/file_1 .
#### :+1: **查看資料夾,列出子目錄和文件**
```=
ls
ls -l (簡稱ll,詳細列表(long listing))
ll -h or ls -h (使用容易觀看單位,KB、MB 等單位,而不是字節數)
ll -lh or ls -lh (詳細列表+容易觀看單位)
- PS ll AAA/BBB or ls AAA/BBB,例如: ls -lh /var/lib/mysql/test/
(可以直接查看指定位置資料夾)
```
#### :+1: **印資料夾檔案目錄到特定文件**
```=
ls /bin/ > bin1.txt
```
假設我在/home/catalina 操作ls /bin/ > bin1.txt,bin1.txt /home/catalina,而非 /bin
#### :+1: **查看單一文件**
```=
cat <filename>
less <filename> (分頁查看)
- PS history | less (查看歷史指令)
```
#### :+1: **打開單一文件**
```=
vi or vim <filename>
```
>進到文件後
o 新增一行
yy 複製
30yy 複製30行
u 上一步
dd 刪除
p 貼上
G 跳到最後一行
esc + : + q! (跳出,不儲存)
esc + : + wq (跳出,儲存)
#### :+1: **印進檔案**
```=
echo "hello linux!" > hello.txt
```
#### :+1: **複製到新檔案**
```=
cat hello.txt > hello2.txt
```
#### :+1: **創建資料夾**
```=
mkdir <filename>
- PS mkdir /home/catalina/AAA/BBB/CCC (原本沒有的資料夾,會顯示錯誤)
- PS mkdir -p /home/catalina/AAA/BBB/CCC (加了p,原本沒有的資料夾,會自動被建立)
```
#### :+1: **刪除整個資料夾**
```=
sudo rm -rf /home/catalina/AAA/BBB/CCC
```
#### :+1: **清空畫面**
```=
clear
```
#### :+1: **導向到log**
對的到right.log,錯的到wrong,log
```=
ls hello.txt xxxx 1> right.log 2> wrong.log
```
#### :+1: **純打包 package.tar**
```=
tar -cf package.tar bin*
tar -tf package.tar (顯示內容)
```
#### :+1: **壓縮打包 package.tar**
```=
tar -czf gzip_package.tar bin* (使用gzip技術)
zip gzip_package.zip -r .
tar -cjf bzip2_package.tar bin* (使用bzip技術)
tar -cJf xz_package.tar bin* (使用xz技術)
```
#### :+1: **解壓縮**
安裝套件
```=
sudo apt-get install zip unzip
```
建立資料夾,解壓縮至資料夾
```=
mkdir unzip_folder
unzip gzip_package.zip -d unzip_folder
```
練習
```=
wget {網址} (下載檔案)
unzip Daily_2023_09_24.zip -d ./ (解壓縮檔案)
less Daily_2023_09_24.csv (查看檔案)
grep TX Daily_2023_09_24.csv | less (搜尋關於TX)
grep ,TX Daily_2023_09_24.csv | less (搜尋關於,TX)
```
#### :+1: **chmod命令 => 更改文件和目錄的權限**
所有人可讀,只允許文件擁有者寫入
```=
chmod 644 [example.txt]
```
只允許文件擁有者讀
```=
chmod 400 [example.txt]
```
只允許文件擁有者讀+寫入
```=
chmod 600 [example.txt]
```
>文件所有者(User)具有讀取和寫入權限(rw-)
>所屬組(Group)沒有權限(---)
>其他用戶(Others)沒有權限(---)
folder下所有文件,只允許文件擁有者讀+寫入
```=
chmod -R 700 myfolder
```
只允許文件擁有者讀+寫入+執行
```=
chmod 771 [script.sh]
```
>文件所有者(User)具有讀取、寫入和執行權限(rwx)。
>所屬組(Group)具有讀取、寫入和執行權限(rwx)。
>其他用戶(Others)具有讀取和執行權限(r-x)
#### :+1: **查詢登入紀錄**
```=
last -5 查詢登入紀錄 (最近五筆)
last -5 <username> 查詢登入紀錄 (特定使用者)
last -s -7dyas 查詢登入紀錄 (七天內)
```
#### :+1: **查看用戶訊息**
```=
w (查看目前登入的用戶訊息)
w <username> (查看指定的登入紀錄、詳細訊息)
sudo cat /etc/passwd (查看所有用戶的登入紀錄、詳細訊息)
```
#### :+1: **移動檔案**
```=
mv my_file ../ (到上一層)
```
<br/>
## 設置 mysql(MariaDB) [參考](https://developer.aliyun.com/article/758177)
#### :+1: **前面安裝好了,直接啟動**
```=
sudo systemctl start mariadb
```
>查看狀態: sudo systemctl status mariadb
>開機時直接啟動: sudo systemctl enable mariadb
#### :+1: **切換到MariaDB(mysql)**
```=
sudo mysql -uroot -p
```
#### :+1: **更改root密碼**
```=
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
```
#### :+1: **創建使用者、使用者密碼**
```=
CREATE USER 'username' IDENTIFIED BY 'password';
```
#### :+1: **給予用戶權限**
```=
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%'; (所有權限)
GRANT SELECT, INSERT ON mydb.* TO 'username'@'%';
select Host,User,authentication_string from mysql.user (查詢權限)
```
>ALL PRIVILEGES:執行所有操作
>SELECT:檢索數據。
>INSERT:插入新數據
>UPDATE:更新數據
>DELETE:刪除數據
>CREATE:創建新數據庫和表
>DROP:刪除數據庫和表
>ALTER:更改表結構
>GRANT OPTION:將其擁有的權限授予其他用戶
>SHOW DATABASES:查看可用的數據庫列表
>SHOW TABLES:查看特定數據庫中的表列表
>CREATE USER:創建新用戶
>SUPER:root權限
>REPLICATION CLIENT:複製客戶端狀態
>REPLICATION SLAVE:複製伺服器
>FILE:讀取和寫入系統文件
>PROCESS:查看所有正在運行的進度
>SHUTDOWN:關閉數據庫服務器
>CREATE TEMPORARY TABLES:創建臨時表
>LOCK TABLES:鎖定表,防止其他用戶對表進行更改
>EXECUTE:執行存儲過程
>REFERENCES:引用外鍵
>CREATE ROUTINE:創建儲存過程和函數
>ALTER ROUTINE:更改儲存過程和函數
>EVENT:創建和管理事件
>TRIGGER:創建觸發器
#### :+1: **如果用AWS/GCP要外部連線**
下載 putty gen ,輸入主機的外部IP產金鑰,再到AWS/GCP設定金鑰即可
直接看網友文章補充~
:::spoiler
[[教學] 使用 PuTTYgen 產生 SSH 連線 RSA、DSA 公鑰與私鑰](http://www.techcoke.com/2017/01/puttygen-ssh-rsa-dsa-public-private-key-pair.html)
:::
<br/>
## 設置 MongoDB [參考]([https://developer.aliyun.com/article/758177](https://www.mongodb.com/docs/manual/tutorial/install-mongodb-on-ubuntu/))
#### :+1: **前面安裝好了,直接啟動**
```=
sudo systemctl start mongodb
```
>查看狀態: sudo systemctl status mongodb
>開機時直接啟動: sudo systemctl enable mongodb
#### :+1: **切換到MongoDB**
```=
mongo --username your_username --password your_password --authenticationDatabase admin
```
#### :+1: **創建使用者、使用者密碼**
```=
mongo
use admin
db.createUser(
{
user: "root",
pwd: "your_root_password",
roles: [ { role: "root", db: "admin" } ]
}
)
```
#### :+1: **給予用戶權限**
```=
db.grantRolesToUser("catalina", [
{ role: "read", db: "mydb" },
{ role: "readWrite", db: "mydb" }
])
```
>read: 讀取操作(find)。
>readWrite: 讀取+寫入操作(find、insert、update、remove)
>dbAdmin: 在指定數據庫上執行管理操作,如索引、查看統計信息等
>dbOwner: 在指定數據庫上執行任何操作,類似於root權限
>userAdmin: 可以管理數據庫中的用戶,如創建和刪除用戶、更改用戶密碼
>clusterAdmin: 執行集群級別的操作,如復制集和分片集群的管理
>backup: 備份數據庫
>restore: 執行恢復數據庫
>changeStream: 使用 changeStreams 監控數據庫的變化
>readAnyDatabase: 在任何數據庫上執行讀取操作
>readWriteAnyDatabase: 在任何數據庫上執行讀取和寫入操作
>userAdminAnyDatabase: 在任何數據庫上管理用戶
>dbAdminAnyDatabase: 在任何數據庫上執行管理操作
>clusterManager: 具有集群管理權限
>restoreAnyDatabase: 恢復任何數據庫
<br/>
```
比較
use admin
// 創建用戶並為其分配 restore 角色(僅限於 mydb 資料庫)
db.createUser({
user: "backupuser",
pwd: "backupuser_password",
roles: [
{ role: "restore", db: "mydb" }
]
})
-------------------------------------------------------------
use admin
// 創建用戶並為其分配 restoreAnyDatabase 角色(允許在任何資料庫上執行恢復操作)
db.createUser({
user: "adminuser",
pwd: "adminuser_password",
roles: [
{ role: "restoreAnyDatabase", db: "admin" }
]
})
```
#### :+1: **更改密碼**
```=
db.changeUserPassword("root", "new_password")
db.auth("root", "new_password") (確認是否更改成功)
```
<br/>
## **設置 Apache2、PHP、NOIP**
#### :+1: **Apache2: 配置Web 服務器**
安裝、啟動
```=
sudo apt update
sudo apt install apache2
sudo service apache2 start
```
#### :+1: **PHP 安裝、啟動**
```=
sudo apt install php
```
Apache 讀 css/js/php 檔要改文件
```=
/etc/apache2/httpd.conf
or
/etc/apache2/apache2.conf
```

改好後重啟
```=
sudo systemctl restart apache2
```
#### :+1: **NOIP:設置個人化網址 [參考](https://www.jmjc.tech/article/14)**
安裝、啟動
[註冊NOIP](https://www.noip.com/)
安裝客戶端
```=
apt install make
apt install make gcc
```
建立NOIP資料夾
```=
cd ~
mkdir noip
cd noip
```
下載、解壓縮、安裝客戶端
```=
wget http://www.no-ip.com/client/linux/noip-duc-linux.tar.gz
tar vzxf noip-duc-linux.tar.gz
cd noip-2.1.9-1
sudo make
sudo make install
```
會遇到詢問
```=
Do you wish to run something at successful update? 回答 [N] (y/N)
如果成功,會設置新的no-ip2.conf ,查看 sudo vim /usr/local/etc/no-ip2.conf 文件
```
啟動NOIP
```=
sudo /usr/local/bin/noip2
sudo /usr/local/bin/noip2 -S (查看啟動後狀態)
```
設置開機自動啟動NOIP
```=
sudo crontab -e
最後一行加:@reboot /usr/local/bin/noip2 (如果是本機機台,每次開機都要執行一次sudo /usr/local/bin/noip2,因此設開機自動執行)
```
關閉NOIP
```=
sudo killall noip2
```
確認是否綁定IP成功
```=
ping -no-ip hostnanme
```
設置動態DNS設定檔
```=
sudo apt install ddclient
sudo vi /etc/ddclient.conf
(進設定檔後,protocol=dyndns2
use=web, web=checkip.dyndns.com, web-skip='[NOIP設置的網址,0000.ddns.net]'
server=members.dyndns.org
login=group_3
password='[NOIP設置的密碼]')
```
啟動DNS
```=
sudo systemctl start ddclient
```
如果換NOIP網址,要重新配置 NO-IP、改DNS設定檔
```=
sudo /usr/local/bin/noip2 -C
sudo systemctl start ddclient
```
#### :+1: **放置 Web code 到指定位置**
以上都完成後,html/css/js 或 php 檔案放到指定位置就能成功配置了
```=
/var/www/html/index.html
```
<br/>
## **設置 NFS、SAMBA**
#### **:+1: NFS: 讓遠端機台使用者們可以共享特定資料夾 [參考1](https://magiclen.org/ubuntu-server-nfs/) [參考2](https://officeguide.cc/linux-nfs-server-client-installation-configuration-tutorial-examples/)**
加載、安裝NFS
```=
sudo modprobe nfs
sudo modprobe nfsd
sudo apt install nfs-kernel-server
sudo apt-get install rpcbind
```
啟動NFS
```=
sudo systemctl start rpcbind
```
查看狀態
```=
sudo systemctl status rpcbind
```
查看監聽極端口
```=
sudo netstat -tulnp | grep rpc.mountd
sudo netstat -tuln | grep :2049
```
設置防火牆
```=
sudo ufw allow from [your ip] to any port nfs
```
設置共享資料夾及權限
```=
/home/share/
140.137.219.56(rw,sync,no_subtree_check,crossmnt,fsid) 140.137.219.0/24(ro,sync,no_subtree_check) (ro 只讀,rw 讀寫權限)
sudo exportfs -r
```
掛載在指定的資料夾
```=
sudo mount -t nfs ip:<分享位置> <掛載位置>
sudo mount -t nfs [your ip]:/home/NFS/ /home/catalina/nfs_share/
```
掛載成功後,可以直接使用putty連線
```=
cd /home/catalina/nfs_share
```
<br/>
#### **:+1: SAMBA: 用於在不同操作系統之間(Linux/Unix系統與Windows系統)文件共享 [參考](https://hollyqood.wordpress.com/2016/12/08/virtualbox%E8%99%9B%E6%93%AC%E6%A9%9Fubuntu%E4%BD%BF%E7%94%A8samba%E5%9C%96%E6%96%87%E6%95%99%E5%AD%B8/)**
安裝SAMBA
```=
sudo apt-get install samba
```
更改設定檔
```=
sudo gedit /etc/samba/smb.conf
第一個 [global],加上
workgroup =WORKGROUP
也可以加上,可以使用Symbolic Links及禁用Unix文件
wide links = yes
follow symlinks = yes
unix extensions = no
第二個 [設置要分享資料夾的名稱]
comment = Share
path = /home/share
read only = no
writable = yes
browseable= yes
create mask = 777
directory mask = 777
valid users = username
```
重啟
```=
sudo /etc/init.d/smbd restart
```
查看虛擬機IP
```=
ifconfig
```
本機端電腦


安裝smbclient連線
```=
sudo apt install smbclient
```
設帳號密碼
```=
sudo smbpasswd -a <username>
```
使用smbclient,連接到Samba共享
```=
smbclient //[your ip]/share -U <user>
```
掛載Samba,共享到本地目錄
```=
smbclient//<ip>/<share fold> -U <user> [SAMBA] : 密碼,英文名
```
掛載位置
```=
sudo mount -t cifs //140.137.219.94/share /home/ivy/share -o username=ivy,password=ivy
```
設置防火牆,不影響samba執行
```=
sudo ufw allow Samba
sudo ufw status
sudo ufw disable
sudo ufw status
```
重啟
```=
sudo /etc/init.d/smbd restart
```
查看狀態
```=
systemctl status smbd (/home)
```
查看設定檔
```=
sudo testparm (/home/share)
```