synology預設只有提供給管理者ssh,所以有一些使用到ssh channel的方法都無法使用。如果需要用到NAS使用者自身權限進行檔案上下載,除了可以透過內建的rsync來完成之外,也可以嘗試使用synology的web API來達成。
該文件放在:
https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/FileStation/All/enu/Synology_File_Station_API_Guide.pdf
這邊先截取一些個人比較常用的工具做個紀錄。
Synolgy的web api大概可以區分成login -> action -> logout 。各自關係如下:
因為是web api,所以可以使用瀏覽器開之外,部分服務也可以透過curl來開啟。
確認目前NAS有提供哪些服務?
透過瀏覽器或curl輸入:
http://<IP>:5000/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query&query=all
or curl
curl -v "http://<IP>:5000/webapi/query.cgi?api=SYNO.API.Info&version=1&method=query&query=all"
IP就是NAS所使用的IP。如果有https的使用者就把port從5000改為5001。(這是預設狀況,有自己修改的使用者再自行轉換)。通常在家用網路都不會有DNS,所以大部分的狀況下https都不會直接通,需要透過使用者進行二段式確認。
瀏覽器應該會噴出一些資訊,那些就是目前NAS有提供的服務。
測試NAS認證是否能登錄?
使用瀏覽器
http://<IP>:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=<帳號>&passwd=<密碼>&
or curl
curl -v "http://<IP>:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=<帳號>&passwd=<密碼>&"
如果出現以下類似訊息(重點是success)
{"data":{"did":"gTB7R8aNM7nHn7KNDhXLHxtIcwDQUmsd--y_Clz0iBwmpkkpQlICM2xUieck2-6OLcFANSwATOWgN2S8MXefkA","sid":"-rJX_WSNkhvyHIr8h0nhAFMGRYSkGSUwltQ6X8b-XhYJkzONnYy0oncxOz-1T_kIT3_5wVl_xVRfn_Syk2gaCM"},"success":true}
另外一項重點是_sid這項目。這等於是取得token以方便後面的上下載動作。
也透過curl可以把登錄資訊放在cookie中:
curl -v "http://<IP>:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=<帳號>&passwd=<密碼>&format=cookie" -c synocookie
這樣登錄資訊就會放在synocookie中以利後面的使用。
登出則是
http://<IP>:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=logout&account=<帳號>&passwd=<密碼>&
比較方便的方式是把資訊放到cookie中,後續可以用-b參數讀取
curl -j -c ./cookie http://<IP>:5000/webapi/auth.cgi?api=SYNO.API.Auth&version=3&method=login&account=<帳號>&passwd=<密碼>&session=FileStation&format=cookie
上傳資料
curl -F "filename=@檔案位置" -F "path=<NAS上的位置>" "http://<IP>:5000/webapi/entry.cgi?api=SYNO.FileStation.Upload&version=2&method=upload&_sid=1Z8QjAmvU0FMeX49MEFfwAf28oWE3CSslKVRmHHjNXUTcv-EU2I7cidfNwjoi5y1pZ_q0kzS-y65xrcVxUrM_0"
如果嫌SID部分太冗長,可以使用上面提到的cookie。使用curl的-b參數讀取
curl -F "filename=@檔案位置" -F "path=<NAS上的位置>" "http://<IP>:5000/webapi/entry.cgi?api=SYNO.FileStation.Upload&version=2&method=upload&" -b synocookie
上傳時,NAS上的位置要注意,開頭一定要用斜線(/)開頭,他會依照使用者的根目錄作出相對路徑。如果沒有用斜線開頭會噴錯。
後記
經過測試,有些帳號可以透過上面的方式成功上傳資料。但有些帳號不行。目前尚未找到無法成功的原因。
目前還是有部分package透過synology的web API上傳資料。有無法讓使用者透過SSH或是rsync上傳的需求或是希望讓使用者能用自己權限來操作的可以使用 N4S4 的 synology_api 。
references:
- https://global.download.synology.com/download/Document/Software/DeveloperGuide/Os/DSM/All/enu/DSM_Login_Web_API_Guide_enu.pdf
- https://global.download.synology.com/download/Document/Software/DeveloperGuide/Package/FileStation/All/enu/Synology_File_Station_API_Guide.pdf