如何在Rundeck中使用管道运行Powershell命令

时间:2019-09-25 15:36:27

标签: powershell rundeck

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

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

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

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

是否有任何方法可以在Rundeck中转义powershell语句,以便管道命令在powershell中运行而不是仅在第一部分中运行?我尝试将其包含在-command“&{...}”中无济于事。 (在那种情况下,我得到一个语法错误,结果是Powershell帮助屏幕。)

谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

更新答案:

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

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

答案 1 :(得分:0)

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

您是Rundeck服务器窗口吗?如果是,则将项目执行模式设置为本地,或使用WinRm节点执行程序python。 看一下以下节点定义,我正在使用pywinrm对启用了凭据委托的Windows节点执行,并将默认外壳设置为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"/>