我有点超出我的范围,所以请对我宽容一点。我在 vmware 中的 linux vm 和 Windows vm 上都安装了 Openssh。据我所知,这在 windows 上实现了某种形式的 cygwin。我可以 ssh 到用户文件夹:
C:\Program Files\OpenSSH\home\ATV>
, 像这样:
ssh -p22 -t ATV@DESKTOP-CGHF9HU bash
或者像这样:
ssh -p22 -t ATV@DESKTOP-CGHF9HU cmd OpenExcelFile.vbs
或者类似地使用 cmd 或 sh。我可以随心所欲地 cd 和 DIR,还可以运行 .exe、脚本等等。只是它们都以后台进程的形式启动。
我希望能够触发前台应用程序的实际执行。
基本来说,我可以通过 Linux 终端访问命令行和 Windows 操作系统。我可以 dir 文件系统并将所有内容 cd 到那里。但我无法将任何东西作为前台应用程序运行,只能作为后台进程运行,我想在 Windows VM GUI 中触发 Microsoft Excel 的实际打开吗?
编辑:问题在于显示....我可以启动 Microsoft Excel,并看到它在后台进程中运行。所以我想问题是如何能够:
- 通过 ssh 在前台启动应用程序。
- 或者触发一个在“窗口”中打开 Excel 的脚本。
现在我正在通过 scp 从 python 传输“文件”
os.system('scp CalculatedOutput/Opera.csv ATV@DESKTOP-CM5F9HU:')
os.system('ssh -t ATV@DESKTOP-CGHF9HU RunIf.vbs')
,尝试通过ssh打开脚本。
我还设法找到了 1.1 版的 winexe,但这个客户端似乎存在很多问题。我搜索了整个网络,但似乎没有一种语法组合可行:
os.system('./winexe --user=\DESKTOP-CGHF9HU/ATV%Mypassword //windows.domain.local --interactive=1 --uninstall --system OpenExcelFile.vbs')
我猜有些人知道如何做(破解)这个。你为什么要这么做?除非你是一个纯粹的 Unix 主义者,否则我认为这是显而易见的……
我没有机会放弃,所以我继续挖掘。正如下面的评论中提到的,确实存在访问限制,我猜微软不想允许访问他们的操作系统。尽管如此,看到您的其他 Windows 设置允许共享并且您的语法是正确的:
./winexe -U ATV%password //DESKTOP-CGHF9HU 'cmd.exe'
,您可以按照编辑您的注册表https://tommynation.com/enable-remote-access-administrative-shares-windows-10/ ,并且 winexe1.1 确实会允许您访问。现在我知道这并不安全,但我的所有虚拟机都在我的物理控制之下,所以我不在乎。
继续前进,问题仍然存在,因为上面的代码实际上允许您访问 Windows 命令行,但仍在后台打开应用程序。我无法将它们带到前台(如 -fg),目的就失败了。问题仍然存在,我如何让它们显示出来?我可以用 openssh 和 cygwin 做同样的事情,那么 winexe 应用程序的目的是什么?
编辑2:好吧,我不会在这里放弃,但是目前对我来说最好的方法是传输相关文件,然后通过 ssh 同时运行“if(文件存在)”脚本(来自 python):
os.system('scp CalculatedOutput/Opera.csv ATV@DESKTOP-CGHF9HU:')
os.system('ssh -p22 -t ATV@DESKTOP-CGHF9HU "cscript RunIf.vbs"')
用于自动化 Excel 的 vbscript 会自动在 Excel 的后台运行,我想我必须手动打开 Excel 进行可视化,这是我暂时必须接受的事实。不过,这是我最初的问题,所以我还是不回答这个问题。
答案1
不确定它是否适用于所有 Windows/Linux 组合
我希望登录的 Windows 用户能够看到通过 ssh 连接的用户正在做什么,反之亦然,我需要通过 ssh linux 会话“看到”它在前台启动的程序。
因此,我让它工作的唯一方法是让登录的 Windows 用户和 Linux ssh 用户相同,并且 Windows 用户使用命令 C:\OpenSSH\sshd.exe -f C:\wherever\sshd_config 启动自己的 ssh
如果 sshd 作为服务或计划任务启动,它就不起作用。
希望它能帮助别人
答案2
当您作为 ssh 客户端登录到 cygwin ssh 服务器时,ssh 会话似乎无法访问所有 Windows 命令。
但有一个解决方法,这个想法是
- 创建服务以执行 Windows 命令并从启动脚本启动它
- 通过添加在 cygwinhome 上的文件上执行的命令来使用此服务。
以下是具体实现。服务每次从 ~/winexec.bat 文件中读取一行命令,并将此行传递给 cmd.exe:
tail -f ~/winexec.bat|xargs -l cmd /c
以下是简单的设置方法(您可以将以下命令复制并粘贴到 cygwin 终端)
使用 cygwin shell 在 Windows 上设置服务:
# findout dos path of bash
bash=`which bash|xargs cygpath -d`
# findout full path to startup folder - works for windows 10
startup_dir="$APPDATA/Microsoft/Windows/Start Menu/Programs/Startup/"
# create batch which launch cygwin service
# to execute windows commands
cmd=">~/winexec.bat;tail -f ~/winexec.bat|xargs -l cmd /c"
# and put it to startup folder
service_fn="$startup_dir/winexec-service.bat"
echo $bash -l -c '"$cmd"'>"$service_fn"
此服务将在 Windows 启动时启动,或者您可以通过双击立即启动它$startup_dir/winexec-service.bat
现在要从 Linux 使用 ssh 执行一些有问题的命令,只需在 ~/winexec.bat 中添加带有命令的新行,如下所示:
ssh 192.168.2.107 'echo troubled-command>>~/winexec.bat'
瞧,您刚刚从 Linux Shell 提示符在 cygwin 主机上启动了完整的 Windows 命令!