无法让期望脚本在 Rundeck 中工作

问题描述 投票:0回答:1

我在我们的一个管理虚拟机上全新安装了 Rundeck。 我在之前的工作中使用过 Rundeck,所以我有一些使用该工具的历史。

背景: 我们有多个包含代码的 GitHub 存储库,并且我们将更新推送到我们希望 Rundeck 运行的脚本。我以前能够编写调用其他脚本而没有问题的脚本。之前我已经能够将expects脚本与powershell脚本一起使用,通过Rundeck通过SSH推送新密码或文件,没有任何问题。

Rundeck 作业配置: enter image description here 我尝试了多种方法来尝试执行脚本但没有成功。

Powershell 脚本:

#!/opt/microsoft/powershell/7/pwsh

. /var/lib/rundeck/github/redacted/modules/netbox.ps1
. /var/lib/rundeck/github/redacted/modules/keys.ps1
. /var/lib/rundeck/github/redacted/modules/tools.ps1


function run_rkhunter {
    param (
        [Parameter(Mandatory = $true)]$ssh_ip,
        [switch]$view_log
    )

    $prompt = . /var/lib/rundeck/github/redacted/scripts/rkhunter.exp "$ssh_ip"

    if ($view_log) {
        $prompt
    }

    if ($LASTEXITCODE -eq 0) {
        $testsuccess = $true
    } elseif ($LASTEXITCODE -eq 1) {
        $testsuccess = "denied"
    } elseif ($LASTEXITCODE -eq 2) {
        $testsuccess = $false
    } elseif ($LASTEXITCODE -eq 5) {
        $testsuccess = "timeout"
    } else {
        $testsuccess = "unknown"
    }

    return $testsuccess
}

$netbox_user = "netbox-API-read"
$netbox_password = get-key -username $netbox_user
$connect_netbox = connect-netboxserver -username $netbox_user -password $netbox_password

if (-not $connect_netbox) {
    exit 1
}

Write-Host "Getting VM's from Netbox"
$nb_vms = get-netboxVM | Sort-Object { $_.name }
disconnect-netboxserver

$failed_scans = @()

foreach ($vm in $nb_vms) {
    if ($vm.status.value -ne "active") {
        continue
    } elseif ($vm.role.slug -in ("admin", "vmware", "fortinet")) {
        continue
    }

    Write-Host "Scanning $($vm.name)"

    $ip = $vm.primary_ip.address -replace "/.*"

    $scan_result = run_rkhunter -ssh_ip $ip

    if (-not $scan_result) {
        $failed_scans += $ip
    }
}

if ($failed_scans.count -gt 0) {
    Write-Host -ForegroundColor Red "`nSome scans failed, check /var/log/rkhunter.log at these hosts:"
    foreach ($ip in $failed_scans) {
        Write-Host -ForegroundColor Red "$ip"
    }
    exit 1
} else {
    Write-Host -ForegroundColor Green "All scans successful"
}

期待脚本:

#!/usr/bin/expect -f

set SSH_IP [lindex $argv 0]

set timeout 90

expect_before {
    timeout { puts "timeout"; exit 5 }
    eof     { puts "eof";     exit 0 }
}

spawn ssh admin@$SSH_IP "sudo rkhunter -c -sk -q --summary"
expect "*Permission denied*" {
    exit 1
} "*No warnings were found while checking the system*" {
    exit 0
} "*One or more warnings have been found while checking the system*" {
    exit 2
}

expect eof

以 rundeck 用户身份从虚拟机运行脚本不会出现任何问题,并且脚本的行为与我预期的完全一样。 Powershell 脚本执行 Expect 脚本,每个虚拟机大约需要 60 秒才能完成,正如运行扫描时的预期一样。 enter image description here

但是,当我使用 Rundeck 运行相同的脚本时,我收到以下错误: enter image description here

更改expect脚本退出的方式(放置stderr eof)不会改变行为,除了控制台多次记录eof之外,而不需要一次实际针对一台虚拟机运行expect脚本并等待扫描完成。

我花了两天时间尝试找到一种解决方案,让 Rundeck 作业像终端一样运行,我想我快疯了,我不可能是唯一遇到这样问题的人?

我尝试更改 Rundeck 执行 powershell 脚本的方式,但没有成功。 我尝试更改 Expect 脚本生成 ssh 命令的方式

spawn $env(SHELL)
send -- "ssh upsales@$SSH_IP 'sudo rkhunter -c -sk -q --summary'"

这会导致不同类型的错误。 enter image description here

powershell expect rundeck
1个回答
0
投票

感谢@GlennJackman,我得到了这份工作(我希望你能看看这个问题)

更新后的脚本可以正常工作:

#!/usr/bin/expect -f

set SSH_IP [lindex $argv 0]

set timeout 90

set force_conservative 1
if {$force_conservative} {
    set send_slow {1 .1}
    proc send {ignore arg} {
        sleep .1
        exp_send -s -- $arg
    }
}

spawn /bin/bash

expect_before {
    timeout { puts "timeout"; exit 5 }
    eof     { exit 0 }
}

send -- "ssh admin@$SSH_IP 'sudo rkhunter -c -sk -q --summary'\r"
expect "*Permission denied*" {
    exit 1
} "*No warnings were found while checking the system*" {
    exit 0
} "*One or more warnings have been found while checking the system*" {
    exit 2
}

expect eof

生成 shell 还解决了我遇到的另一个问题,除了验证 SSH 访问的脚本之外,所以一石二鸟!

© www.soinside.com 2019 - 2024. All rights reserved.