Articles of tty

捕获直接redirect到/ dev / tty

我正在为一个将文本直接分发到/ dev / tty的程序的应用程序控制器工作。 这是一个生产应用程序控制器,必须能够捕捉到terminal的所有文本。 一般来说,这不是一个问题。 我们只是redirectstdout和stderr。 这个特定的应用程序直接调用echo并将结果redirect到/ dev / tty( echo "some text" > /dev/tty )。 通过我的应用程序控制器redirect没有抓住文本。 我确实有这个应用程序的来源,但是我不能修改它,也不能再维护它。 有关如何捕捉和/或丢弃输出的想法?

正确的初始化序列为Linux串行端口

我写了一个必须在Linux上使用串口的应用程序,尤其是ttyUSB。 读和写操作是用标准的select()/ read()循环和write()来完成的,它们可能没有错,但是初始化代码(或者某些部分的缺失)会损害tty子系统中的某些东西。 这里是: vuxboot(string filename, unsigned baud = B115200) : _debug(false) { _fd = open(filename.c_str(), O_RDWR | O_NOCTTY); if(_fd < 0) throw new io_error("cannot open port"); // Serial initialization was written with FTDI USB-to-serial converters // in mind. Anyway, who wants to use non-8n1 protocol? tcgetattr(_fd, &_termios); termios tio = {0}; tio.c_iflag = IGNPAR; […]

sudoers NOPASSWD:sudo:没有tty礼物,也没有askpass计划

我已经添加了这样的用户: $ adduser –system –home /no/home –no-create-home –group –disabled-password –disabled-login testuser 将用户添加到组中: $ adduser testuser testgroup 添加到sudoers(visudo)的行数: testuser ALL=(ALL) NOPASSWD: ALL %testgroup ALL=(ALL:ALL) NOPASSWD: ALL 当我尝试运行带有以下内容的bash脚本时: #!/bin/sh sudo -u testuser /usr/bin/php /usr/local/bin/script.php 但是当我运行这个脚本时,我得到了日志中的错误: sudo: no tty present and no askpass program specified 编辑: requiretty不在sudoers文件中。

linux – 从一个terminal写入命令到另一个terminal

我需要从一个terminal写命令到另一个terminal。 我试过这些: echo -e "ls\n" > /proc/pid/fd/0 echo -e "ls\n" > /dev/pts/4 这只是打印ls作为输出,不执行。 我试过这些: chmod 777 /dev/tty4 ;echo "ls" > /dev/tty4 chmod 777 /dev/tty40 ;echo "ls" > /dev/tty40 哪些似乎没有做任何事情 有任何想法吗? [注意,我不想触摸第二个terminal来完成这个任务。 只有第一个]

如何在启动过程后切换linux内核控制台?

在我的embedded式系统上,我通常使用/ dev / ttyS0作为主控制台。 这是通过传递内核参数console=/dev/ttyS0 ,当init接受它的一部分时, getty将在例如inittab指定的同一个设备上被触发。 ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 。 有没有可能改变这些设置而不重新启动,并切换到另一个terminal如ttyS1 , ttyUSBx甚至一些伪tty?

你可以欺骗isatty并单独loginstdout和stderr吗?

问题 所以你要logging一个进程或subprocess的stdout和stderr(单独的),如果你没有logging任何东西,输出和你在terminal中看到的不一样。 似乎很简单没有? 不幸的是,似乎不可能为这个问题写出一个通用的解决scheme,这对任何给定的过程都有效。 背景 pipe道redirect是分离标准输出和标准错误的一种方法,允许您单独logging它们。 不幸的是,如果将stdout / err更改为pipe道,则进程可能会检测到pipe道不是tty(因为它没有宽度/高度,波特率等),并可能相应地改变其行为。 为什么改变行为? 那么,有些开发人员利用terminal的function,如果你正在写出一个文件,这是没有意义的。 例如,加载栏通常需要将terminal光标移回到行的开始位置,并使用新长度的栏来覆盖以前的加载栏。 颜色和字体重量也可以显示在terminal中,但是在平面ASCII文件中不能。 如果要将这样一个程序的标准输出直接写入文件,则该输出将包含所有terminal的ANSI转义码,而不是格式正确的输出。 因此,开发人员在向stdout / err写入任何内容之前都会执行某种“isatty”检查,因此如果该检查返回false,则可以为文件提供更简单的输出。 这里通常的解决scheme是欺骗这样的程序,通过使用一个pty(一个双向pipe道,也有宽度,高度等等)来认为pipe道实际上是tty。你将进程的所有input/输出redirect到这个pty,处理成思考它与真实的terminal交谈(你可以直接把它logging到文件中)。 唯一的问题是,通过使用stdout和stderr的单个pty,我们现在不能再区分这两者了。 所以你可能想为每个pipe道尝试一个不同的pty,一个是stdin,一个是stdout,另一个是stderr。 虽然这将在50%的时间内运行,但许多进程不幸的是会执行额外的redirect检查,以确保stdout和stderr(/ dev / tty000x)的输出path是相同的。 如果它们不是,那么必须有redirect,因此它们会给你一样的行为,就好像你已经用stdout和stdout没有pty一样。 你可能会认为这种redirect检查是不常见的,但不幸的是,这实际上是非常普遍的,因为很多程序都重复使用其他代码来检查,就像在OSX中find这样的代码: http://src.gnu-darwin.org/src/bin/stty/util.c 挑战 我认为寻找解决scheme的最佳方式是以挑战的forms。 如果任何人都可以运行下面的脚本(理想情况下通过Python,但在这一点上我会采取任何东西),stdout和stderr分别logging,你设法愚弄它认为它是通过一个tty,你解决了这个问题:) #!/usr/bin/python import os import sys if sys.stdout.isatty() and sys.stderr.isatty() and os.ttyname(sys.stdout.fileno()) == os.ttyname(sys.stderr.fileno()): sys.stdout.write("This is a") sys.stderr.write("real tty :)") else: sys.stdout.write("You cant fool me!") sys.stdout.flush() […]

如何在需要tty的Docker构build期间运行命令?

我有一些脚本我需要在Docker构build期间运行,这需要一个tty(Docker在构build期间不提供)。 脚本使用read命令。 用一个tty,我可以做一些事情(echo yes; echo no) | myscript.sh (echo yes; echo no) | myscript.sh 。 没有它我得到奇怪的错误,我不完全明白。 那么有没有什么办法可以在构build过程中使用这个脚本(假设它不是我的修改?) 编辑:这是一个更确定的错误的例子: FROM ubuntu:14.04 RUN echo yes | read 失败与: Step 0 : FROM ubuntu:14.04 —> 826544226fdc Step 1 : RUN echo yes | read —> Running in 4d49fd03b38b /bin/sh: 1: read: arg count The command '/bin/sh -c echo […]

设置stty参数

我试图使用bash从ttyS0读取,需要设置以下,但即时通讯努力想出来 databits = 7 stopbits = 2 parity = 0 flow control = 0 inheritance人我的代码: #!/bin/bash # Port setting stty -F /dev/ttyS0 raw speed 1200 # Loop while [ 1 ]; do echo 'LOADING…' READ=`dd if=/dev/ttyS0 count=1` echo $READ echo '[PRESS Ctrl + C TO EXIT]' done 该脚本正在工作,但我需要设置参数。 有什么build议么? 谢谢:)

如何在gnu屏幕中切换CR / LF?

我正在使用屏幕从串行控制台读取文本。 问题是输出似乎只有换行\ n但不回车\ r,所以显示看起来像这样… Line1 Line2 Line3 我想知道是否有补丁来解决这个问题?

如何判断是否在Linux控制台运行与ssh会话?

我有一个应用程序,如果直接从Linux控制台运行,需要有不同的行为。 因此,如果用户连接到SSH来运行FooBar,或者用户走到控制台并直接login来运行FooBar,我希望它做一些不同的事情。 我需要调用哪些C API来区分这两种情况? 我想我必须看看“tty / pts”信息(比如我运行“ps axf”时看到的信息),但我不确定这是否是最好的解决scheme,也不知道要调用哪个API获取这些信息。 暗示赞赏。 🙂