遠端控制和遠端腳本解決方案,使用 .NET、Blazor 和 SignalR Core 建置。
我正在尋找維護人員來幫助我!如果您是 .NET 開發人員並且有興趣幫助推動 Remotely 向前發展,請在jaredatimmy
上向我發送有關 Discord 的 DM。
Reddit 子版:https://www.reddit.com/r/remotely_app/
Docker:https://hub.docker.com/r/immybot/remotely
教學:https://www.youtube.com/watch?v=t-TFvr7sZ6M(謝謝,@bmcgonag!)
mkdir -p /var/www/remotely wget -q https://raw.githubusercontent.com/immense/Remotely/master/docker-compose/docker-compose.yml docker-compose up -d
唯一受支援的反向代理是 Caddy,並且僅當它直接面向互聯網時。 Caddy 的預設配置提供了 ASP.NET Core 和 SignalR 正常運作所需的一切。
如果您遇到任何其他設定(例如附加防火牆或 Nginx)的網路問題,請在 Reddit 或其他社交網站的「討論」標籤中尋求社群支援。遠端維護人員根本無法為所有可能的環境設定提供指導和支援。
話雖如此,ASP.NET Core 需要在反向代理程式後面設定以下標頭: X-Forwarded-Proto
、 X-Forwarded-Host
和X-Forwarded-For
。這些分別與方案 (http/https)、原始請求的 URL 和用戶端的 IP 位址相關。產生的方案和主機被注入到安裝程式和桌面用戶端中,以便它們知道將請求傳送到哪裡。客戶端 IP 位址用於設備資訊中。
遠端程式碼不會解析或處理這些值。它是由 ASP.NET Core 的內建中間件在內部完成的。如果值未如預期顯示,這是因為標頭遺失、未包含正確的值、格式不正確或未通過已知代理鏈(見下文)。
為了避免注入攻擊,ASP.NET Core 預設只接受來自環回位址的轉送標頭。遠端也會新增 docker-compose 檔案中定義的 Docker 閘道 IP (172.28.0.1)。如果您使用非預設配置,則必須將所有防火牆和反向代理位址新增至伺服器配置中的KnownProxies
陣列。
如果您無法正確設定反向代理,您至少可以透過在伺服器設定頁面中設定Force Client HTTPS
來強制使用 HTTPS 方案。
有關該主題的 Microsoft 完整文件可以在這裡找到:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer
Remotely 的資料將保存在/app/AppData
下的容器中,該容器將安裝到 Docker 主機上的/var/www/remotely/
。
該資料夾將包含Remotely.db 和伺服器產生的日誌。
這些文件將在新遠端容器的拆卸和設定過程中持續存在。
如果從 Remotely 的非 Docker 版本升級,請覆寫先前安裝的資料庫檔案。
如果您想將網站公開到互聯網,請使用 Caddy 作為反向代理。
如果這是第一次運行,請透過點擊主頁上的Register
按鈕來建立您的帳戶。
組織用於將使用者、設備和其他資料項分組到一個池中。
預設情況下,一台伺服器上只能存在一個組織。
Register
按鈕將會消失。
人們將不再能夠自己建立帳戶。
若要允許自行註冊,請增加MaxOrganizationCount
或將其設為 -1(請參閱設定部分)。
該帳戶將同時是伺服器管理員和組織管理員。
系統會自動為該帳戶建立一個組織。
您可以啟用 HTTP 日誌記錄以查看伺服器日誌中的所有請求和回應,包括標頭。這對於調試反向代理、API 或 SignalR 問題很有幫助。可以在「伺服器設定」頁面上啟用該選項。
更改上述內容後,必須重新啟動容器才能使變更生效。
以下步驟將配置您的 Windows 11 電腦以建立遠端伺服器和用戶端。
安裝 Visual Studio 2022。
.NET SDK(最新版本)。
MSBuild(自動選擇 Roslyn 編譯器)。
NuGet 目標和建置任務。
.NET Framework 4.8 SDK。
對於調試和開發,您將需要所有相關的工作負載。
ASP.NET 與 Web 開發
.NET 桌面開發
.NET Core跨平台開發
連結:https://visualstudio.microsoft.com/downloads/
您應該選擇以下工作負載:
您應該選擇以下各個組件:
安裝適用於 Windows 的 Git。
連結:https://git-scm.com/downloads
安裝最新的 LTS 節點:
連結:https://nodejs.org/
複製 git 儲存庫: git clone https://github.com/immense/Remotely --recurse
偵錯時,代理程式將使用預先定義的裝置 ID 並連接到 https://localhost:5001。
在開發環境中,伺服器會將所有連線代理程式指派給第一個組織。
上面兩個允許您一起調試代理和伺服器,並在列表中查看您的設備。
建立的第一個帳戶將是伺服器和為該帳戶建立的組織的管理員。
組織管理員有權存取組織頁面和特定於其組織的伺服器日誌條目。伺服器管理員有權存取「伺服器設定」頁面,並且可以查看不屬於組織的伺服器日誌條目。
在「帳戶」部分中,有一個品牌選項卡,該選項卡將應用於快速支援用戶端和 Windows 安裝程式。
但是,客戶端需要從原始程式碼構建,並在應用程式中硬編碼伺服器 URL,以便能夠檢索品牌資訊。
資料庫提供者、連接字串和 ASP.NET Core 連接埠可透過docker-compose.yml
中的環境變數進行設定。
登入後,所有其他配置都在「伺服器配置」頁面中完成。
AllowApiLogin:是否允許透過API控制器登入。建議使用 API 存取令牌而不是這種方法。
BannedDevices:要禁止的設備 ID、名稱或 IP 位址的陣列。當他們嘗試連線時,將立即發回卸載命令。
DataRetentionInDays:日誌和其他資料將在伺服器上保留多長時間。設定為 -1 以無限期保留(不建議)。
DBProvider:確定將使用三個連接字串(位於頂部)中的哪一個。適合資料庫類型的資料庫提供者會自動載入到程式碼中。
EnableWindowsEventLog:是否也將伺服器日誌項目新增至 Windows 事件日誌。
EnforceAttendedAccess:系統將提示客戶端允許無人值守的遠端控制嘗試。
EnableRemoteControlRecording:是否在伺服器上保存遠端控制會話的錄音。
它們將保存在/app/AppData/recordings
中。
它們的保留由DataRetentionInDays
控制。
ForceClientHTTPS:強制安裝程式和桌面用戶端使用 HTTPS 方案,即使轉送的標頭配置錯誤。
KnownProxies:如果您的反向代理位於不同的電腦上並且將請求轉送到遠端伺服器,則您需要將反向代理伺服器的 IP 新增至此陣列。
MaxOrganizationCount:預設情況下,伺服器上可以存在一個組織,該組織是在註冊第一個帳戶時自動建立的。此後,自助註冊將被停用。
將其設為 -1 或將其增加到特定數字以允許多租戶。
RedirectToHttps:ASP.NET Core 是否將所有流量從 HTTP 重新導向到 HTTPS。這獨立於執行相同操作的 Caddy、Nginx 和 IIS 配置。
RemoteControlNotifyUsers:無人值守遠端控制會話啟動時是否向最終使用者顯示通知。
RemoteControlRequiresAuthentication:遠端控制頁面是否需要身份驗證才能建立連線。
Require2FA:要求使用者在使用主應用程式之前設定 2FA。
smpt-:自動產生的系統電子郵件的 SMTP 設定(例如註冊和密碼重設)。
主題:網站使用的顏色主題。值為“亮”或“暗”。這也可以在帳戶 - 選項中針對每個使用者進行配置。
TrustedCorsOrigins:用於透過 JavaScript 進行跨來源 API 請求。允許此數組中列出的網站向 API 發出請求。這不會授予身份驗證,而大多數端點仍然需要身份驗證。
UseHsts:ASP.NET Core 是否將使用 HTTP 嚴格傳輸安全性。
UseHttpLogging:啟用所有 HTTP 請求的日誌記錄。也可以在ClientDownloadsController
中啟用有關有效方案、主機和遠端 IP 位址的附加日誌條目,作為處理轉送標頭的結果。
您必須明確設定Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware
的日誌等級才能使其正常運作。有關範例,請參閱 appsettings.json。
預設情況下,遠端使用 SQLite 資料庫。首次運行時,它會建立一個為 appsettings.json 中的 SQLite 連接字串指定的檔案。
您可以透過將ApplicationOptions
中的DBProvider
變更為SQLServer
或PostgreSQL
來變更資料庫。
在客戶端上,日誌保存在%ProgramData%RemotelyLogs
中
在伺服器容器內,日誌將寫入/app/AppData/logs
,該日誌(預設)將安裝到主機上的/var/www/remotely/Logs
。
內建 ASP.NET Core 日誌寫入控制台 (stdout)。如果需要,您可以將其重定向到檔案。
在 IIS 中,可以透過將 stdoutLogEnabled 設為 true 在 web.config 檔案中完成此操作。
在 Windows 伺服器上,上述日誌也可以寫入 Windows 事件日誌。
將 EnableWindowsEventLog 設為 true,可以在伺服器設定中啟用此功能。
您可以在 appsettings.json 中設定日誌記錄等級和其他設定。
更多資訊:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/
Windows:僅測試最新版本的 Windows 11。 Windows 7 和 8.1 應該可以工作,但 Windows 7 上的效能會有所下降。
Windows 2019/2022 應該也能正常運作,但沒有定期測試。
Linux:僅測試了 Ubuntu 的最新 LTS 版本。
對於Ubuntu的「快速支援」客戶端,您必須先安裝以下相依性:
libc6-dev
libxtst-dev
剪輯
libx11-dev
libxrandr-dev
理想情況下,您可以從實際的電腦或筆記型電腦進行遠端控制。不過,我嘗試讓遙控器至少在某種程度上可以透過行動裝置使用。以下是控制:
左鍵單擊:單擊
右鍵單擊:長按,然後放開
按一下並拖曳:長按,然後拖曳
/get-support
有一個頁面,最終用戶可以在其中請求支援。提交表單後,主頁上的網格上方會出現警報。
此頁面的捷徑位於Program FilesRemotely
資料夾中。您可以將其複製到任何您喜歡的地方。您也可以使用安裝程式上的-supportshortcut
開關將其自動複製到桌面。
.NET 有兩種部署方法:依賴框架和獨立部署。
依賴框架的部署需要在目標電腦上安裝 .NET 執行階段。它必須與用於構建應用程式的版本相同。
獨立部署包含執行時間的副本,因此您無需將其安裝在目標電腦上。因此,總檔案大小要大得多。
.NET 使用建置時目標的執行時間識別碼。
連結:https://docs.microsoft.com/en-us/dotnet/core/rid-catalog
使用控制台時有幾個可用的快捷鍵。
/ :斜線將允許您在 shell 之間切換。名稱可在「選項」頁面中配置。
向上/向下:使用向上/向下箭頭循環瀏覽輸入記錄。
Ctrl + Q:清除輸出視窗。
主機連接埠(左側)可以在docker-compose.yml
中配置。 集裝箱連接埠(右側)不應更改。有關詳細信息,請參閱撰寫文件。
Remotely 有一個基本的 API,可以在https://{your_server_url}/swagger
瀏覽。大多數端點需要透過 API 存取權杖進行身份驗證,可以透過前往帳戶 - API 存取來建立該令牌。
從另一個網站上的瀏覽器存取 API 時,您需要透過將網站來源 URL 新增至 TrustedCorsOrigins 陣列來在 appsettings 中設定 CORS。如果您不熟悉 CORS 的工作原理,我建議您先閱讀一下,然後再繼續。例如,如果我想在 https://exmaple.com 上建立一個登入遠端 API 的登入表單,我需要將「https://example.com」新增至 TrustedCorsOrigins。
對 API 的每個請求都必須有一個名為「X-Api-Key」的標頭。該值應該是 API 金鑰的 ID 和金鑰,以冒號分隔(即 [ApiKey]:[ApiSecret])。
下面是一個 API 請求範例:
POST https://localhost:5001/API/Scripting/ExecuteCommand/PSCore/f2b0a595-5ea8-471b-975f-12e70e0f3497 HTTP/1.1 Content-Type: application/json X-Api-Key: 31fb288d-af97-4ce1-ae7b-ceebb98281ac:HLkrKaZGExYvozSPvcACZw9awKkhHnNK User-Agent: PostmanRuntime/7.22.0 Accept: */* Cache-Control: no-cache Host: localhost:5001 Accept-Encoding: gzip, deflate, br Content-Length: 12 Connection: close Get-Location
以下是使用基於 cookie 的登入 API (JavaScript) 的範例:
// Log in with one request, then launch remote control with another. fetch("https://localhost:5001/api/Login/", { method: "post", credentials: "include", mode: "cors", body: '{"email":"[email protected]", "password":"P@ssword1"}', headers: { "Content-Type": "application/json", } }).then(response=>{ if (response.ok) { fetch("https://localhost:44351/api/RemoteControl/Viewer/b68c24b0-2c67-4524-ad28-dadea7a576a4", { method: "get", credentials: "include", mode: "cors" }).then(response=>{ if (response.ok) { response.text().then(url=>{ window.open(url); }) } }) } }) // Log in and launch remote control in the same request. fetch("https://localhost:5001/api/RemoteControl/Viewer/", { method: "post", credentials: "include", mode: "cors", body: '{"email":"[email protected]", "password":"P@ssword1", "deviceID":"b68c24b0-2c67-4524-ad28-dadea7a576a4"}', headers: { "Content-Type": "application/json", } }).then(response=>{ if (response.ok) { response.text().then(url=>{ window.open(url); }) } })
警報 API 可讓您為裝置端點新增監控和警報功能。此功能旨在添加基本的 RMM 類型功能,但不會偏離遠端的主要目的太遠。
警報可以設定為在遠端網站上顯示通知、發送電子郵件和/或執行單獨的 API 請求。
要使用警報,您首先需要建立一個 API 令牌(或多個令牌)以供您的裝置使用。然後建立計劃任務或其他一些重複腳本來完成工作。以下是如何使用 PowerShell 建立排程作業以每天檢查磁碟空間的範例。
$Trigger = New-JobTrigger -Daily -At "5 AM" $Option = New-ScheduledJobOption -RequireNetwork Register-ScheduledJob -ScriptBlock { $OsDrive = Get-PSDrive -Name C $FreeSpace = $OsDrive.Free / ($OsDrive.Used + $OsDrive.Free) if ($FreeSpace -lt .1) { Invoke-WebRequest -Uri "https://localhost:5001/api/Alerts/Create/" -Method Post -Headers @{ X-Api-Key="3e9d8273-1dc1-4303-bd50-7a133e36b9b7:S+82XKZdvg278pSFHWtUklqHENuO5IhH" } -Body @" { "AlertDeviceID": "f2b0a595-5ea8-471b-975f-12e70e0f3497", "AlertMessage": "Low hard drive space. Free Space: $([Math]::Round($FreeSpace * 100))%", "ApiRequestBody": null, "ApiRequestHeaders": null, "ApiRequestMethod": null, "ApiRequestUrl": null, "EmailBody": "Low hard drive space for device Maker.", "EmailSubject": "Hard Drive Space Alert", "EmailTo": "[email protected]", "ShouldAlert": true, "ShouldEmail": true, "ShouldSendApiRequest": false } "@ -ContentType "application/json" } } -Name "Check OS Drive Space" -Trigger $Trigger -ScheduledJobOption $Option