Linux下PowerShell远程时如何转发PowerShell.Exiting事件避免二次退出
问题1解答:为什么退出远程会话时不会触发PowerShell.Exiting事件
PowerShell.Exiting仅在PowerShell引擎正常有序关闭时触发,通过Enter-PSSession进入的交互式远程会话执行exit退出时,远程端的PowerShell实例由WS-Man服务直接终止,不会走引擎正常退出流程,因此不会触发该事件。- 事件转发依赖本地与远程的活跃会话连接,远程会话退出时连接会先断开,即使事件触发也无法成功转发到本地。
- 手动执行
New-Event PowerShell.Exiting是主动注入模拟事件,和引擎自动触发的退出事件逻辑不同,因此手动测试可以收到通知。
问题2解答:一次退出的实现方案
最简单的改法是在原有脚本的Enter-PSSession命令后追加本地退出逻辑,修改后的完整脚本如下:
pwsh -NoExit -Command ' Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Action { Write-Host "Received Exiting" } $creds = Get-Credential -UserName sysadm; $pss = New-PSSession -ComputerName remote-pc -Authentication Negotiate -Credential $creds; Invoke-Command -Session $pss { Register-EngineEvent -SourceIdentifier PowerShell.Exiting -Forward; } # 仅修改最后一行,远程会话退出后自动执行本地exit Enter-PSSession $pss; exit '
原理说明:Enter-PSSession是阻塞式命令,只有当你退出远程会话回到本地上下文时,才会执行后续的exit命令,直接退出本地pwsh进程,只需执行一次exit即可完成两层会话的退出。
如果你需要更灵活的控制,也可以在本地监听PSRemoting.SessionDisconnected事件,当检测到远程会话断开时自动触发本地退出,效果和上述改法一致。
内容的提问来源于stack exchange,提问作者MrMeszaros
相关产品推荐
相关产品推荐

