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


1

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

1)在Windows机器上的远程机器1,2和3(所有Linux)上运行shell脚本。

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

plink -i <my_private_key> user@machineX.com -t "bash <script_loc> args &"

当我这样做时,预期的过程不会开始。我确认通过远程登录到machineX(1,2或or3)并键入:

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

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

cmd /c start plink -i <my_private_key> user@machineX.com -t ""bash <script_loc> args ""&""""

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

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

如果没有创建服务,这可行吗?

问候,

Answers:


1

如果您正在运行plink,那么您没有使用PS远程处理来执行此操作,因为您只是在其中一个PS主机(console / ISE / VSCode)上运行plink命令。这不是PS问题,而是如何在PS中运行和执行。我每天都会毫不费力地连接到Linux机箱,但正如您在第二个命令和启动命令问题中所注意到的那样。

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

例如,这就是我成功运行所有Linux机器的方式。 那&amp; (&符号)表示 - 执行字符串作为命令。基本上你通过调用cmd.exe启动你正在做的事情,但没有额外的终端窗口。

# 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用例的文章,即使对于思科交换机也是如此。

SSH PowerShell使用plink.exe进行欺骗

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

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

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

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

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

在PowerShell中使用SSH

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


谢谢。我试图看看是否有一个系统的单元可以帮助我...但是如果我的machineX是黑盒子的话,你的解决方案似乎正常工作。
hagubear

0

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

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

你使用什么客户端(plink,putty,ssh或者什么)都没关系。

只要:

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

我没有尝试过这个,但是 这是一个例子 我在0.5分钟的Google会话中找到了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.