【问题标题】:How to have full control over terminal with networking?如何通过网络完全控制终端?
【发布时间】:2013-02-10 20:45:24
【问题描述】:

有没有办法通过网络完全控制终端。例如,我有一个用 C 编写的服务器和客户端,我想向服务器(本例中的服务器是一台 linux 计算机)发送一个类似 rm filecd directory 的命令,并将终端输出返回给客户端。我目前正在使用ls 使用popen(),但它不能更改目录或执行其他复杂命令。有没有更好的方法来做到这一点,也许使用fork() pipe() 和其他函数来使用任何命令并从终端获取完整输出。

【问题讨论】:

  • 我不知道您为项目所做的具体权衡和假设。但如果我要做这样的事情,我可能只会要求程序使用“ssh”来安全地登录并运行命令。例如:“ssh remote-server '/bin/ls'”。
  • @MultimediaMike 基本上我想通过网络获得 linux 终端的精确副本。比如我可以执行ls之类的命令,它会将结果发送给客户端,或者cat > file,服务器和客户端将监听输入并根据您输入的内容创建一个文件等。
  • @alexis 这是最吸引人的项目,我很乐意让它发挥作用。
  • 听起来不错,那么我的建议是选择一个方面来实现(大概是网络),其余的使用标准设施。
  • @alexis 我已经完成了联网,但是我不知道如何去终端控制部分从终端获取输出。

标签: c linux terminal


【解决方案1】:

你所要求的都是通过 SSH 完成的。

例如,我有一个用 C 编写的服务器和客户端,我想向服务器(本例中的服务器是一台 linux 计算机)发送一个类似 rm 文件或 cd 目录的命令并将终端输出返回给客户端.

我强烈反对自己实现这样的功能。很有可能,您自己的方法会有几个安全问题。

SSH 是远程终端的事实标准,具有强大的加密、真实世界测试的身份验证和强大的维护支持。还有一些优秀的开源实现,比如 OpenSSH。

【讨论】:

  • 我并不担心或对制作此内容所涉及的安全问题感兴趣。我这样做是为了学习,并有一个有趣的工具可供将来使用。不过,我感谢您的关注。
  • @HurricaneChris:说到网络编程,安全问题是最重要的问题。你根本不能忽视这个问题,因为这是“为了学习”。一旦您将某些东西附加到网络套接字上,并且用于学习,您必须考虑安全性;如果是学习经验,那么您还将了解安全性。安全性的三个方面是机密性、完整性和可用性。
  • 非常感谢您的意见,因为它非常重要,您有什么推荐的参考资料或教程吗?
  • @HurricaneChris:我会从《安全工程》这本书开始(合法免费在线获取)cl.cam.ac.uk/~rja14/book.html - 没有单一的灵丹妙药可以解决这个问题,这本书做得很好在让一个新手开始。然后我可以推荐 Bruce Schneier 的文章,当然还有阅读各种黑客发布的文章,例如 phrack.com(请务必阅读带有适量盐的文章)。
  • @HurricaneChris:学习网络编程时,不要从远程shell开始。从简单的事情开始,比如聊天,然后尝试打破协议。然后添加容易破坏的东西,例如您可能想要添加图像文件的传输然后显示在远程端。可能性很高,你建立了一些脆弱的东西。关于您关于远程外壳的问题,当然值得了解它们如何在另一端制作终端。我建议您阅读 pty(7) API kernel.org/doc/man-pages/online/pages/man7/pty.7.html
【解决方案2】:

不确定您的确切设置是什么,但为什么不直接在远程端分叉一个外壳?然后,您可以做任何可以从命令行完成的事情。

如果可以选择真实的交互式连接,请查看 pty(“pseudo-ttys”)。这就是真正的终端应用程序的工作方式。

【讨论】:

  • 我的设置是一台archbang笔记本电脑和一台windows台式机,我已经联网了,但我希望能够从桌面使用笔记本电脑的终端,功能齐全。
  • 分叉一个远程外壳。 cat > file 符号是 shell 命令语言的一部分。如果您尝试自己实现它,那么您就是在创建自己的外壳,而一次重新发明的轮子太多了。
  • 一旦我有了 shell fork()ed 在执行命令后如何从 shell 获取输出?
【解决方案3】:

如果您可以从ls 获得输出,那么您就在正确的道路上。

接下来是能够发送输入,与输出没有太大区别。您可以使用命令cat 来检查您是否做对了,同时输入和输出。

然后,只需运行您喜欢的 shell 命令,例如 bash,您就可以将命令写入输入流并读取每个命令的输出。

注意cd 不是程序;它是一个 shell 命令,所以你必须运行一个 shell 才能让它有任何意义。重定向和您似乎想要做的其他复杂性也是如此。

PS:请注意,这可能是一个严重的安全问题,并且您应该认真考虑已经制作的替代方案,例如 ssh,正如其他人所说的那样。

【讨论】:

  • 我目前正在将popen() 用于ls 命令,但它不适用于其他命令。例如,当使用cd Documents/ 时,我收到/bin/sh: Documents/: is a directory 并且它不会更改为它或任何东西。
  • 啊,但是popen不能同时读写!你必须自己做pipefork 的事情!
  • 感谢您提出这个问题!您能否进一步详细说明我应该如何解决这个问题?
  • 嗯,我相信网上有很多关于如何做到这一点的资源,但想法是:1)使用pipe()创建输入管道; 2)再次使用pipe()创建输出管道; 3)fork(); 4)在子进程中关闭输入管道的写端和输出管道的读端; 5)在孩子做exec(); 6)在parent中关闭输入管道的读端和输出管道的写端; 7) 在父级中从 / 到管道读取和写入,不要忘记在子级完成时为 wait() 发送,否则它将转换为僵尸!
  • 我了解pipingforking 的过程,但就exec() 而言,它是否在终端中执行命令并保留终端的输出?这是我面临的主要问题
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2019-11-25
  • 2011-12-11
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多