标签: tty

在ssh会话中启用tty

我会接受一些写入的脚本的登录信息,以供许多用户使用.在python中,我将input_raw设置为从dev/tty读取,但是当我连接到通过ssh在服务器上运行的脚本时,它会失败.

思考?解决方法?

我宁愿避免将用户名硬编码到脚本中.

谢谢,麻烦您了.

python ssh scripting tty

4
推荐指数
1
解决办法
4466
查看次数

判断是否重定向了Perl脚本的STDOUT

所以我写了一个简单的html 1.0服务器,我在服务器上有一些perl脚本.特别是,我有一个名为直方图的脚本,这是一个带有表单操作的html表单,与另一个cgi文件相同.这是代码:

print "<form action=\"tallyandprint.cgi\" method=\"GET\">";
Run Code Online (Sandbox Code Playgroud)

现在,当我调用tallyandprint.cgi时,它会绘制一个带有gnuplot的图形并将其发送到用户的浏览器(STDOUT在html服务器代码中被重定向,因此perl会对其进行处理).现在,我也希望能够从bash运行tallyandprint.cgi,但采用不同风格的参数.现在,我使用perl解析通过解析url来抓取模式,并在+符号之间分隔内容(例如:?pattern = 1 + 2 + 3 + 4就是url).

这很好,花花公子,但我不希望我的论点用bash写成1 + 2 + 3 + 4,而是分开不同.我尝试使用perl的isatty()版本,但由于输入总是来自终端(因为服务器执行它),我无法区分输入是来自bash还是来自web浏览器.

我的下一步是找出STDOUT是否被重定向.因为如果web服务器运行cgi,STDOUT将被重定向到用户连接的套接字.如果在bash中运行,STDOUT应该是正常的tty.我怎样才能在perl中检查这个?

perl stdout tty io-redirection

4
推荐指数
1
解决办法
1951
查看次数

在发送信号的终端中显示消息

我作为守护进程运行的进程.我想使用信号重新加载配置.问题是,如果配置错误,它应该以tty形式发出错误信息.

  1. 有没有办法做到这一点?
  2. 是推荐的方式吗?

如果不推荐的话.什么是更合适的方法来检查它是否成功?

c++ linux tty

4
推荐指数
1
解决办法
209
查看次数

屏幕"必须连接到终端."

我正在使用Debian操作系统.

我正在尝试在SSH会话下使用屏幕.但是当我试图运行命令时

screen
Run Code Online (Sandbox Code Playgroud)

shell回答我:

Must be connected to a Terminal.
Run Code Online (Sandbox Code Playgroud)

如果我进入

tty
Run Code Online (Sandbox Code Playgroud)

它回答我:

Not a tty
Run Code Online (Sandbox Code Playgroud)

我不知道为什么,我试试

ssh -t login@server
Run Code Online (Sandbox Code Playgroud)

它不起作用..

请帮帮我,我真的需要这个!

谢谢

编辑:

我读了这个主题,但它仍然无效

ssh gnu-screen tty

4
推荐指数
2
解决办法
2万
查看次数

将FD转换为Handle

我想打开一个伪tty,并使用生成的从属终端连接到子进程上的stdin / stdout。openPseudoTerminal给我一个IO (System.Posix.Types.Fd, System.Posix.Types.Fd),我试图将其转化为一对句柄(特定fdToHandleGHC.IO.Handle.FdGHC,但我找不到其他这样的函数)。但是,我得到以下信息:

liftA (fdToHandle *** fdToHandle) openPseudoTerminal
Couldn't match type `System.Posix.Types.Fd'
               with `System.Posix.Internals.FD'
Run Code Online (Sandbox Code Playgroud)

有什么想法可以在这两个(大概相似)的事物之间转换吗?

对于奖励积分,这将给我IO (IO Handle, IO Handle)-是否有一种巧妙的方法可以将其转换为IO (Handle, Handle)

linux haskell tty

4
推荐指数
1
解决办法
185
查看次数

编写 Linux 终端模拟器

我想编写一个 x11 终端模拟器,但我不知道我应该如何生成并与 shell 通信,是否有任何基本的(伪或 C)代码?比如要创建什么样的 PTY,如何将 shell 绑定到它,我必须捕捉或发送什么信号,等等。并不是真的想对整个 xterm 源进行排序。

编辑:哦,我想实现一种与其中的任何应用程序进行通信的方式,我该如何进行功能发现?“客户端”中有一些隐藏的ansi序列,希望它不会与其他终端模拟器冲突?一些环境变量,希望它不会与“客户端”发生冲突或被 shell 删除?

linux tty pty terminal-emulator

4
推荐指数
2
解决办法
7952
查看次数

如何在使用boost :: asio发送数据时丢弃数据?

我正在编写一些使用boost::asio类读取和写入串行设备的代码.但是,当在程序之间发送多个字符串时,我注意到在接收程序中,数据在写入串口时按顺序读取,而不是从其他程序发送数据 - 如果我开始读取数秒之后的数据,我不会得到我现在发送的值,而是之前发送的值.我假设这是由我如何设置我的boost::asio::serial_port:

int main(int argc, char const *argv[]){

    int baud=atoi(argv[1]);
    std::string pty=argv[2];

    printf("Virtual device: %s\n",pty.data());
    printf("Baud rate: %d\n",baud);

    boost::asio::io_service io;
    boost::asio::serial_port port(io, pty);
    port.set_option(boost::asio::serial_port_base::baud_rate(baud));

    // counter that writes to serial port in 1s intervals
    int val=0;
    while (1){
        std::string data=std::to_string(val);
        data+='\n';
        std::cout << data;
        write(port,boost::asio::buffer(data.c_str(),data.size()));
        sleep(1); 
        val++;
        data.clear();
    }

    port.close(); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有一种方法可以在将新值发送到串行端口时强制将过去的数据丢弃(我假设应该在代码的write()部分完成)?

c++ boost serial-port tty boost-asio

4
推荐指数
1
解决办法
4336
查看次数

如何在ssh会话中劫持tty1的输入流?

我有一个通过 hdmi 连接到我的电视的 pi。它设置为在启动时自动登录到控制台(不是 x-windows)。为了在我的电视上控制屏幕的输出,我必须使用连接到我的 pi 的键盘。

我希望能够通过 ssh 登录到 pi,然后劫持 tty1 stdin 流,但仍然允许 stdout 作为 hdmi 接口。我怎样才能做到这一点?

我查看了“屏幕”,但看起来它同时接管了标准输入和标准输出,而无法仅选择标准输入。

root@nana ~ # uname -a
Linux nana 3.4.104+ #1 SMP PREEMPT Thu Jan 8 15:40:40 CET 2015 armv7l GNU/Linux
Run Code Online (Sandbox Code Playgroud)

linux ssh tty

4
推荐指数
1
解决办法
3567
查看次数

什么是tty子系统?

到现在为止,我已经花了至少10个小时试图了解Linus Akesson着名的博客文章,我仍然在苦苦挣扎.所以让我怀疑我对tty/ptty的怀疑是一系列简短的问题.

1)用户空间或内核空间中的tty/ptty是什么?

2)什么是tty/ptty与设备或驱动程序或某些编号或东西的连接?

3)tty似乎与某个过程的控制终端有关,什么是关系,是与终端相关的每个过程?

4)总的来说,我仍然不明白这个终端概念适合的位置.一个进程想要从stdio中读取一些内容,但它只是从所需的设备文件中读取它.tty打算如何解决这个问题究竟是什么?

5)我在某处读到有人试图将tty从用户空间移动到内核空间.这是一个历史性的残留物,而不是一个强大的设计特征.

linux operating-system tty linux-kernel

4
推荐指数
1
解决办法
863
查看次数

`SIGWINCH` 如何通过 Bash?

如果我击运行一个程序,用于监听SIGWINCH,和我调整的是击在运行终端,然后程序会收到SIGWINCH。我想知道这个信号是如何传递给在 Bash 下运行的程序的。

这是我对发生的事情的理解,使用catch_sig我在本文末尾列出的示例程序:

  • 终端模拟器将在 PTY 的接收端后面运行 Bash。因此,Bash 的“STDIN”和“STDOUT”将是 TTY。
  • Bashcatch_sig通过分叉作为子进程运行。该catch_sig进程继承了 Bash 的 I/O FD,也就是上面提到的 TTY。
  • 当终端仿真器的大小发生变化时,它应该调用ioctl(pty_fd, TIOCSWINSZ, &size)pty_fd上面的 PTY 的发送端在哪里。此调用ioctl将更新接收 TTY 的大小,并将尝试发送SIGWINCHTTY 的进程组。
  • Bash 和catch_sig是上述进程组的一部分,因此分别SIGWINCH发送给他们两个。

然而,我在上面遇到的一个困难是,如果我尝试SIGWINCH手动发送到 Bash 的进程组,killcatch_sig不会收到信号。例如,如果 Bash 的 PID(和进程组)是123并且我catch_sig在其中运行,然后我kill -WINCH -123在单独的窗格中运行,则catch_sig不会收到信号。为什么会这样?

下面是一个演示catch_sig程序的源代码,如上所述:

#include <signal.h>
#include <stdio.h>
#include <unistd.h>

static …
Run Code Online (Sandbox Code Playgroud)

linux bash signals tty pty

4
推荐指数
1
解决办法
876
查看次数