这两个例子之间有什么区别?
#!/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) 我试图在Linux上的Perl脚本中确定它是否在终端中运行.
也就是说,我需要以下代码:
./myscript.pl | less甚至还会返回true./myscript.pl </dev/null >/dev/null 2>/dev/null特别是因为第二个子弹,我不能使用-t STDOUT和变化,IO :: Interactive也没用.
信息似乎确实可用.如果我运行ps,它显示的条目类似pts/2的TTY专栏,甚至当我运行./myscript.pl </dev/null >/dev/null 2>/dev/null,并?作为cron作业或CGI脚本运行的时候.
有没有一种优雅的方法来在Perl脚本中确定这个?我宁愿不必解析输出ps.
我不确定这是否是最近更新到OSX 10.9的结果,但由于某种原因,现在所有的/dev/tty.Serial*和/dev/cu.Serial*目标都丢失了,与之进行串行通信无法以编程方式连接USB设备.
我可以在"系统信息"屏幕中看到USB设备连接,并且设备将与VMWare Fusion VM中运行的已安装Windows实例正确连接,但是对于我来说,OSX不会给我一个I/O. USB设备的/ dev目标.苹果移动旧的/dev/tty.Serial*设备现在挂钩到系统中,或者实际上这只是破坏了.我已经死在水中,直到我能想到这一点.
我添加了这样的用户:
$ 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文件中.
我正在编写一个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) 如果我有一个pty或tty主/从对,如果我只有从节点的文件描述符,我怎么办?或者,换一种说法:我能只如果我有主节点的文件描述符呢?
[编辑]
我理解终端/控制台/ SSH的"典型"关系,其具有用于与人交互的主端,以及在从端上的一个或多个程序(例如,shell及其子进程).我(松散地)找到更不寻常的(/过时的)用例,例如将TTY用于其他类型的数据链接,如PPP.这个问题不是 "我没有得到这个TTY业务"的问题.我问的是("低级"?)"API"的东西:例如,如果你没有访问主FD的话,是否有任何termios/ioctl操作或对tty对的其他编程修改无法实现?
[/编辑]
我想明显的是:
还要别的吗?
我一直在阅读一些手册页并在我的Linux机器上进行试验:人们想要用pty做的基本内容(例如stty columns 78,等等)似乎在"两端"上工作.但我怀疑只有一个进程持有主端的文件描述符才能做到(特别是因为主从名称二分法暗示了一些单边控制/统治).当然,由于我只是在Linux上进行测试,因此Linux和Unix之间的各种版本/配置之间可能存在行为差异,因此我不想假设我所看到的是可移植的.
(如果有人想知道我为什么想知道)
reptyr,ptyget,expect/ empty,screen/ tmux(/ neercs?在一个与reptyr样功能),dtach/ abduco,和他们没有打我的简约多功能性的甜点.我正在努力变得更加明智,以便我可以更好地评估现有的解决方案和/或更好地设计我自己的工具来划伤我的特殊痒.Bash 有一个“神奇的行为”,如果你输入“ls”,通常你会得到彩色的输出,但是如果你将输出重定向到一个文件,颜色代码就会消失。如何使用Go实现这种效果。例如使用以下语句:
fmt.Println("\033[1;34mHello World!\033[0m")
Run Code Online (Sandbox Code Playgroud)
我可以看到彩色文本,但如果我将输出通过管道传输到文件,颜色将被保留,这不是我想要的。
顺便说一句,这个问题大多与Go无关,我只是想在我的Go程序中达到效果。
说实话,我一直困惑docker exec -it …,docker exec -i …和docker exec -t …,所以我决定做一个测试:
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)
它正常工作.
docker exec -i …:
# docker exec -i 115c89122e72 bash
^C
Run Code Online (Sandbox Code Playgroud)
命令挂起,我必须使用Ctl+ c来中断它.
docker exec -t …:
# docker exec -t 115c89122e72 bash
root@115c89122e72:/# ls
^C …Run Code Online (Sandbox Code Playgroud)我添加了一个 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)