我有一个安装了 cygwin 和 ssh 服务器的 Windows 机器,运行良好,然而今天我遇到了一个我试图使用的命令,它会根据是在本地使用还是通过 ssh 使用而返回不同的结果。
首先,我们得到通过 ssh 运行的结果......
ssh -i /tmp/tmpyEW3f0 [email protected] 'tasklist /FI "username eq Administrator"'
INFO: No tasks running with the specified criteria.
现在我们在 10.13.7.210 上本地运行相同的命令并收到此结果...
C:\Documents and Settings\Administrator>tasklist /FI "username eq Administrator"
Image Name PID Session Name Session# Mem Usage
========================= ====== ================ ======== ============
explorer.exe 536 RDP-Tcp#14 0 24,400 K
jusched.exe 776 RDP-Tcp#14 0 9,228 K
ctfmon.exe 780 RDP-Tcp#14 0 3,456 K
ApacheMonitor.exe 796 RDP-Tcp#14 0 2,520 K
rdpclip.exe 444 RDP-Tcp#14 0 4,344 K
jucheck.exe 1160 RDP-Tcp#14 0 8,708 K
cmd.exe 876 RDP-Tcp#14 0 2,852 K
tasklist.exe 3008 RDP-Tcp#14 0 4,292 K
知道为什么这些会产生不同的结果吗?
答案1
造成这种差异的原因据说是 Windows 的安全机制,其中用户会话是分开处理的。同一个用户帐户在本地和通过 SSH 登录时会创建两个不同的会话,因此这两个会话之间不会显示任何窗口标题。
根据 Bitvise SSH Server 的支持回复:
这在跨会话中不起作用是有道理的,因为不同登录的桌面应该彼此隔离。如果这在 FreeSSHD 上起作用,则似乎有可能在同一个桌面中启动该进程。
[...]
我不知道如何才能让窗口标题在 Windows 会话之间可访问。Windows 会阻止这种情况,因为桌面之间存在安全边界。
至于针对某些情况的可能解决方案:在类似情况下,我最终使用 WMIC 作为替代方案。
之前使用的调用是
tasklist /T /F /FI \"WINDOWTITLE eq Some window title\"
取而代之的是
wmic process where "commandline like '%%some command line%%' and name like '%%filename%%'" list
但请注意,WMIC 无法根据窗口标题或运行进程的用户帐户进行过滤。在我的例子中,应用程序有一个独特的可执行文件和命令行组合,可用于过滤,但并非所有情况都是如此,因此这种替代方案并非适用于所有情况。