TypeInitializationException 在 SNMPTRAPD 下在 Powershell 中导入模块

TypeInitializationException Importing Modules in Powershell Under SNMPTRAPD

所以,这是我的设置:我有一台 Dell UPS,我想从中捕获特定的 SNMP 陷阱。为此,我将 SNMPTRAPD 设置为 运行 作为 Debian 9 上的一项服务。我在配置文件中有两个 "Traphandle" 语句,它们在检测到特定陷阱 OID 时启动 Powershell 脚本(代码如下)。这些脚本做的第一件事就是导入 VMware PowerCLI 模块,这失败并出现 TypeInitializationException。

我已经尝试在 Google 和 Powershell Core Github 上查找 TypeInitializationExceptions 的类似问题,但这些问题针对的是不同情况下的不同模块,或者问题解决方案有点像在我头上。我尝试将 .Net Core 更新到最新的预览版 (SDK 3.0.100-preview7-012821),但无济于事。当 运行 在 SNMPTRAPD 服务之外运行脚本时,不会出现此问题,模块导入完全正常。

这是我将代码缩减为:

#!/usr/bin/pwsh

$env:PSModulePath += ":/root/.local/share/powershell/Modules:/usr/local/share/powershell/Modules:/opt/microsoft/powershell/6/Modules"


Import-Module VMWare.Vim
exit 0

我必须将环境变量赋值放在那里以解决另一个错误,Powershell 找不到模块目录。 这是 SNMPTRAPD.conf 文件,如果还需要显示:

snmpTrapAddr 192.168.1.69:162
ignoreAuthFailure yes
doNotFork no
AuthCommunity log,execute,net public
traphandle .1.3.6.1.4.1.674.10902.2.140.0.47 /root/Desktop/pwshtest
traphandle .1.3.6.1.4.1.674.10902.2.140.0.48 /root/Desktop/killerpwsh

pwshtest是什么运行这个

我希望 powershell 脚本按原样导入模块并无错误退出,但相反,这是我得到的错误。

Import-Module : The type initializer for 'VMware.VimAutomation.ViCore.Util10.SettingsManager' threw an exception.
Jul 29 16:11:54 debian-upsmon snmptrapd[2184]: At line:6 char:1
Jul 29 16:11:54 debian-upsmon snmptrapd[2184]: + Import-Module VMware.Vim
Jul 29 16:11:54 debian-upsmon snmptrapd[2184]: + ~~~~~~~~~~~~~~~~~~~~~~~~
Jul 29 16:11:54 debian-upsmon snmptrapd[2184]: + CategoryInfo          : OperationStopped: (:) [Import-Module], TypeInitializationException
Jul 29 16:11:54 debian-upsmon snmptrapd[2184]: + FullyQualifiedErrorId : System.TypeInitializationException,Microsoft.PowerShell.Commands.ImportModuleCommand

我试图获取内部异常,但是,它似乎是 Null。也许我在那里做错了什么。 提前致谢

这里的问题是它需要一个用户文件夹来在某处写入一些设置xml。 它搜索当前用户的主目录,我敢打赌这个用户已经定义了 none。

您可以执行以下操作:

在您的 powershell 脚本中,在导入模块之前添加:

$env:HOME = "/home/myuser"

并为此用户创建主目录:

mkdir myuser

chown myuser:myuser myuser

chmod 700 myuser

那我建议进入交互式pwsh会话并设置:

pwsh

Set-PowerCLIConfiguration -Scope AllUsers -ParticipateInCeip $false

并且只是为了完整: 我为所有用户使用了这个模块路径:/usr/local/share/powershell/Modules 如果文件夹不存在,您必须创建它。

我在 Centos7 上测试过它,但我想它应该也适用于其他发行版。