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

Posh-SSH循环调用WriteLine方法时首字符丢失问题排查

Posh-SSH操作Cisco设备时循环首条命令丢失首字符

异常代码片段

$Stream = New-SSHShellStream -SessionId $Session.SessionId
$Stream.WriteLine("sh object-group name $ObjGroup")
Start-Sleep -Seconds 1
$Result = $Stream.Read()
Write-Warning "$Result"
if ($Result.Contains('Network object group')) {
  foreach ($Item in $IPs) {
    $Stream.WriteLine("sh object-group name $ObjGroup | i $Item")
}
Start-Sleep -Seconds 1
$Result = $Stream.Read()
Write-Warning "$Result"

异常现象

执行后警告输出显示循环中第一条命令首字符丢失(如sh变成h),后续命令正常:

WARNING:
Session established with AUTHENTICATION Servers

Connected to hostname01 line 2
Use of this system constitutes your consent to monitoring


hostname01#sh object-group name OBJECT_GROUP
Network object group OBJECT_GROUP
 Description -- ACL: Host and Subnets Drop Xway Service --
 host 2.57.168.230
 host 2.57.168.233
 host 2.57.169.46
 host 43.153.134.127
 host 45.8.17.67
 host 45.91.23.11
 host 45.130.81.76
 host 45.131.193.74
 host 45.131.195.174
 host 45.132.224.63
 host 45.146.54.5
 host 45.146.55.147
 host 66.133.123.247
 host 68.67.59.21
 host 68.67.59.22
 host 74.208.83.155
 host 84.247.59.217
 host 85.203.15.17
 host 85.203.36.128
 host 85.237.194.68
 host 86.188.222.131
 --More--

hostname01#h object-group name OBJECT_GROUP | i 193.107.216.241
help object-group name OBJECT_GROUP | i 193.107.216.241
^
% Invalid input detected at '^' marker.

hostname01#sh object-group name OBJECT_GROUP | i 74.208.83.155
 host 74.208.83.155
hostname01#sh object-group name OBJECT_GROUP | i 84.247.59.217
 host 84.247.59.217
hostname01#sh object-group name OBJECT_GROUP | i 85.203.15.17
 host 85.203.15.17
hostname01#sh object-group name OBJECT_GROUP | i 85.203.36.128
 host 85.203.36.128
hostname01#sh object-group name OBJECT_GROUP | i 85.237.194.68
 host 85.237.194.68
hostname01#sh object-group name OBJECT_GROUP | i 86.188.222.131
 host 86.188.222.131
hostname01#

原因判断

这不是操作失误,属于Posh-SSH的ShellStream缓冲区残留问题。之前执行sh object-group后设备返回了分页输出(--More--),但代码里的Start-Sleep和单次$Stream.Read()没有把缓冲区里的所有数据读完,残留的控制字符(比如分页等待时的输入触发字符)会和第一条新命令的首字符冲突,导致首字符被“吃掉”。

解决方法

1. 先清空缓冲区再执行循环命令

在进入foreach循环前,先处理完设备的分页输出,确保ShellStream缓冲区完全清空:

# 发送q退出分页模式
$Stream.WriteLine("q")
Start-Sleep -Milliseconds 500
# 循环读取直到缓冲区没有数据
while ($Stream.DataAvailable) {
    $null = $Stream.Read()
}

2. 替换固定Sleep为动态缓冲区检查

不要依赖固定的Start-Sleep,而是通过$Stream.DataAvailable判断是否有数据可读,减少残留概率:

$Stream.WriteLine("sh object-group name $ObjGroup")
# 等待数据生成
Start-Sleep -Milliseconds 500
# 读取所有输出直到缓冲区空
$output = @()
while ($Stream.DataAvailable) {
    $output += $Stream.Read()
    if ($output[-1].Contains('--More--')) {
        $Stream.WriteLine("q")
        Start-Sleep -Milliseconds 200
    }
}
$Result = $output -join ''
Write-Warning "$Result"

3. 优化循环内的命令发送逻辑

每次发送新命令前,确保缓冲区为空;发送后等待数据可用再读取:

if ($Result.Contains('Network object group')) {
    foreach ($Item in $IPs) {
        # 清空缓冲区
        while ($Stream.DataAvailable) {
            $null = $Stream.Read()
        }
        $Stream.WriteLine("sh object-group name $ObjGroup | i $Item")
        # 等待命令执行完成
        Start-Sleep -Milliseconds 300
        # 读取结果
        $loopResult = $Stream.Read()
        Write-Warning "$loopResult"
    }
}

修改后的完整代码

$Stream = New-SSHShellStream -SessionId $Session.SessionId
$Stream.WriteLine("sh object-group name $ObjGroup")
Start-Sleep -Milliseconds 500

# 读取并处理分页输出,清空缓冲区
$output = @()
while ($Stream.DataAvailable) {
    $output += $Stream.Read()
    if ($output[-1].Contains('--More--')) {
        $Stream.WriteLine("q")
        Start-Sleep -Milliseconds 200
    }
}
$Result = $output -join ''
Write-Warning "$Result"

if ($Result.Contains('Network object group')) {
    foreach ($Item in $IPs) {
        # 确保缓冲区为空再发命令
        while ($Stream.DataAvailable) {
            $null = $Stream.Read()
        }
        $Stream.WriteLine("sh object-group name $ObjGroup | i $Item")
        Start-Sleep -Milliseconds 300
        $loopResult = $Stream.Read()
        Write-Warning "$loopResult"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:16:01