65.9K
CodeProject 正在变化。 阅读更多。
Home

RECEME - 通过电子邮件交换进行远程命令执行

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.87/5 (62投票s)

2010 年 9 月 17 日

CPOL

7分钟阅读

viewsIcon

140972

downloadIcon

2629

这里实现了一个服务概念,可以从任何地方到任何地方实现无缝的无连接计算。

1. 引言

REmote Command Execution through eMail Exchange,简称 RECEME,成功地解决了远程代码执行的问题。该解决方案以“ICommand”的形式在计算机(服务应用程序正在运行)上执行任何 .NET 可运行代码。

命令可以通过电子邮件/推文/(原则上,任何其他方式,例如 SMS/电话/等)发送到已连接的通信客户端(当前实现中的电子邮件收件箱)来从任何其他位置触发。

2. 背景

传统的通信系统在自动化领域存在许多痛点。VPN 等并非人人都能掌握。此外,面向连接的通信服务无法从某些防火墙设置后面访问。

让我们讨论一个实际问题

问题:我们的团队成员必须每晚 12 点待在办公室,以启动一个进程并检查其执行情况和结果(构建完成),然后回家。问题在于,只有在收到某个管理决策的触发信号后,他才能启动构建。通常,他在午夜前收到来自另一个国家(那里仍是白天)的电子邮件,要求他启动构建。而且这种情况并非每天都发生,所以他不能每天午夜设置一个自动计划构建。邮件是对话式的,没有特定的格式,因此他无法设置 Outlook 规则。即使他设置了,他也无法收到回复。即使那样发生并且出现问题,他也无法重新启动构建。

悲伤的故事:他再也无法安心,每天早上上班都迟到。

答案:他现在可以安心地使用“RECEME”,在舒适的家中控制巨大的构建服务器,甚至可能是在半睡半醒的时候。

我列出了理解该服务基本概念以及为您的使用场景开发自定义命令的几个先决条件。

  1. C# .NET (可能是 2.0;最好是 3.0)
  2. 接口和抽象的基本概念
  3. 关于反射的一些想法
  4. C#、Web 服务、反射以及连接到公共免费电子邮件服务(如 GMail/Twitter/Hotmail/Outlook/Exchange/等)的知识。

3. RECEME 如何工作

receme/image1.gif

RECEME 服务应用程序可以在系统上启动,并连接到所需的 CommunicationClient。目前,支持的通信客户端包括:

  1. 电子邮件 - GMail / Hotmail / Outlook / Exchange(用于企业电子邮件)
  2. 社交网络 - Twitter
  3. 未来 - SMS / BluFi / 电话 / 基本上任何通信媒介

一旦服务运行,您就可以通过从任何介质发送电子邮件/推文/SMS 来与您的系统(运行 RECEME 的系统)进行通信。通信模式通过运行在 systemXYZ 上的 RECEME 应用程序进行。其工作原理的基本架构在上面的图片中进行了说明。通信以简单的请求-响应方式进行。例如,您发送一个请求电子邮件,RECEME 服务会将一个响应电子邮件发送回给您。

RECEME 服务和您可以连接到不同的通信客户端,但仍能成功工作。

此外,在远程位置部署自定义命令还有优势。在这种情况下,您可以创建命令的 DLL,并将 DLL 与“deploy”命令一起发送。RECEME 安装此新命令,然后您可以发送此新命令来获得服务。

内置命令以及如何创建自定义命令的说明如下。原则上,可以在同一台计算机上运行任何代码。此外,通过实现 AbstractCommunicationClient,可以使用任何通信客户端。

RECEME 支持的更通用的场景是

receme/image2.gif

4. 使用代码

使之工作所需的操作

4.1. 使用 ICommand 接口开发自定义命令

实现 ICommand 接口

public interface ICommand 
{
    string Run(string options);
}

实现 ICommand 接口的类可以打包成 DLL,然后放入<Environment.CurrentDirectory>\Commands 目录中。

重要提示:示例实现可在附加的 zip 文件中找到。另外,在同一个文件夹中,您会找到 Command.Core.dll,其中包含 ICommand 接口。在开始为您的用途开发任何自定义命令 (ICommand) 之前,您需要将此 DLL 添加到您的项目中作为引用。如有任何问题,请随时向我提问(联系信息在本文章末尾)。

完成这些操作后,启动 RECEMEapp.exe。RECEME 服务随即启动并连接到电子邮件服务。

之后,从世界任何地方向连接的邮箱发送电子邮件,并在几分钟内从 RECEME 服务收到回复。它还连接到 Twitter,并且在逻辑上可以扩展此概念以连接到 SMS/VoiceTelephony 等。

服务启动后,您可以随时随地与启动的服务进行通信。

如果一切顺利,每次请求时,您都会从 RECEME 服务收到回复到您的本地邮箱,并带有命令 Smile | :)

receme/screenshot.GIF

4.2. 可以实现什么...

从技术上讲,所提出的解决方案(以及附加的实现)成功地解决了远程代码执行问题

  1. 无需在两个系统之间建立直接/间接连接
  2. 物理和网络上独立,但仍可控制远程进程
  3. 双向通信(发送命令并获得响应)
  4. 极具吸引力且易于使用
  5. 无需额外的成本、时间、资源、精力
  6. 只需一行配置即可管理(实际上是四个基本单词)

更实际地说,让我们假设一个场景:我在办公室,想查看我的家庭电脑上发生了什么。我该怎么做?

我只需从我当前可用的任何邮件客户端,从世界任何地方发送一封电子邮件到我的 GMail/Hotmail/等...,并在几分钟内(可能更少)收到一封回复到我的邮箱,显示我的家庭桌面的当前屏幕截图当前运行的进程以及它们占用的进程或内存量它们是否挂起(可能我还想终止挂起的进程)。

现在,让我们回顾一下上面的几点

  1. 我无需与我的家庭电脑建立任何连接
  2. 我当前的计算机和家庭电脑仍然是相互独立的
  3. 我发送了一个命令并收到了一个响应
  4. 很简单
  5. 没有任何额外成本
  6. 我家庭电脑上已运行了一行配置的服务

上述问题中的一部分可以通过大量现有技术的混合和即插即用开发组件来解决。

更多详细信息可以在可下载的文档中找到(使用文章开头的链接)。

4.3. 已有的示例命令

二进制文件和示例命令(包含如何实现命令的源代码)也可供下载(使用文章开头的链接)。

原则上,通过实现 ICommand 接口,可以在编程世界中实现任何功能,并将其作为命令。一些基本命令附带以下说明。

用户命令
$CMD command=notepad,options="<FilePathToOpen>"
$CMD command=iexplore,options="<LinkToOpen>"
$CMD command=deploy,options="<WebLink_Of_ICommandDll_ToBeDownloadedAndDeployed>"
$CMD command=process,options="notepad.exe"
$CMD command=screenshot,options=<DONT_CARE>
$CMD command=ping,options="192.168.1.2"
$CMD command=runprocess,options="ping -n 10 mymachineOrIP"
管理员命令
$CMD command=lock,options="<lockoptions>",key"<SecretKey>" 
$CMD command=unlock,options="<unlockoptions>",key="<Secretkey>"
示例响应

receme/IMG_0272.JPG

5. 注意事项

对于当前实现的通信客户端,请在电子邮件主题行中编写命令。邮件正文不会被读取,所以您在正文中写什么并不重要。

请使用“ 而不是 “ 来指定命令。

GMail 客户端的 SendMail 在某些防火墙后面可能会失败,或者 GMail 被其他来源(如愚蠢的公司策略 :P)阻止。所以请查看日志以了解问题。

来自所有通信客户端的 SendMail 可能会零星地抛出 WebException。因此,RECEME 内置了重试机制,最多重试发送响应三次。请检查是否有防火墙阻止发送邮件。

TwitterClient 已知不起作用,因为 Twitter 已将其授权更改为 3-legged XAuth。我正在努力解决这个问题...

------------ 感谢 Caludio Tortorelli(本文讨论区)澄清了这些问题并帮助我找到了一些 bug Smile | :)

6. 适用性

  1. 自动化(公共/个人)
  2. 多站点代码执行(类似无连接的安全网格计算)
  3. 远程办公
  4. 家用电器 [正在研究通过 USB 开关,以便在办公室时在家中启动/停止我的电视]
  5. 需要为“bluefi”创建一个通信客户端

7. 接下来的计划?

  1. 计划在命令识别和执行之间添加一个调度程序模块,用于延迟命令执行。
  2. 一个可插拔的编解码器模块,以提高安全性。

联系方式

8. 历史

数月来的苦苦思索 :P

  • 2010 年 9 月 23 日:修复了一些 bug 并澄清了某些问题。
  • 2010 年 9 月 17 日:获得 CodeProject 社区的批准。
  • 2010 年 9 月 12 日:发布到 Codeproject.com。
  • 2010 年 3 月 14 日:首次公开讨论和演示。
  • 2009 年 12 月:开始构思...
© . All rights reserved.