在我的 Linux 机器上,使用时,screen
我可以用 打开、读取和写入伪终端。关闭它(Ca ky)后,如果不重新启动提供伪终端的,screen
我将无法再次连接到它。socat
刚开始之后socat
事情是这样的:
/home/kidmose $ fuser /dev/pts/9
/dev/pts/9: 20960
/home/kidmose $ lsof /dev/pts/9
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
socat 20960 kidmose 5u CHR 136,9 0t0 12 /dev/pts/9
我可以按预期进行书写和阅读:
/home/kidmose $ echo "uname -a" > /dev/pts/9 && cat /dev/pts/9
uname -a
Linux egki-laptop-linuxmint 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
启动screen
也有效一次(我可以写入和读取预期的输出):
/home/kidmose $ screen /dev/pts/9
uname -a # My input
Linux egki-laptop-linuxmint 3.13.0-24-generic #47-Ubuntu SMP Fri May 2 23:30:00 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux # Response
(C-a k y) # I kill the window and screen terminates ([screen is terminating])
现在我既无法连接screen
也无法书写。Screen 立即退出[screen is terminating]
,当我尝试书写时出现以下错误:
/home/kidmose $ echo "uname -a" > /dev/pts/9 && cat /dev/pts/9
bash: /dev/pts/9: Device or resource busy
一些信息:
/home/kidmose $ fuser /dev/pts/9
/dev/pts/9: 20960
/home/kidmose $ lsof /dev/pts/9
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
socat 20960 kidmose 5u CHR 136,9te 0t0 12 /dev/pts/9
/home/kidmose $
知道为什么它‘忙碌’/不可用吗?
我注意到输出te
中出现了“ ” lsof
。有什么解释吗?
我的最终目标是在远程设备上拥有虚拟终端。由于 NAT 等原因,我需要远程设备调用虚拟终端所在的服务器。
编辑:正如 lemonsqueeze 在他的评论:
[A: sh -> socat] --> [B: socat -> pty -> screen]
Machine A TCP Machine B
答案1
建议:在这种情况下,我会选择反向 SSH联系:
不是您的机器执行 ssh,而是服务器机器执行 ssh,并通过端口转发确保您可以 ssh 返回服务器机器。
但这肯定不如自己用 socat 构建那么有趣。我还是建议彻底弄清楚这个 pty 问题,这是一种很好的学习方式。