我尝试了下面的命令,我从书中读到的
sudo ls | tee /dev/tty3a
该命令给了我权限被拒绝,即使使用sudo
.
这里 tty 是电传打字机,我已经知道了。但是 3a 和 tty 是什么意思呢?
答案1
/dev
不同 Unix 变体中的设备文件名称有所不同。有一些你随处可见,例如/dev/tty
当前终端。这似乎/dev/tty3a
是某些 Unix 变体(包括 Solaris 和 SCO OpenServer)上第四个串行端口的名称。 Linux 的等价物是/dev/ttyS3
.因此ls|tee /dev/tty3a
将输出复制ls
到第四个串行端口。
如果没有设备插入串行端口,您将收到错误(“输入/输出错误”)。如果没有串行端口的驱动程序,您将收到不同的错误(“没有此类设备”)。如果设备节点根本不存在,您当然会得到“没有这样的文件或目录”。
如果设备节点存在但您无权访问它,您将收到错误“访问被拒绝”。除非您以 root 身份运行,或者有一个硬件终端插入该串行端口并且您已登录该终端,否则您可能无权访问该设备。
假设设备存在,如果您想以 root 身份访问它,则需要tee
以 root 身份运行命令,例如:
ls | sudo tee /dev/tty3a
请注意,这sudo ls | tee /dev/tty3a
不起作用,因为它只能ls
以 root 身份运行,该命令不是原始用户tee
的参数并以原始用户身份运行。sudo
在此命令中,管道由原始 shell 创建,并且调用sudo
构成了管道的左侧。如果您想以 root 身份运行ls
和tee
,则需要编写sudo ls | sudo tee /dev/tty3a
(管道创建仍在原始 shell 中)。如果您想以 root 身份运行这两个命令并以 root 身份执行管道设置,则需要以 root 身份调用 shell 来设置管道:sudo sh -c 'ls | tee /dev/tty3a'
1串行端口从 0 开始编号。
答案2
您在一本书中找到的示例表明您可以同时在自己的屏幕和其他终端屏幕上书写。在同一台服务器上登录两次并运行w
,您会得到类似以下内容的信息:
$ w
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
joe pts/1 :0 21:53 0.00s 0.04s 0.00s w
joe pts/2 :0 22:38 3.00s 0.01s 0.01s /bin/bash
在第一个控制台写入:
$ seq 3 | tee /dev/pts/1
你会得到双输出。
然后在同一个控制台上尝试
$ seq 3 | tee /dev/pts/2
并且您在两个屏幕上都会得到相同的输出。
如果您有很多已登录的监视器/控制台并且您想从一个控制台更新它们,这可能会很有用。