标签: tty

写入STDOUT和打开到"/ dev/tty"的文件句柄有什么区别?

这两个例子之间有什么区别?

#!/usr/bin/perl
use warnings;
use 5.012;
my $str = "\x{263a}";


open my $tty, '>:encoding(utf8)', '/dev/tty' or die $!;
say $tty $str;
close $tty;

open $tty, '>:bytes', '/dev/tty' or die $!;
say $tty $str;
close $tty;

# -------------------------------------------------------

binmode STDOUT, ':encoding(utf8)' or die $!;
say $str;

binmode STDOUT, ':bytes' or die $!;
say $str;
Run Code Online (Sandbox Code Playgroud)

perl stdout filehandle tty

9
推荐指数
1
解决办法
3629
查看次数

如何检查Perl脚本是否在终端中运行?

我试图在Linux上的Perl脚本中确定它是否在终端中运行.

也就是说,我需要以下代码:

  • 只需在命令行上运行即可返回true
  • 运行时./myscript.pl | less甚至还会返回true./myscript.pl </dev/null >/dev/null 2>/dev/null
  • 在cron作业中运行时返回false,或作为CGI脚本返回false

特别是因为第二个子弹,我不能使用-t STDOUT和变化,IO :: Interactive也没用.

信息似乎确实可用.如果我运行ps,它显示的条目类似pts/2TTY专栏,甚至当我运行./myscript.pl </dev/null >/dev/null 2>/dev/null,并?作为cron作业或CGI脚本运行的时候.

有没有一种优雅的方法来在Perl脚本中确定这个?我宁愿不必解析输出ps.

linux perl tty

9
推荐指数
2
解决办法
9699
查看次数

/dev/tty.Serial*在MacOS 10.9(小牛队)中失踪

我不确定这是否是最近更新到OSX 10.9的结果,但由于某种原因,现在所有的/dev/tty.Serial*和/dev/cu.Serial*目标都丢失了,与之进行串行通信无法以编程方式连接USB设备.

我可以在"系统信息"屏幕中看到USB设备连接,并且设备将与VMWare Fusion VM中运行的已安装Windows实例正确连接,但是对于我来说,OSX不会给我一个I/O. USB设备的/ dev目标.苹果移动旧的/dev/tty.Serial*设备现在挂钩到系统中,或者实际上这只是破坏了.我已经死在水中,直到我能想到这一点.

macos usb serial-port tty osx-mavericks

9
推荐指数
1
解决办法
1万
查看次数

sudoers NOPASSWD:sudo:没有tty存在且没有指定askpass程序

我添加了这样的用户:

$ adduser --system --home /no/home --no-create-home --group --disabled-password --disabled-login testuser
Run Code Online (Sandbox Code Playgroud)

将用户添加到组:

$ adduser testuser testgroup
Run Code Online (Sandbox Code Playgroud)

为sudoers添加了行(visudo):

testuser    ALL=(ALL) NOPASSWD: ALL
%testgroup         ALL=(ALL:ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下内容运行bash脚本时:

#!/bin/sh
sudo -u testuser /usr/bin/php /usr/local/bin/script.php
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个脚本时,我在日志中收到错误:

sudo: no tty present and no askpass program specified
Run Code Online (Sandbox Code Playgroud)

编辑:requiretty不在sudoers文件中.

linux bash sudo tty

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

如何通过SSH通过Go发送终端转义序列?

我正在编写一个Go程序,它将使用本机x/crypto/ssh库通过SSH连接到主机并删除一个交互式shell.

我正在使用RequestPty(),但远程端的(bash)shell与控制代码的行为不符合预期.

当我输入各种控制字符时,它们会被我的终端回复:

$ ^[[A
Run Code Online (Sandbox Code Playgroud)

角色仍然有效,如果按下向上箭头后按Enter键,则运行上一个命令 - 但控制字符输出会破坏应该在那里显示的内容.标签也是如此.

是否有一些直接的方法让这个工作?当我在过去实现类似的系统时,它不是一个问题,因为我刚刚讨论过openssh,并且进程组的语义将它排除在外.

我研究过" The TTY Demystified ",并且它还不清楚从哪里开始.

我想过要研究的几件事:

openssh 本身必须正确地完成这项工作,但它是一个真正最好的代码库来研究.

实际上我不清楚这个打印是由我的本地终端仿真器或shell还是由远程主机上的代码完成的.

我该从哪里开始?


以下是我的代码示例:

conf := ssh.ClientConfig{
    User: myuser,
    Auth: []ssh.AuthMethod{ssh.Password(my_password)}
}
conn, err := ssh.Dial("tcp", myhost, conf)
if err != nil {
    return err
}
defer conn.Close()
session, err := conn.NewSession()
if err != nil {
    return err
}
defer session.Close()
session.Stdout = os.Stdout
session.Stderr = os.Stderr
session.Stdin = os.Stdin …
Run Code Online (Sandbox Code Playgroud)

ssh bash go tty

9
推荐指数
2
解决办法
1647
查看次数

什么机制允许ViM临时覆盖整个控制台?

当你输入vim时,它会"清除"屏幕.退出时,它"恢复"原始内容.

我理解可以\x1b[2J用来清除控制台并重置光标位置,但这会覆盖终端内容.

我假设Vim 在引擎盖下使用ncurses,在这种情况下我想更好的问题是ncurses如何做到这一点,但它是如何完成的?

vim ncurses tty

9
推荐指数
2
解决办法
504
查看次数

PTY/TTY - 只有Slave FD你不能做什么

题:

如果我有一个pty或tty主/从对,如果我只有从节点的文件描述符,我怎么办?或者,换一种说法:我能如果我有主节点的文件描述符呢?

我目前的理解:

[编辑]

我理解终端/控制台/ SSH的"典型"关系,其具有用于与人交互的主端,以及在从端上的一个或多个程序(例如,shell及其子进程).我(松散地)找到更不寻常的(/过时的)用例,例如将TTY用于其他类型的数据链接,如PPP.这个问题不是 "我没有得到这个TTY业务"的问题.我问的是("低级"?)"API"的东西:例如,如果你没有访问主FD的话,是否有任何termios/ioctl操作或对tty对的其他编程修改无法实现?

[/编辑]

我想明显的是:

  • 如果我有主端FD,我只能从主端读/写.
  • grantpt/unlockpt/ptsname只能在主端FD上使用.

还要别的吗?

我一直在阅读一些手册页并在我的Linux机器上进行试验:人们想要用pty做的基本内容(例如stty columns 78,等等)似乎在"两端"上工作.但我怀疑只有一个进程持有主端的文件描述符才能做到(特别是因为主从名称二分法暗示了一些单边控制/统治).当然,由于我只是在Linux上进行测试,因此Linux和Unix之间的各种版本/配置之间可能存在行为差异,因此我不想假设我所看到的是可移植的.

动机

(如果有人想知道我为什么想知道)

  1. 一般知识/好奇心.
  2. 我不喜欢目前用于处理ptys的命令行工具.没有进入细节,我已经看了reptyr,ptyget,expect/ empty,screen/ tmux(/ neercs?在一个与reptyr样功能),dtach/ abduco,和他们没有打我的简约多功能性的甜点.我正在努力变得更加明智,以便我可以更好地评估现有的解决方案和/或更好地设计我自己的工具来划伤我的特殊痒.

unix linux tty pty termios

9
推荐指数
1
解决办法
520
查看次数

是否可以检测 writer 是否为 tty?

Bash 有一个“神奇的行为”,如果你输入“ls”,通常你会得到彩色的输出,但是如果你将输出重定向到一个文件,颜色代码就会消失。如何使用Go实现这种效果。例如使用以下语句:

fmt.Println("\033[1;34mHello World!\033[0m")
Run Code Online (Sandbox Code Playgroud)

我可以看到彩色文本,但如果我将输出通过管道传输到文件,颜色将被保留,这不是我想要的。

顺便说一句,这个问题大多与Go无关,我只是想在我的Go程序中达到效果。

console colors go tty

9
推荐指数
2
解决办法
3171
查看次数

"docker exec"命令的"-i"和"-t"选项的用途是什么?

说实话,我一直困惑docker exec -it …,docker exec -i …docker exec -t …,所以我决定做一个测试:

  1. docker exec -it …:

    # docker exec -it 115c89122e72 bash
    root@115c89122e72:/# ls
    bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    
    Run Code Online (Sandbox Code Playgroud)

    它正常工作.

  2. docker exec -i …:

    # docker exec -i 115c89122e72 bash
    ^C
    
    Run Code Online (Sandbox Code Playgroud)

    命令挂起,我必须使用Ctl+ c来中断它.

  3. docker exec -t …:

    # docker exec -t 115c89122e72 bash
    root@115c89122e72:/# ls
    ^C …
    Run Code Online (Sandbox Code Playgroud)

linux tty docker

8
推荐指数
1
解决办法
3262
查看次数

如何查找未应用 udev 规则的原因?

我添加了一个 udev 规则来生成到特殊 tty 设备的单独链接。我从 lsusb 获取了供应商和产品 ID:

Bus 001 Device 016: ID abcd:1234 Foo Device
Run Code Online (Sandbox Code Playgroud)

dmesg设备的输出是:

[  369.384850] usb 1-1.1: new full-speed USB device number 4 using xhci_hcd
[  369.470492] usb 1-1.1: New USB device found, idVendor=09d8, idProduct=0420
[  369.470506] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[  369.470515] usb 1-1.1: Product: TWN4/B1.06/CCL3.12/PRS1.04
[  369.470522] usb 1-1.1: Manufacturer: OEM
[  369.475188] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
Run Code Online (Sandbox Code Playgroud)

通常 Debian 系统会为此设备生成一个 ACM* tty:

$ ls /dev/ttyACM* …
Run Code Online (Sandbox Code Playgroud)

linux usb udev tty linux-kernel

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

标签 统计

tty ×10

linux ×5

bash ×2

go ×2

perl ×2

usb ×2

colors ×1

console ×1

docker ×1

filehandle ×1

linux-kernel ×1

macos ×1

ncurses ×1

osx-mavericks ×1

pty ×1

serial-port ×1

ssh ×1

stdout ×1

sudo ×1

termios ×1

udev ×1

unix ×1

vim ×1