---
# System prepended metadata

title: linux notes
tags: [informatics]

---

###### tags: `informatics`
# linux notes
### ==SSH帳密連線==
#### ---方法1 : 利用帳密連線方式登入server ---
 
```=
#open firewall
ufw enable && ufw allow 22

#要安裝 ssh server, 以下兩行指令都可以
 apt  install ssh
//apt-get install openssh-server

#安裝後可以修改一些 ssh 的設定, 如port, 密碼認證, root登入等
nano /etc/ssh/sshd_config
Port 22
PermitRootLogin no -> 是否開放 root 登入
PasswordAuthentication  yes
#更改完存檔後記得重啟服務
/etc/init.d/ssh restart
```

#### ---方法2 : 利用憑證方式登入server ---
##### server端架設ssh
```=
#open firewall
ufw enable && ufw allow 22
#要安裝 ssh server, 以下兩行指令都可以
apt-get install ssh
//apt-get install openssh-server

#安裝後可以修改一些 ssh 的設定, 如port, 密碼認證, root登入等
nano /etc/ssh/sshd_config
Port 22
PermitRootLogin no
PubkeyAuthentication    yes
PasswordAuthentication  no
#更改完存檔後記得重啟服務
/etc/init.d/ssh restart
```
##### ssh架設完後，需要把user public key資訊寫到server端對應使用者檔案 \(/home/user/.ssh/authorized_keys)
```=
#先在server找到/user/.ssh/authorized_keys文件(若沒有則創建一個)

#複製client的公鑰資訊到server的 /user/.ssh/authorized_keys文件中
    or (ssh-copy-id -i {public_key.pub} -p 22 user@host)
    
#可以到server端檢查是否成功寫入 
    nano /user/.ssh/authorized_keys
```
##### 登入server
```=
ssh -i {private_key} -p 22 user@host
```
##### optional : 建立新的key pair
```=
#user端產生新公鑰
ssh-keygen
#產生檔案會放在 user端使用者的 .ssh 目錄
id_rsa.pub 為pub key
id_rsa 為 private key
```

#### ---方法3 : ssh-setup自動化腳本 ---
```=
#ssh.sh
#!/bin/bash
# auto-setup-ssh
apt update
ufw enable && ufw allow 22
apt install ssh -y
echo 'Include /etc/ssh/sshd_config.d/*.conf
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem	sftp	/usr/lib/openssh/sftp-server
Port 22
PubkeyAuthentication    yes
PasswordAuthentication  no' > /etc/ssh/sshd_config
/etc/init.d/ssh restart
echo 'ssh setup done !'
exit 0
```

### ==linux 更改使用者密碼==
##### ---需要sudo全限---

```
passwd
```


### ==linux 增加使用者==
##### ---ubuntu user管理，建立使用者、刪除使用者---
*需要root權限，所以要先切換到 root*
```
新增使用者
adduser [username]
刪除使用者
userdel [username]
```
```
使用者檔案存放在/etc/passwd

使用tail指令來檢視/etc/passwd檔案

tail 從後面觀看，這個指令對比較長的檔案檢視比較方便。

指令：tail -[要觀看的行數]
```

### ==linux 變更程式的權限==
```
r：可讀
w：可寫入
x：可執行
```
```
owner/group/others
r w x r w x r w x
4 2 1 4 2 1 4 2 1
```
```
chmod 777 file
```

### ==Droopy==
##### ---簡單的檔案分享server---
```
一、下載至/usr/bin並賦予執行權限

sudo wget -P /usr/bin http://stackp.online.fr/wp-content/uploads/droopy

sudo chmod +x /usr/bin/droopy

二、在終端機中執行

droopy -d DIRECTORY -m MESSAGE -p PICTURE --dl PORT

DIRECTORY 為接收上傳檔案的目錄
MESSAGE 為Droopy網頁上的宣言　若其中有空格請用單引號夾住整句
PICTURE 為Droopy網頁上代表自己的圖像
若有加 --dl 則分享該目錄中的檔案
若有加 PORT(通訊埠的埠號) 則使用該通訊埠　沒加則使用預設的8000

EX: droopy -d ~/share -m 'folder share' -p /share/ccc.jpg --dl 8888

若是無法執行
> whereis droopy
> 並用nano開啟droopy
>apt install python2
> #!/usr/bin/python修改為#!/usr/bin/python2
>表示採用Python2編譯



三、關閉droopy
 
 Ctrl+c 

```

### ==強制刪除 process==
```
sudo kill -KILL [process_ID]
```

### ==ffmpeg 指令==
```
ffmpeg -i "[m3u8]" -bsf:a aac_adtstoasc -vcodec copy -c copy -crf 50 media.mp4

```


### ==port 占用==
##### ---找出誰占用並且kill---
*需要root權限，所以要先切換到 root*
```
netstat -ltnp | grep :[port]
```


### ==內部防火牆設定==
##### ---先檢查防火牆狀態---

```
sudo ufw status   檢查防火牆狀態
------------------------------------------------
啟用和停用防火牆
$ sudo ufw enable
$ sudo ufw disable
------------------------------------------------
$ sudo ufw default allow  允許任何的連入要求
$ sudo ufw default deny   不允許任何的連入要求
------------------------------------------------
使用服務名稱 或 port來允許連入
<服務名稱請參考 /etc/services 檔案>
$ sudo ufw allow [name]
$ sudo ufw allow in [port]
------------------------------------------------
使用 Port 號來拒絕連出到別台電腦的指定 Port 號
$ sudo ufw deny out [port]
------------------------------------------------
使用 Port 號來拒絕接受指定 Port 號的 UDP 連入要求
$ sudo ufw deny in [port]/udp
------------------------------------------------
刪除規則防火牆規則
$ sudo ufw status numbered   (確認規則編號)
$ sudo ufw delete 規則號碼
------------------------------------------------
啟用日誌記錄
如果想知道防火牆到底有沒有用或是規則有沒有達到效果的話
可以用下面的指令來啟用日誌功能，在啟用後，ufw 會把記
錄寫到 /var/log/ufw.log 日誌檔。
$ sudo ufw logging on


```

### ==port 占用==
##### ---找出誰占用並且kill---
*需要root權限，所以要先切換到 root*
```
netstat -ltnp | grep :[port]
```


### ==下載google drive 檔案==
#####

```
取得檔案的 ID編號
如果是別人給的連結，可以找到像這樣的編碼，粗體的部分就是ID編號：https://drive.google.com/file/d/1TQYQYCoPtdXN2rQ1mR2jisjUztmOzfZr/view

如果是要下載自己雲端硬碟中的檔案，可以點兩下開啟半透明黑色預覽介面或是按「共用」-> 
「透過連結共用」-> 複製連結。 接著網址或連結中就會有很像這樣的編碼，粗體的部分就是ID編號：https://drive.google.com/file/d/1ugOA150E29M-ff4xZQ-khZunpmh9fQiZ/view?usp=sharing

2. 使用指令下載。以100MB為分界，區分Google雲端硬碟檔案為大檔案 或 小檔案：

對於大檔案

wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=ID編號' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=ID編號" -O 下載後的檔名 && rm -rf /tmp/cookies.txt
對於小檔案

wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=ID編號' -O 下載後的檔名
把這段貼到Terminal中，就能用wget下載啦！
```

### ==rsync 備份==
##### ---使用 rsync 遠端檔案同步與備份工具---
Linux上最常被用來複製與備份檔案的工具，它可以處理本機或遠端的檔案同步工作
```
1.安裝rsync
$ sudo apt-get install rsync
-------------------------------------
<rsync 參數 來源檔案 目的檔案>
-v：verbose 模式，輸出比較詳細的訊息。
-r：遞迴（recursive）備份所有子目錄下的目錄與檔案。
-a：封裝備份模式，相當於 -rlptgoD，遞迴備份所有子目錄下
   的目錄與檔案，保留連結檔、檔案的擁有者、群組、權限以及時間戳記。
-z：啟用壓縮。自動將資料壓縮後再傳送，
   並在遠端接收到資料後自動解壓縮，減少網路傳輸的資料量
-h：將數字以比較容易閱讀的格式輸出。
--progress : 可以即時顯示進度
-------------------------------------
2.複製local端的檔案或目錄,到目標位置
  執行第二次時，rsync就會自動跳過沒有變動的檔案
$ rsync -avh [filename or folder] [target folder]
特殊port (ex:port11)
rsync -avzh --rsh='ssh -p11' [localfiles] root@ip:/remotebackup/
-------------------------------------
3.遠端備份
(不同機器間備份)
$ rsync -avzh [filename or folder] user@ip:[targetfolder]
example:
rsync -avzh /folder/ root@35.194.207.60:/backup/
-------------------------------------
4.遠端的檔案備份至local端
$ rsync -avzh user@ip:[filename or folder] [target folder]
example:
rsync -avzh root@35.194.207.60:/folder /mybackup/
-------------------------------------
5.限制網路頻寬
  避免透過網路備份資料時，佔用太大的網路頻寬而影響正常的服務
  加上 --bwlimit 指定資料傳輸的速度上限
example:
rsync -avzh --bwlimit=100K root@ip:/folder /backup/
-------------------------------------
6.自訂 SSH 連接埠
  若遠端機器ssh連線非預設22，則須改port
example:
rsync -avzh -e 'ssh -p 123' /folder root@ip:/backup/
-------------------------------------
7.同步刪除檔案
  預設只會將來源端現存的檔案同步更新至目的端
  （同步所有新增或修改的檔案），但是如果在來
  源端有檔案被刪除的話，rsync 並不會主動刪
  除目的端的檔案，這樣可以確保資料被勿刪時，
  備份檔不會也跟著被刪除。
  如果您想要讓 rsync 也同步將不存在於來源
  端的檔案刪除的話，可以加上 --delete 參
  數，如果沒有來源檔案只有新增、沒有減少的
  話，它就跟一般的複製動作相同：  
$ rsync -avh --delete [folder/] [backup/]
-------------------------------------
備份特定檔案
-------------------------------------
rsync -avzh /home/clarkgcp root@34.138.89.69:~/backup/
-------------------------------------

```
 ### ==顯示外部ip==
```
#apt-get install curl 
#!curl ifconfig.me 
```
 ### ==檢查ubuntu版本==
 ```
 lsb_release -a
 ```
 ### ==Linux 更改檔案擁有者與群組，chown==
 ```
 ```

https://blog.gtwang.org/linux/linux-chown-command-tutorial/

 ### ==掛載硬碟==
https://clay-atlas.com/blog/2020/01/16/linux-chinese-tutorial-mount-disk-uuid/
```=
(1)格式化
lsblk
#可以確認你的硬碟是哪顆，然後接著進行分割。以下假設我們要將 sda 這顆硬碟進行分割。
fdisk /dev/sda

遇到 “Command (m for help): ” 時，輸入 “n” 開始分割。
如果只需要一個分割區，輸入 p 選擇 primary。
選擇 1 (預設分割區數量)
選擇開始的磁柱編號，可以直接使用預設值
選擇結束的磁柱編號，若要使用全部容量，可以直接使用預設值
輸入 w 儲存離開

接著格式化就簡單了：
mkfs -t ext4 /dev/sda1
當然，要將 sda1 更改為你自己切割的磁碟。
-----------------------------------------------------------------
(2)mount disk
#確認哪顆硬碟，與UUID
blkid
#建立資料夾
mkdir /home/data
#加入開機掛載資訊
echo 'UUID="{Your UUID}" {/direction} ext4 defaults 0 0' >> /etc/fstab
#mount
mount /home/data
#確認是否成功
df -h
```
 ### == apt VS apt-get ==
 

|功能	       |apt	          |apt-get       |
| -------- | -------- | -------- |
|安裝套件     |	apt install	|apt-get install|
|移除套件     |	apt remove	|apt-get remove|
|升級        |	apt update	|apt-get update|
|升級所有套件 |	apt upgrade	|apt-get upgrade|
|升級所有套件（包含相關依賴）|	apt full-upgrade|apt-get dist-upgrade|
|搜尋套件    |	apt search	|apt-cache search|
|顯示套件資訊|	apt show	|apt-cache show|
|刪除不需要的依賴|	apt autoremove	|apt-get autoremove|
|刪除不需要的配置|	apt purge	|apt-get purge|


```
du -chd 1 | sort -h
/usr/bin/screen -dmS screenname /bin/bash /path-to-bashscript


if ssh failed :
sudo systemctl enable ssh.service
/etc/init.d/ssh  status
/etc/init.d/ssh start
/etc/init.d/ssh restart




apt remove ssh --purge
apt autoremove
apt autoclean
apt update


sudo apt install gnome-power-manager
sudo apt install upower 



sudo timedatectl set-timezone Asia/Taipei

```
du -chd 1 | sort -h
