如何在不同终端显示命令?

如何在不同终端显示命令?

我有一个带有屏幕的树莓派。它启动时出现登录提示。我没有连接键盘和鼠标,并且希望保持这种状态。我继续通过 ssh 从网络登录它,但希望查看通过 ssh 输入的命令及其在附加屏幕上的输出。这可能吗?

答案1

我不确定是否存在更“直接”的解决方案,仅涉及重定向输入和输出,但我确实设法使用屏幕。这个想法是,在一个会话中完成所有工作screen,并将两次附加到该会话,一次来自您的工作 SSH 终端,一次来自附加的显示。

首先,您需要知道所连接显示器的终端名称。我没有要测试的 rPI,但我假设直接连接的屏幕已映射到常规 Linux 视频控制台,因此它可能会是/dev/tty1.

  1. 确保screen已安装
  2. 使用 SSH 登录
  3. 创建新的屏幕会话

    screen
    
  4. 从另一个终端附加到同一屏幕会话。

    使用此功能的方式是,您将使用本地键盘登录并键入screen -r -x(用于-r恢复会话和-x多重附加到现有会话),但在这种情况下,您实际上并未登录到从中进行操作的终端。您想要附加到该会话。因此,我们将输入和输出重定向到预期的终端,以“说服”屏幕这是我们想要附加的终端。这很黑客,但对我有用。

    screen -r -x </dev/tty1 >/dev/tty1 2>&1 & disown
    

如果 rPI 视频控制台的终端名称不是/dev/tty1其他名称,您可以通过连接一次键盘并在本地登录并tty在提示符下键入来找出它是什么。

答案2

有趣的是,我也想到screen -xtmux attach喜欢 Celada 的解决方案,但我更喜欢设置 init ( in/etc/inittab/etc/init/etc/systemd) 或导师在启动时自动启动 getty-on-screen 会话。

主管的工作配置:

[program:screen]
command=bash -c 'chvt 9 && TERM=linux exec screen getty tty </dev/tty9 >/dev/tty9 2>&1'
autostart=true
autorestart=true

它会自动切换到/dev/tty9并启动运行 getty 的屏幕以显示登录提示。在其他 ssh 会话中,您可以运行sudo screen -x以附加到此控制台会话,然后键入Ctrl+AD以从会话中分离。

您需要 root 权限才能附加屏幕会话,因为它是由 root 运行的。您可能想要启用屏幕的多用户模式,但它需要 setuid,/usr/bin/screen这会导致一些安全问题。咨询屏幕手册了解详情。

答案3

如果您已xterm安装,pi它应该包含luit终端 UTF-8 应用程序 - 这是一个小程序,通常用于翻译不支持 UTF-8 的其他类型的终端应用程序。luit通过分配伪终端来工作 - 方式很相似,screen但开销要少得多。

luit可以很容易做的一件事就是复制输入(或输出 - 可能不同)到达某个指定的文件时。尽管luit(作为终端掌握 输入表示所有终端会话的输出(甚至可能包括它自己的stty echo输出)输出意味着在处理完终端会话的所有输出后它将写入终端设备的所有内容。它在复制的同时也执行此操作它是标准输入(它必须来自终端 - 所以意味着你的键盘)输入到它所包装的程序 - 例如 shell。我知道 - pty i/o 可能有点奇怪 - 但重点是,它可以提供一种方便的方法,将终端会话的输出实时复制到多个显示设备。

例如:

ssh me@machine -t 'luit -olog /dev/tty2 sh'

我刚刚跑过(基本上)X切换到 vt2后,从我的 Android 平板电脑终端执行上述命令CTRL+ALT+F2在我的台式计算机上出现新login提示。 Android 终端以通常的方式提示我输入密码,然后我就进入了平板电脑上的 shell写入我平板电脑终端的所有内容(提示、我的输入cat file等)也显示在我的桌面屏幕上。我输入的每个键(或触摸或其他什么)平板电脑上的内容立即回显到桌面 vt2。

为了这个工作,如果你的tty产卵过程(通常是agetty或类似)创建具有您的用户帐户默认情况下无法满足的某种权限级别的终端设备,您将需要更改它。它可以很简单:

chown me /dev/tty[num]

……如果你愿意的话。在我的系统上,我的用户帐户是该组的成员tty- 所以这不是问题。我相信在大多数 Linux 发行版上,将用户帐户放入tty组中应该足以使其正常工作。

ls -l /dev/tty2
crw--w---- 1 root tty 4, 2 Jun 14 05:14 /dev/tty2 

...如您所见,它是 root 拥有的设备文件,但指定给组 tty

无论如何,运行上述luit命令可能就是您所需要的。更复杂 - 并且可能是理想的 - 解决方案可能有screentmux等,但如果你想做的只是如果其他设备上有输出,那么通常您所要做的就是写入它。

相关内容