我的设置。我有三台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脚本块的输出。相反,我收到了错误信息。请帮帮忙。调用命令
出于安全目的,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