我用C#编写了一个SSH服务器,并想把PowerShell作为shell连接到它上面。我试过两种方法,但都不完美。下面是我尝试过的:
- 启动powershell.exe并重定向其标准输入/输出。这种方法效果不好,因为powershell.exe检测到被重定向后会改变其行为。更重要的是,它期望在stdid上接收输入数据,而不是命令。因此,它使用控制台API来读取命令。
- 在“包装器”应用程序中托管powershell。这样做的好处是可以通过PSHostRawUserInterface为powershell提供“控制台”实现。这个方法效果更好,但你仍然可以调用像“...| more”这样期望使用控制台API并尝试从包装进程的控制台读取的命令(大多数是真正的控制台应用程序)。
所以我想做的是编写一组函数,替换掉控制台应用程序使用的常规控制台输入/输出函数,以便我可以处理它们。但这似乎太过激烈,甚至是一个糟糕的设计想法(在我看来)。
目前我的想法是通过发送相关键值对控制台进行操纵,使用本地/Pinvoke函数(如WriteConsoleInput)。我了解到可能可以通过这种方式虚拟控制台。但问题在于我无法“读取”控制台上发生的事情。
另外,请记住,这是一个服务,所以最好不要生成一个实际的控制台窗口,尽管在Windows会话0中可能不会显示出来,也不会影响到操作。