Linux

在 Windows 伺服器上 SSH 註銷後程序終止

  • December 2, 2020

我有一台Windows server 2016機器,它需要執行一個使用 cli 的文件,遠端使用 SSH

眾所周知,註銷 SSH 連接會終止由 ssh 使用者啟動的程序。在 linux 機器上,可以使用nohupor之類的解決方案screen,從而導致程序在註銷後不會被殺死。

不過,此類解決方案不適用於 Windows 機器,我正在尋找一種方法來防止程序在註銷後終止。

  • 我的客戶是一台 Ubuntu 機器
  • 我的 Windows server 2016 執行OpenSHH,使用PowerShell作為預設 shell
  • 我的程序設置為在守護程序模式下工作,並且沒有打開任何 cmd 或 powershell 視窗
  • 使用Get-Process -Name proc_name顯示該程序確實正在執行
  • 在 SSH 註銷後使用Get-Process不會產生這樣的過程

我也嘗試過的事情:

  • 使用. .exe_cmd
  • 執行以參數開頭的.bat.ps文件.exe

有沒有辦法在 Windows 機器上解決這個問題?

在花了很多時間尋找解決方案之後,我找到了使用 PowerShell 的絕對正確方法。

似乎它是線上較少使用或記錄較少的 cmdlet 之一,並且幾乎不可能使用 MSDN 文件自行弄清楚,除非您已經非常熟悉Wmi Objects.

簡而言之:

假設我有一個程序foo.exe需要使用參數在後台執行-a-b並且bar,我應該使用確切的命令:

Invoke-WmiMethod -Path 'Win32_Process' -Name Create -ArgumentList 'C:\Users\foo\Desktop\foo.exe -a -b bar'

當然,如果您的 exe 是“已知”exe(預設情況下,例如記事本或 ping)或由您添加,則在使用-ArgumentListexe 名稱時不需要完整路徑(記事本、ping 等)就足夠了。 .)。

附加參數:

Invoke-WmiMethod支持附加參數,例如-Credential, (在不使用 SSH 的情況下使用-ComputerName本地 PS 連接到遠端機器上的東西的好方法),還有更多文件在這裡Invoke``-Impersonation

Cmdlet 語法解釋和其他 cmdlet 工具:

  • -Path參數指向一個名稱WmiObject。有幾十WmiObjects,每個都有很多MethodsProperties
  • -Name參數指示使用的Method.
  • 列出所有可用的Wmi-Objects用途Get-WmiObject -List(這種方式很難找到您需要的對象)。
  • 列出和查看所有可用Win32_Process MethodsProperties使用
Get-WmiObject -List |where{$_.name -match '^Win32_Process$'}

這將返回此結構的輸出:

  NameSpace: ROOT\cimv2

Name                                Methods              Properties
----                                -------              ----------
Win32_Process                       {Create, Terminat... {Caption, CommandLine, CreationClassName, CreationDate...}

當然 using|Select-Object -ExpandProperty (_your_property_here_)將顯示所有可用的Methods,例如Create我們在上面的命令中使用的,以及所有可用的Properties(我們沒有使用)。

引用自:https://serverfault.com/questions/1044393