从 Linux 到 Windows 的 SSH 不会在 Windows 环境中执行命令(仅作为后台进程)

从 Linux 到 Windows 的 SSH 不会在 Windows 环境中执行命令(仅作为后台进程)

我有点超出我的范围,所以请对我宽容一点。我在 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 命令。

但有一个解决方法,这个想法是

  1. 创建服务以执行 Windows 命令并从启动脚本启动它
  2. 通过添加在 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 命令!

相关内容