在 Windows 服务器上 SSH 注销后进程终止

在 Windows 服务器上 SSH 注销后进程终止

我有一个Windows 服务器 2016需要远程运行使用 CLI 的文件的机器使用 SSH

众所周知,注销 SSH 连接会终止 ssh 用户启动的进程。在 Linux 机器上,可以使用 或 等解决方案nohupscreen这样注销后进程就不会被终止。

但是,这样的解决方案在 Windows 机器上不起作用,我正在寻找一种方法来防止进程在注销后终止。

  • 我的客户是Ubuntu 机器
  • 我的 Windows Server 2016 运行打开SHH, 和电源外壳作为默认 shell
  • 我的程序设置为在守护进程模式下工作,并且没有打开任何 cmd 或 powershell 窗口
  • 使用Get-Process -Name proc_name显示进程确实正在运行
  • Get-ProcessSSH 注销后使用不会产生这样的过程

我还尝试过:

  • .exe使用运行文件cmd
  • 运行.bat和文件,并以其参数.ps启动。.exe

有没有办法在 Windows 机器上解决这个问题?

答案1

在花费大量时间寻找解决方案之后,我发现使用 PowerShell 是绝对正确的方法。

它似乎是那些较少使用或在线记录的 cmdlet 之一,并且几乎不可能使用 MSDN 文档自行弄清楚,除非您已经非常熟悉这个庞大的世界Wmi Objects

简而言之:

假设我有一个foo.exe需要在后台运行的程序,参数为-a-bbar,我应该使用确切的命令:

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

当然,如果您的 exe 是“已知”的 exe(默认情况下,例如记事本或 ping)或由您添加,则使用完整路径时不需要,-ArgumentList并且 exe 名称就足够了(记事本、ping 等)。

附加参数:

Invoke-WmiMethod支持附加参数,例如-Credential, (这是使用本地 PS 来操作远程机器而不使用 SSH 的-ComputerName好方法),以及许多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...}

当然,使用|Select-Object -ExpandProperty (_your_property_here_)将显示所有可用的,Methods例如Create我们在上面的命令中使用的,以及所有可用的Properties(我们没有使用)。

相关内容