可以通过SSH访问计算机上的开放终端吗?

我希望在不使用tmuxscreen情况下从远程计算机访问一个开放式终端,即在我的机器上本地打开。 这有几个原因,其中最简单的是我不断登陆,我没有提前计划,在我的电脑上运行一些大的工作,回家然后想通过ssh检查它。

本质上,我正在寻找一种方法来连接已经在计算机上运行的终端并查看其输出。

现在,我知道有一些线程说你不能这样做(比如这个 ),而其他人只是推荐screentmux (就像这个 , 这个或者这个 )。 我正在寻找的是一种直接访问正在运行的终端进程的方法,或者至少可以看到该终端的缓存输出。 我不一定需要能够在该终端中输入命令。

有没有办法做到这一点? 否则,任何关于黑客攻击的想法都可行吗? 我以为我可能会找到一种方法来自动将stdout,stderr和命令记录到文件中(也许是对bash历史记录的一个聪明的调整,记录了所有内容?)

简单地说,由于终端的构建方式,无法访问所有内容 ,即如果您没有在所述终端内运行可分离的会话,例如screentmux会话,则无法查看正在运行的终端与之交互。如果你没有通过script命令记录启动该命令。

可以做的是通过sudo cat /dev/vcs1命令部分查看 TTY。 /dev/vcs[1-6]对应于它们各自的TTY控制台。 这受到相应TTY的回滚缓冲区大小的限制,这意味着您只能看到内存中保存的特定行数。 这当然可以调整为增加行数,如muru的答案所示。 或者,您可能应该尝试

 setterm -file log.txt -dump [ttynumbers] 

在这个ssh问题中提到过。

在一天结束时,bodhi.zazen在他们的评论中正确地指出,你拒绝使用screentmux是最大的问题。 我完全理解,我经常忘记自己跟踪长时间运行的程序,但是有了一些命令,你应该开始思考。

由于您已标记此gnome-terminal ,因此根据版本,可能会查看部分输出。 在这篇博文中,作者希望看到GNOME终端为“无限”回滚做了什么:

我可以看一下gnome-terminal打开了哪些文件,这样才能解决问题。 然后我发现它是偷偷摸摸的,它有一些名为/tmp/vteXYZ1tv的文件打开,但它已经删除了它们。 因此,您在浏览时无法看到它们,并且在程序关闭时它们将被删除。 […]他们可以恢复,我的方式(可能还有其他人),是做一个ls -l /proc//fd来看看他们指向的是什么。 然后你可以把它们用来制作一个新文件。 这些只是终端输出的逐字副本。 没有压缩。 没什么。

但在较新的版本中,文件应该是加密的。 从这个答案 :

vte-0.40(最有可能出现在Ubuntu 15.10 WW中)将压缩和加密这些文件。 这会将所需的存储空间缩小到其大小的大约四分之一(如果您的应用程序以纯文本forms生成X数据量,介于X / 4之间.X / 3是对所需存储空间的合理估计) ,如果有人获得硬盘驱动器的原始访问权限,也可以摆脱隐私/安全问题。

如果您只想要将来的输出,可以尝试使用reptyr将进程拖动到新的TTY 。

从注释中可以看出,有几种可能的解决方案,但是在图形终端中运行命令之前,它们都必须实现。

例如,请参阅https://bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1356433

因此,同一X会话中的用户无法重新连接到已关闭的选项卡。

您可以按照muru的建议尝试reptyr,这是一个很酷的解决方案,但最好从一开始就更好地规划您的ssh会话。

您需要制定更好的工作策略。

  1. 使用屏幕或tmux或类似的。 这些工具专为这种情况而设计。

我个人使用屏幕,因为我熟悉它,并且由于你说明我总是在ssh上使用屏幕会话的原因,即我开始屏幕并且真实地退出屏幕会话。 通常,我有一个以上的屏幕会话,例如,主机上的每个VM都有一个。

  1. 使用VNC服务器。 您可以通过ssh(VNC-over-SSH)运行会话或使用更快,更安全的FreeNX。 不要在没有SSH或FREENX的情况下在“互联网”上运行VNC服务器

VNC over ssh – https://www.cyberciti.biz/tips/tunneling-vnc-connections-over-ssh-howto.html

FreeNX – https://www.howtoforge.com/tutorial/freenx-ubuntu-14-04-trusty-tahr/

  1. 你可以使用Xpra

https://help.ubuntu.com/community/Xpra

http://xpra.org/

使用xpra,您可以启动然后重新连接图形终端,但在启动终端之前,您必须再次运行xpra。

根据终端内部运行的进程,您可能会成功窥视状态和该进程所执行的操作,而不是它在终端中显示的操作。

举几个例子,假设你已经以某种方式计算出给定过程的PID(进程ID)(例如使用pidofps ):

  • 如果给定工具逐个启动子命令,请使用ps检查正在运行的子命令。

  • 如果给定的工具有时会更改其工作目录,请检查/proc//cwd

  • 如果给定的工具连续操作许多文件,请检查在/proc//fd下打开哪一个文件。 如果你现在看不到任何东西,可能是你的流程刚关闭了一个并且即将打开下一个流程; 再次检查该目录的内容几次。

  • 如果命令使用标准read / write系统调用对单个巨大文件进行操作,则可以在/proc//fd下找到文件描述符编号,并在/proc//fd检查相应文件中的当前偏移量/proc//fdinfo 。 如果该命令使用pread / pwrite则查看下一个项目符号点。

  • 您可以使用strace连接到进程以查看它正在执行的操作: strace -p 。 不久之后使用Ctrl + C退出(它仅终止strace ,而不是您正在跟踪的应用程序)。 检查输出并查找可能给您一个想法的相关内容。 例如,使用-e trace选项将此输出仅限制为文件操作。 您将看到例如应用程序正在打开的文件名,以及pread / pwrite操作发生的偏移量。