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
相关产品推荐
相关产品推荐

