Windows 到 Linux:在远程计算机上以用户进程 (作为 bkgrnd) 的形式执行 shell 脚本

Windows 到 Linux:在远程计算机上以用户进程 (作为 bkgrnd) 的形式执行 shell 脚本

我正在尝试执行以下操作:

1)从 Windows 机器在远程机器 1、2 和 3(均为 Linux)上运行 shell 脚本。

2)在我的Windows机器上,我有plink,我的使用方式如下:

plink -i <my_private_key> [email protected] -t "bash <script_loc> args &"

当我这样做时,预期的进程没有启动。我通过远程登录 machineX(1,2,or3) 并输入以下内容来确认:

ps -A -F | grep -i "whatever"

我可以通过输入以下命令在命令行中启动它:

cmd /c start plink -i <my_private_key> [email protected] -t ""bash <script_loc> args ""&""""

但这意味着它将打开一个新的终端,并且在注销 Windows 机器时,这些将被终止。

我的目标是远程启动这些脚本并让它们作为后台进程或守护进程运行。我将能够找到 pid 等,因为我知道它们将通过命令行运行什么。

如果不创建服务的话这可行吗?

问候,

答案1

如果您正在运行 plink,则您没有使用 PS 远程处理来执行此操作,因为您只是在 PS 主机之一(控制台/ISE/VSCode)上运行 plink 命令。这不是 PS 问题,而是如何在 PS 中运行和执行的问题。我每天都会将 plink 连接到 Linux 机器,没有任何问题,但正如您在第二个命令和启动命令中提到的那样,存在问题。

如果您在其中一个 PS 控制台中,则必须提供执行命令,对于外部.exe,您应该养成完全限定 exe 的习惯。

例如,这是我在所有 Linux 机器上成功执行此操作的方法。&(和号)表示 - 将字符串作为命令执行。基本上,这与调用 cmd.exe start 执行的操作相同,但没有额外的终端窗口。

# Using PowerShell and Plink for Linux remote management
# Example
$PlinkPath = 'D:\Tools\plink.exe'

$linuxhostname = 'SomeLinuxHostName'
$linuxusername = 'SomeLinuxUserName'
$LinuxSessionName = 'LinuxSessionNameName' # Putty Saved session name

$GetIptablesNat = & $PlinkPath -load $LinuxSessionName 'sudo -s iptables -L -nv --line-numbers -t nat';$GetIptablesNat 
$GetIptablesFilter = & $PlinkPath -load $LinuxSessionName 'sudo -s iptables -L -nv --line-numbers -t filter';$GetIptablesFilter
$RestartIptablesService = & $PlinkPath -load $LinuxSessionName 'sudo -s service iptables restart';$RestartIptablesService

# Network statistics
$GetNetworkStatistics = & $PlinkPath -load $LinuxSessionName 'sudo -s netstat -tN';$GetNetworkStatistics

# Connectivity check
(
'SomeLinuxHostFQDN','SomeLinuxIPA'
) | % { Test-Connection -ComputerName $_ }


# From Linux NAT Gateway
$TestConnectivity = & $PlinkPath -load $LinuxSessionName 'sudo -s ping SomeHostIPA';$TestConnectivity

如果您希望某些程序在后台运行,那么 PS 作业就是为此而生的。

请参阅此文章:

https://codingbee.net/tutorials/powershell/powershell-running-tasks-in-the-background

另请参阅有关并行进程和运行空间的 PS 帮助文件信息。

Get-Help -Name about_Jobs
Get-Help -Name about_Parallel
Get-Help -Name about_PSSessions
Get-Help -Name about_PSSession_Details
Get-Help -Name about_Workflows
Get-Help -Name about_WorkflowCommonParameter

开始使用 PowerShell 运行空间

https://blogs.technet.microsoft.com/heyscriptingguy/2015/11/26/beginning-use-of-powershell-runspaces-part-1

然而我还没有尝试用 Plink 来实现这个功能。

但是有很多关于 PS 和 Plink 用例的文章,甚至针对思科交换机。

使用 plink.exe 的 SSH PowerShell 技巧

http://www.virtu-al.net/2013/01/07/ssh-powershell-tricks-with-plink-exe

使用 SMA 管理启用 SSH 的 Linux 主机的示例 PowerShell 模块

这是用于管理启用 SSH 的 Linux 主机的示例 Windows PowerShell 模块。它包装了 Putty 工具 Plink.exe 来执行 SSH 命令。

https://gallery.technet.microsoft.com/scriptcenter/Sample-PowerShell-module-8d961a1c

值得注意的是,PS 有一个 SSH 模块,因此,您不必专门使用 Plink 与 Linux 客户端进行互操作。

将 SSH 与 PowerShell 结合使用

https://www.thomasmaurer.ch/2016/04/using-ssh-with-powershell

Posh-SSH 2.0.2

提供 SSH 和 SCP 功能以针对远程主机执行命令。

https://www.powershellgallery.com/packages/Posh-SSH/2.0.2

答案2

您只需要一个分叉并写入 PID 文件的远程脚本。

有很多方法可以做到这一点。

您使用什么客户端(plink、putty、ssh 或其他)都无关紧要。

只要:

  1. 您有运行该脚本的权限。
  2. 运行脚本的能力。
  3. 脚本中所有内容的权限。

我还没有尝试过这个,但是这是一个例子这是我花了 0.5 分钟在 Google 上搜索后发现的。

相关内容