我在我们的一个管理虚拟机上全新安装了 Rundeck。 我在之前的工作中使用过 Rundeck,所以我有一些使用该工具的历史。
背景: 我们有多个包含代码的 GitHub 存储库,并且我们将更新推送到我们希望 Rundeck 运行的脚本。我以前能够编写调用其他脚本而没有问题的脚本。之前我已经能够将expects脚本与powershell脚本一起使用,通过Rundeck通过SSH推送新密码或文件,没有任何问题。
Rundeck 作业配置: 我尝试了多种方法来尝试执行脚本但没有成功。
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 秒才能完成,正如运行扫描时的预期一样。
但是,当我使用 Rundeck 运行相同的脚本时,我收到以下错误:
更改expect脚本退出的方式(放置stderr eof)不会改变行为,除了控制台多次记录eof之外,而不需要一次实际针对一台虚拟机运行expect脚本并等待扫描完成。
我花了两天时间尝试找到一种解决方案,让 Rundeck 作业像终端一样运行,我想我快疯了,我不可能是唯一遇到这样问题的人?
我尝试更改 Rundeck 执行 powershell 脚本的方式,但没有成功。 我尝试更改 Expect 脚本生成 ssh 命令的方式
spawn $env(SHELL)
send -- "ssh upsales@$SSH_IP 'sudo rkhunter -c -sk -q --summary'"
感谢@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 访问的脚本之外,所以一石二鸟!