![伪终端错误::“mesg: 无法打开 /dev/pts/2: 权限被拒绝”](https://linux22.com/image/213440/%E4%BC%AA%E7%BB%88%E7%AB%AF%E9%94%99%E8%AF%AF%3A%3A%E2%80%9Cmesg%3A%20%E6%97%A0%E6%B3%95%E6%89%93%E5%BC%80%20%2Fdev%2Fpts%2F2%3A%20%E6%9D%83%E9%99%90%E8%A2%AB%E6%8B%92%E7%BB%9D%E2%80%9D.png)
在我的 Ubuntu 20.04.5 机器上,我有一个 Perl 脚本在userA
的帐户下运行。该脚本发出以下命令:
sudo su - userB -c "ssh -l userB 10.0.0.1 ls -tr /some/remote/directory"
(即,通过 SSH 连接到远程主机userB
,然后列出 中的所有文件/some/remote/directory
)
该命令运行得很好...除了我在命令行上看到一个错误:
me@ubuntu1$ sudo su - userB -c "ssh -l userB 10.0.0.1 ls -tr /some/remote/directory"
mesg: cannot open /dev/pts/2: Permission denied
Welcome to 10.0.0.1! You have logged in.
file1.txt
file2.txt
file3.txt
me@ubuntu1$
mesg: cannot open /dev/pts/2: Permission denied
那条消息是什么???
一点互联网研究揭示:
/dev/pts 中的条目是伪终端(简称 pty)。 Unix 内核有一个通用的终端概念。终端为应用程序提供了一种通过终端设备显示输出和接收输入的方式。
假设我只是通过伪终端阅读:
如果程序打开终端进行读取,则用户的输入将传递到该程序。如果多个程序从同一终端读取,则每个字符将独立路由到其中一个程序;不建议这样做。通常,在给定时间只有一个程序主动从终端读取数据;当程序不在前台时尝试从控制终端读取数据会被 SIGTTIN 信号自动挂起。
这很有趣......但我仍然困惑为什么我会看到mesg: cannot open /dev/pts/2: Permission denied
。我仍在开发我的脚本并已运行多次;我不记得第一次运行时是否注意到此错误消息。是否有可能每次我的脚本运行时,它/dev/pts/2
每次都会尝试访问,但我的代码没有正确关闭连接或其他什么?
userA
或者这可能与使用运行命令有关userB
?访问另一个用户帐户时,伪终端不会发挥作用,对吗?
欢迎任何见解或反馈,谢谢。
答案1
如果该设备分配的组是“tty”,只需将用户添加到该组 tty (/etc/group) 中。
问候