You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell脚本通过SSH配置iDRAC网络时变量失效问题求助

问题描述

尝试通过PowerShell脚本在本地修改搭载iDRAC的服务器网络设置,单独执行命令可正常运行,但在脚本中使用变量时执行失败,报错信息如下:

ERROR: RAC947: Invalid object value specified. Make sure to specify the value depending on the type of object. For more information, see RACADM help.

怀疑是变量未被正确解析,相关脚本代码如下:

$idrac_iploopback = 169.254.0.1
$dns1 = 1.1.1.1
$dns1 = 8.8.8.8

$hosts_idrac = @{
    "HOSTNAME1" = @{"IP" = "192.168.1.200"; "MASK" = "255.255.255.0"; "GW" = "192.168.1.1"; "dns1" = $dns1; "dns2" = $dns2};
}
$idrac_ip_cust = $hosts_idrac.$servername.IP
$idrac_mask_cust = $hosts_idrac.$servername.MASK
$idrac_gw_cust = $hosts_idrac.$servername.GW
$idrac_dns1_cust = $hosts_idrac.$servername.dns1
$idrac_dns2_cust = $hosts_idrac.$servername.dns2

 #SSH connection with command input.
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.Address $($idrac_ip_cust)'
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.Netmask $($idrac_mask_cust)'
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.Gateway $($idrac_gw_cust)'
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.DHCPEnable 0'
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.DNSFromDHCP 0'
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.DNS1 $($idrac_dns1_cust)'
 ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback 'set iDRAC.IPv4.DNS2 $($idrac_dns2_cust)'
问题分析与解决建议

1. 核心问题:单引号字符串无法解析PowerShell变量

PowerShell中,单引号包裹的字符串不会展开变量,你当前ssh命令里的'set iDRAC.IPv4.Address $($idrac_ip_cust)'会直接把$($idrac_ip_cust)作为字面量传给iDRAC,而非变量对应的IP值,这是触发RAC947错误的主要原因。

解决方法:将ssh命令中的单引号改为双引号,让PowerShell解析变量后再传递给ssh:

ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.Address $idrac_ip_cust"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.Netmask $idrac_mask_cust"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.Gateway $idrac_gw_cust"
# 其余命令同理修改引号

2. 修复未定义的变量问题

你的脚本中存在两处变量未定义/赋值错误:

  • $dns2从未初始化,导致$hosts_idrac中的dns2 = $dns2值为$null,传递给iDRAC会触发无效值错误。需补充定义$dns2,比如$dns2 = 8.8.4.4。
  • $servername未赋值,$hosts_idrac.$servername会返回$null,后续的$idrac_ip_cust等变量全为空值。需明确指定服务器名称,比如$servername = "HOSTNAME1"。

3. 替代实现:使用本地racadm命令(更可靠)

如果本地安装了Dell官方的racadm工具,无需通过ssh执行命令,直接本地调用racadm更稳定,也避免字符串解析问题:

$idrac_iploopback = 169.254.0.1
$dns1 = 8.8.8.8
$dns2 = 8.8.4.4
$servername = "HOSTNAME1"

$hosts_idrac = @{
    "HOSTNAME1" = @{"IP" = "192.168.1.200"; "MASK" = "255.255.255.0"; "GW" = "192.168.1.1"; "dns1" = $dns1; "dns2" = $dns2};
}

$idrac_ip_cust = $hosts_idrac.$servername.IP
$idrac_mask_cust = $hosts_idrac.$servername.MASK
$idrac_gw_cust = $hosts_idrac.$servername.GW
$idrac_dns1_cust = $hosts_idrac.$servername.dns1
$idrac_dns2_cust = $hosts_idrac.$servername.dns2

# 使用racadm本地命令,需替换为你的iDRAC密码
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.Address $idrac_ip_cust
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.Netmask $idrac_mask_cust
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.Gateway $idrac_gw_cust
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.DHCPEnable 0
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.DNSFromDHCP 0
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.DNS1 $idrac_dns1_cust
racadm -r $idrac_iploopback -u root -p "your_idrac_password" set iDRAC.IPv4.DNS2 $idrac_dns2_cust
修正后的完整脚本示例
$idrac_iploopback = 169.254.0.1
$dns1 = 8.8.8.8
$dns2 = 8.8.4.4
$servername = "HOSTNAME1"

$hosts_idrac = @{
    "HOSTNAME1" = @{"IP" = "192.168.1.200"; "MASK" = "255.255.255.0"; "GW" = "192.168.1.1"; "dns1" = $dns1; "dns2" = $dns2};
}

$idrac_ip_cust = $hosts_idrac.$servername.IP
$idrac_mask_cust = $hosts_idrac.$servername.MASK
$idrac_gw_cust = $hosts_idrac.$servername.GW
$idrac_dns1_cust = $hosts_idrac.$servername.dns1
$idrac_dns2_cust = $hosts_idrac.$servername.dns2

# 修正引号后的SSH命令
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.Address $idrac_ip_cust"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.Netmask $idrac_mask_cust"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.Gateway $idrac_gw_cust"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.DHCPEnable 0"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.DNSFromDHCP 0"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.DNS1 $idrac_dns1_cust"
ssh -o 'StrictHostKeyChecking no' root@$idrac_iploopback "set iDRAC.IPv4.DNS2 $idrac_dns2_cust"

内容的提问来源于stack exchange,提问作者Eddy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:28:16