当前位置: 首页 > 知识库问答 >
问题:

调用命令无法在远程计算机上运行另一个调用命令

韩宜春
2023-03-14

我的设置。我有三台PC:MyComp,Server1和Server2,两个类似的脚本使用调用命令RemTest1.ps1,它在远程Server1上调用RemTest2.ps1。RemTest2 使用 invoke-command 在 Server2 上运行脚本块。我使用的是Powershell版本5.1当我运行脚本从MyComp到Server1时,它工作正常。当我从Server1运行到Server2时,它也运行良好。但是,当我从 MyComp 运行到 Server1(必须在 Server2 上运行)时,我收到以下消息:

[服务器2]连接到远程服务器 Server2 失败,出现以下错误消息:WinRM 无法处理请求。使用 Kerberos 身份验证时发生以下错误,错误代码0x8009030e:指定的登录会话不存在。它可能已被终止。

这三台计算机都在同一个域中。我没有管理员权限。我试图将Server2添加到Server1上的TrustedHosts。但没有帮助。我在脚本中添加了用户名的打印,以确保在所有使用域用户的PC上。

如果有人能帮忙解决这个问题,请帮忙。为了重现这个问题,我用我的两个脚本创建了一个非常简单的例子。

RemTest1.ps1

$LocalRepDir  = 'D:\Reps'
$RemoteWrkDir = 'D:\wrk'
$Server1      = 'Server1'

#script block to run on remote Server1
$Run = {
    "Script block from RemTest1"
    $env:COMPUTERNAME + " User = $(whoami)" 
    cd $using:RemoteWrkDir
    ls
    # call script from remote server1
    .\RemTest2.ps1

}

$env:COMPUTERNAME + " RemTest1 User = $(whoami)" | Out-File -FilePath "$LocalRepDir\res.txt"

$Output = @()  # to grab an output from remote servers

$Output = Invoke-Command -ComputerName $Server1 -ScriptBlock $Run
$Output | Out-File -FilePath "$LocalRepDir\res.txt" -Append

RemTest2.ps1

$LocalRepDir  = 'D:\Reps'
$RemoteWrkDir = 'D:\wrk'
$Server2      = 'Server2'

#script block to run on remote Server2
$Run = {
    "Script block from RemTest2"
    $env:COMPUTERNAME +" User = $(whoami)" 
    cd $using:RemoteWrkDir
    ls
}

$env:COMPUTERNAME +" script RemTest2 User = $(whoami)"
$Output = @()  # to grab output from remote servers


$Output = Invoke-Command -ComputerName $Server2 -ScriptBlock $Run
$Output | Out-File -FilePath "$RemoteWrkDir\res.txt

这些脚本的输出

MyComp RemTest1 User = MyDomain\MyLogin
Script block from RemTest1
SERVER1 User = MyDomain\MyLogin


    Directory: D:\wrk


Mode                 LastWriteTime         Length Name            PSComputerName 
----                 -------------         ------ ----            -------------- 
-a---          4/23/2022  12:09 AM            490 RemTest2.ps1    SERVER1        
-a---          4/23/2022  12:06 AM              0 res.txt         SERVER1        
SERVER1 script RemTest2 User = MyDomain\MyLogin

如您所见,我没有收到SERVER2的RemTest2脚本块的输出。相反,我收到了错误信息。请帮帮忙。调用命令

共有1个答案

姬朗
2023-03-14

出于安全目的,windows不允许您从远程会话内部传递凭据。

如果您向它传递基于密码的凭证,它可能会工作。我的环境是基于证书的,我从来没有能够让它工作。

您最好让第一台计算机向两台服务器发送相同的命令。

Invoke命令可以同时获取两个机器名。

你也许可以通过ssh来做你正在做的事情,windows现在已经支持了。但是您的命令可能完全不同,仍然需要密码或ssh密钥。

对于第二台计算机的 invoke 命令,您可以尝试...

Invoke-Command -ComputerName $Server2 -ScriptBlock $Run -Credential (get-credential)

此外,您应该将日志附加到第二台服务器上,否则您会覆盖它。或者只是将其打印到屏幕上,初始调用命令也应该保存它的输出。

$Output | Out-File -FilePath "$RemoteWrkDir\res.txt" -Append

但据我所知,你不能做你想要做的事情。

本文解释了它是什么,以及利弊。我强烈建议不要这样做。一般来说,如果您想自动化,您必须在第二个脚本中存储凭据。

https://docs.microsoft.com/en-us/powershell/scripting/learn/remoting/ps-remoting-second-hop?view=powershell-7.2

它还指出,您必须认为一个帐户值得这样做。它非常复杂,应该在100%必要的场景中使用。一个例子是,如果您正在创建一个僵尸网络来大规模传播某些配置。但是对于像mecm这样的工具,这在企业中是不必要的

 类似资料:
  • 当试图从Jenkins向远程服务器执行一些shell命令时,我得到“主机密钥验证失败”。错误。

  • 问题内容: 我正在Ubuntu上用python编写程序,以在RaspberryPi上执行命令,并与网络连接。 有人可以指导我该怎么做吗? 问题答案: 当然,有几种方法可以做到! 假设您在主机上安装了Raspberry Pi,并且用户名是。 这是运行命令的默认Python库。 您可以使其运行并在远程服务器上执行所需的任何操作。 scrat已在他的回答中提及。如果您不想使用任何第三方库,则绝对应该这样

  • 我有一个Spring Boot2项目,这是一个ReST API,我正在使用Spring ReST。 我正在使用2个插件来生成一个SDK其他项目导入调用我的API。第一个插件是以生成swagger-codegen-spec文件,第二个插件是,以生成实际的SDK文件作为另一个mvn项目。 最后,我实现了组件测试自动化,这些组件测试使用SDK对正在运行的API运行测试。 我的目标是实际构建SDK作为原始

  • 问题内容: 我在远程计算机上有一个Java程序。它在同一文件夹中有一个配置文件。当我通过SSH进入计算机时,我会执行以下操作: 这里的问题是配置文件不在路径中,因为我们在主文件夹中,所以我的程序无法读取配置。 我想先进入该文件夹,然后从该文件夹运行程序。在shell脚本中,如果我这样做 它执行第一条语句,第二条语句运行时,它在我的当前计算机而不是远程计算机上运行。 我们可以只执行一个命令还是对此有

  • 问题内容: 我试图连接到主机,然后使用“ su-john”更改用户,然后以john身份执行命令。仅使用JSch是否有可能? 问题是在创建会话并打开通道并执行上述命令后,它应该要求输入密码,但没有任何反应。 这是我连接到远程计算机的方式: 然后我通过如下方法执行命令: 当我更改用户时,是否必须创建另一个频道,或者如何使其工作? 因为如果我用 它只执行“ su”命令,但没有完成用户的更改,之后执行“

  • 问题内容: 如何在golang CLI中的远程计算机上执行命令?我需要编写一个golang CLI,该CLI可以通过密钥SSH到远程计算机并执行shell命令。此外,我需要能够做到这一步。例如,SSH进入一台机器(例如云堡垒),然后SSH进入另一台内部机器并执行shell命令。 我(尚未)找到任何示例。 问题答案: 尝试使用os / exec https://golang.org/pkg/os/e