【问题标题】:How to run a Powershell command in Rundeck with pipes如何使用管道在 Rundeck 中运行 Powershell 命令
【发布时间】:2019-09-25 15:36:27
【问题描述】:

我正在使用 Rundeck 3.0.13 版通过 WinRM 将 powershell 命令发送到 Windows Server 2016 主机。有没有办法将带有管道字符的powershell命令作为单个命令运行?例如,我希望能够执行这样的命令来启动非禁用服务:

Get-Service | where-object {$_.StartType -ne "Disabled"} | foreach-object {Start-Service $_}

但是我得到了错误返回“找不到对象”命令。 WinRM 节点执行程序在 CMD 提示符下将命令作为参数运行给 powershell,因此发生的情况是命令的 Get-Service 部分在 Powershell 中运行,但随后它尝试通过管道传输到 CMD 中的“where-object”提示,像这样:

CMD> powershell Get-Service | where-object ... 

有什么办法可以在 Rundeck 中转义 powershell 语句,以便管道命令在 powershell 中运行,而不仅仅是第一部分?我尝试将它包含在 -command "& {...}" 中,但无济于事。 (在这种情况下,我会收到语法错误,并因此出现 powershell 帮助屏幕。)

谢谢!

【问题讨论】:

  • 为什么不执行一个预先设计好的脚本,一个.ps1文件呢?我不明白为什么这么多人尝试将一系列命令传递给PowerShell 主可执行文件,而您可以更轻松地维护一个简单的脚本文件。您是否有理由必须以这种方式发送脚本命令?
  • 是的,我同意。在我们的例子中,网络管理员有一个防火墙规则来阻止 C$ 管理共享,从而阻止我们使用 WinRM 将脚本从 rundeck 主机推送到 windows 目标。

标签: powershell rundeck


【解决方案1】:

最简单的方法是调用@gravity所说的脚本或使用内联脚本步骤,选择新的“脚本 - 执行内联脚本”步骤,单击“高级”按钮设置“powershell.exe”在“ “文件扩展名”文本框中的“调用字符串”和“.ps1”(当然还有“输入要执行的整个脚本”框中的 Powershell 内容)。

如果您的 windows 节点禁用了远程脚本执行,您可以在 windows 节点上使用set-executionpolicy remotesigned 启用它。

更新答案:

如果您想直接在“命令步骤”上执行(因为您所说的安全策略受到限制),请确保在您的项目配置中配置了“WinRM Node Executor Python”(在“Default Node Executor”上),在“Shell”文本框上定义“Powershell”。此外,将“默认文件复制器”上的“WinRM Node Executor Python”定义为良好做法。

现在您不需要在命令中调用“poweshell.exe”,只需输入您的管道命令即可,例如Get-Content myfile.txt | Select-string -SimpleMatch "${option.mystring}"

【讨论】:

  • 太棒了!我让它与 WinRM Node Executor Python 一起工作。两个简短的说明:(1)我必须将我的双引号字符串文字括在单引号中,如错误消息所示,如下所示:Get-Service | where-object {$_.StartType -ne '"Disabled"'} | foreach-object {Start-Service $_}(总共 3 个引号)(2)我自己没有添加“powershell.exe”;除非我误读了源代码,否则常规的 WinRM Node Executor 会执行此操作并在 cmd shell 中运行整个 shebang。
【解决方案2】:

您必须设置正确的节点定义,您的项目是混合使用 Windows 和 Linux 节点还是仅使用 Windows 节点?

您的 rundeck 服务器是 windows 吗?如果是,请将项目执行模式设置为本地,或使用 WinRm 节点执行器 python。 查看以下节点定义,我正在使用 pywinrm 对启用了凭据委托的 Windows 节点执行并将默认 shell 设置为 powershell,使用此配置我可以运行第二跳查询和管道作为一个衬垫。

  <node name="server.WinRMPython" 
    description="JUMP" 
    tags="Server 2019,WinRMPython" 
    hostname="myserver" osArch="amd64" 
    osFamily="windows" 
    osName="Server 2019" 
    osVersion="2019" 
    role="jump server" 
    function="rundeck execution node" 
    username="my user" 
    winrm-password-option="winrmPassword" 
    winrm-password-storage-path="keys/windows/myserver.pass" 
    node-executor="WinRMPython" 
    file-copier="WinRMcpPython" 
    Winrm-protocol="http" 
    winrm-cmd="PowerShell" 
    winrm-auth-type="credssp" 
    file-copy-destination-dir="c:\temp"/>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-02
    • 2012-12-27
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多