﻿# 如何使用 Synology NAS 內建的 CLI 命令列管理工具

我們這幾年陸續在淘汰地端的基礎建設，盡可能的把服務搬上雲端，此舉不單是因為「數位轉型」的趨勢所然，而是同時考量了許多其他因素，例如各種成本降低、管理方便、安全提升，都是優點。最近我們把 Active Directory 也給移掉了，所有地端的設備開始改用 RADIUS 進行驗證，帳號則使用 Synology NAS 的 [DSM](https://www.synology.com/zh-tw/dsm) (DiskStation Manager) 進行管理，因為 DSM 提供很棒的 Web UI 介面，同時又提供 CLI 介面可以批次操作，雖然功能沒有太多，但還算實用。今天這篇文章我就來說說常見的使用方式。

![Synology NAS DSM](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/bd22b1fdf518a8fc9129-193717557-2c4c8907-bc02-4ee9-a0fe-9327f4106bed.png)

### 啟用 SSH 服務

要使用 CLI 管理整台 Synology NAS 上面的服務，首先要先啟用 SSH 服務，以下是啟用步驟：

1.  點擊 `Control Panel`
2.  點擊 `Applications` → `Terminal & SNMP`
3.  在 `Terminal` 頁籤點擊 `Enable SSH service`
4.  按下 `Apply` 即可啟用服務

![DSM](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/9141ada2086031c50ab5-193571423-3c698bac-eae4-4a97-96b2-da41794e5c8a.png)

> 請注意: 上圖很清楚的寫到 **Note: SSH/Telnet only supports logins from accounts belonging to the administrators group. Please refer to Terminal for more details.** 注意事項，只有隸屬於 `administrators` 群組的成員才能透過 SSH 連入裝置。

### 連入 SSH 介面

1.  使用 `ssh` 命令登入 DSM
    
    ```bash
    ssh admin@192.168.1.1
    ```
    
    登入後會先遇到一個無法 `chdir` 的問題，這是因為 DSM 預設所有使用者都不會建立 `$HOME` 目錄，但這其實不影響操作：
    
    ```bash
    Could not chdir to home directory /var/services/homes/admin: No such file or directory
    ```
    
2.  使用 `sudo -i` 變身為 `root` 特權帳戶
    
    ```bash
    sudo -i
    ```
    
3.  使用 `ssh-keygen` 建立一張 RSA 金鑰組
    
    ```bash
    ssh-keygen
    ```
    
4.  建立 `~/.ssh/authorized_keys` 授權金鑰檔，將你自己的 SSH 公開金鑰放進去即可。
    
    步驟可參考 [如何使用 RSA 金鑰組以 SSH 的方式登入 DSM？](https://kb.synology.com/zh-tw/DSM/tutorial/How_to_log_in_to_DSM_with_key_pairs_as_admin_or_root_permission_via_SSH_on_computers) 文章
    
5.  退出系統
    
    ```bash
    exit
    exit
    ```
    
6.  重新改用 `root` 身份直接連入設備
    
    ```bash
    ssh root@192.168.1.1
    ```
    

### 認識 `syno` 工具組

DSM 所有的 CLI 管理工具都放在 `/usr/syno/sbin` 目錄下，共有一百多個工具，工具命令的名稱大多是 `syno*` 開頭，不過大部分的工具程式都找不到文件，所以有些工具要大家自己摸索。

> 這個 `/usr/syno/sbin` 路徑已經預設被加入到 `/etc/profile` 全域啟動設定檔中，所以執行時不用特別打路徑部分。不過，只有登入到 Shell 環境才會載入 `/etc/profile` 全域啟動設定檔喔！如果要在 Remote Shell 中執行命令，請記得加上完整路徑，例如：`ssh root@192.168.1.1 /usr/syno/sbin/synouser`

```
adjust_kern_level            synologconvert
bootup_create_volumes.sh     synolog-linker
btacd                        synolunbackup
check_root_junior_match.sh   synoluntransform
config_bootup_check.sh       synomediaparserd
ddnsd                        synomkflvd
dhm_tool                     synomkthumbd
epck                         syno-move-coredump
esynoscheduler               synonet
eunit_info                   synonetd
heartbeatd                   synonetdtool
hotplugd                     synonfstest
install_backup_plugin.sh     synonfstop
ip-conflict-detect.sh        synoovstool
refresh_cache.sh             synopartition
sharingdb_move               synopasswordmail
syno8021Xtool                synoperfeventd
synoagentregisterd           synopftest
synoapppriv_updater          synopkgctl
synobootupcheck              synopkghelper
syno-bootup-type-set.sh      synopkicompatsync
synobtrfssnap                synopoweroff
synobtrfssnapusage           synopyntlmd
synocacheclient              synoquota
synocachepinfiletool         synoraidtool
synocachepinfiletoolha       synorelayd
synocachepinfiletool-status  synoroutertool
synocgid                     synoscgi
synocgitool                  synoscgi______________________
synocloudserviceauth         synoservice
synoconfd                    synoservicecfg
synocontentextractd          synoservicectl
synocrond                    synoservicemigrate
synodate                     synoshare
syno-dbus-check.sh           synosharequota
synodctest                   synosharesnapshot
synoddnsinfo                 synosharesnaptool
syno_disk_log_convert        synosharesnaptree
syno_disk_testlog_convert    synosharesnaptree_reconstruct.sh
synodsdefault                synoshutdown
synodsinfo                   synosnmpcd
syno-dump-core.sh            synospace
syno_dvb_admin.sh            synostgdisk
syno_fan_debug               synostgpool
synoflashcachebootupcheck    synostgsysraid
synofstool                   synostgvolume
synogpoclientd               synostorage
synogroup                    synostoragecore
synohacore                   synostoraged
syno_hibernation_debug       synosyncdctime
synoindexd                   synosyslogmail
synoindexplugind             syno_system_dump
synoindexscand               synotifyd
synoindexworkerd             synotimecontrol
syno_ip_conflict_detect      synotune
synoiscsitop                 synoupgrade
synoisns                     synousbmodemd
synoldapclientd              synouser
syno-letsencrypt             synouserdir
synologaccd                  synovolumesnapshot
synologand                   synowifid
synologconfgen               synowin
```

> 雖然有許多工具沒有文件可參考，但常用的工具可找到 [CLI Administrator Guide for Synology NAS](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Firmware/DSM/All/enu/Synology_DiskStation_Administration_CLI_Guide.pdf) \[PDF\] 來參考其用法。

### 使用者帳戶管理

你可以使用 `synouser` 工具來管理 DSM 上面的帳戶，而且建立速度非常快，以下是常見用法：

1.  基本用法說明
    
    `synouser` 使用上非常直觀，功能雖然沒有很完整，但就是很好上手！
    
    ```bash
    # /usr/syno/sbin/synouser
    Copyright (c) 2003-2021 Synology Inc. All rights reserved.
    
    Usage: synouser (Version 25556)
            --help
            --rebuild {all|(domain Force{0|1})|(ldap Force{0|1})}
            --enum {local|domain|ldap|all|domain_used}
            --enumpre {local|domain|all|domain_used} prefix Caseless{0|1}
            --enumsub {local|domain|all|domain_used} substr Caseless{0|1}
            --get username
            --getuid UID
            --add [username pwd "full name" expired{0|1} mail privilege]
            --modify username "full name" expired{0|1} mail
            --rename old_username new_username
            --setpw username newpasswd
            --del username1 username2 ...
            --login username pwd
            --dbopen2 username
            --filesetpw filename
            --create_homes {domain|ldap}
    ```
    
2.  列出所有帳戶
    
    ```bash
    /usr/syno/sbin/synouser --enum local
    ```
    
    跳過第一行，僅顯示帳戶清單
    
    ```bash
    /usr/syno/sbin/synogroup --enum local | tail -n +2
    ```
    
3.  建立帳戶
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synouser --add '帳號' '密碼' '全名' 是否過期{0|1} 'email@example.com' 權限等級{0|1}
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synouser --add 'xien' 'TNXZfhSP' '黃大仙Xien' 0 'xien@example.com' 0
    ```
    
4.  變更使用者密碼
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synouser --setpw '帳號' '新密碼'
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synouser --setpw 'xien' 'TNXZfhSP'
    ```
    
5.  停用帳號
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synouser --modify '帳號' '全名' 是否過期{0|1} 'email@example.com'
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synouser --modify 'xien' '黃大仙Xien' 1 'email@example.com'
    ```
    
    > DSM 的這個 `--modify` 參數非常難用，我在停用帳戶時，還一定要同時修改「全名」與「電子郵件」欄位，輸入空值還會被清空。很明顯這個 CLI 是為了 Web 介面所設計的，糟糕啊！😅
    
6.  刪除帳號
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synouser --del username1 username2 ...
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synouser --del 'xien'
    ```
    

### 使用者群組管理

你可以使用 `synogroup` 工具來管理 DSM 上面的群組，也可以變更群組成員，執行速度非常快，但 CLI 介面設計的相當糟糕!😅

1.  基本用法說明
    
    `synogroup` 使用上非常直觀，功能雖然沒有很完整，但就是很好上手！
    
    ```bash
    # /usr/syno/sbin/synogroup
    Copyright (c) 2003-2021 Synology Inc. All rights reserved.
    
    Usage: synogroup (Version 25556)
            --help
            --rebuild {all|(domain Force{0|1})|(ldap Force{0|1})}
            --enum [{local|domain|ldap|all}]
            --enumpre {local|domain|all} prefix Caseless{0|1}
            --enumsub {local|domain|all} substr Caseless{0|1}
            --get groupname
            --getgid GID
            --descget groupname
            --descset groupname ["New Descritions"]
            --add groupname username1 username2 ...
            --rename old_groupname new_groupname
            --member groupname username1 username2 ...
            --del groupname1 groupname2 ...
            --dbopen2 groupname
    ```
    
2.  列出所有群組
    
    ```bash
    /usr/syno/sbin/synogroup --enum local
    ```
    
    跳過第一行，僅顯示群組清單
    
    ```bash
    /usr/syno/sbin/synogroup --enum local | tail -n +2
    ```
    
3.  建立群組
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synogroup --add '群組名稱' 'user1' 'user2' ...
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synogroup --add 'group1' 'xien' 'john' 'tom'
    ```
    
4.  編輯群組成員
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synogroup --member '群組名稱' 'user1' 'user2' ...
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synogroup --member 'group1' 'xien' 'john' 'tom'
    ```
    
    DSM 的這個 `--member` 參數非常難用，我原本認為在加入成員時會累加上去，結果竟然是「完整取代」所有的成員清單。例如以下範例是「錯誤」的：
    
    ```bash
    /usr/syno/sbin/synogroup --member 'group1' 'xien'
    /usr/syno/sbin/synogroup --member 'group1' 'john'
    /usr/syno/sbin/synogroup --member 'group1' 'tom'
    ```
    
    執行完之後，這個 `group1` 群組，將只會剩下一個 `tom` 帳號在群組內而已，驚不驚喜，意不意外，難用爆了！😅
    
    > 很明顯這個 CLI 是為了 Web 介面所設計的，糟糕啊！😅
    
5.  刪除群組
    
    基本語法
    
    ```bash
    /usr/syno/sbin/synogroup --del groupname1 groupname2 ...
    ```
    
    使用範例
    
    ```bash
    /usr/syno/sbin/synogroup --del group1
    ```
    

### 總結

在 Synology NAS 中的 DSM 提供了很多很棒的 Web UI 介面，這些針對大部分一次性的操作，提供的相當大的便利性，不用花時間學習什麼自動化技巧。

同時 DSM 也提供的 CLI 介面可以針對一些需要自動化的工作，例如批次建立帳號、日常帳號維護、群組成員維護等等，都可以透過 SSH + Shell 來達成自動化管理的目的，也可以很輕易的跟我們其他的系統進行整合，光是這點我就覺得很滿意了！👍

### 相關連結

-   [如何使用 RSA 金鑰組以 SSH 的方式登入 DSM？ - Synology 知識中心](https://kb.synology.com/zh-tw/DSM/tutorial/How_to_log_in_to_DSM_with_key_pairs_as_admin_or_root_permission_via_SSH_on_computers)
-   [CLI Administrator Guide for Synology NAS](https://global.download.synology.com/download/Document/Software/DeveloperGuide/Firmware/DSM/All/enu/Synology_DiskStation_Administration_CLI_Guide.pdf) \[PDF\]
