Sudo作为其他用户和运行屏幕


167

今天发现,我作为sudo的其他用户正在运行的屏幕将无法工作!

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'

我有一个以“监视”用户身份运行的脚本。我们在屏幕会话中运行它,以便在屏幕上查看输出。问题是,我们有许多用户使用自己的帐户登录(例如bob,james,susie等),然后他们将sudo变成“监控”用户。将他们授予“监视”用户访问权限是不可能的。


13
这是您得到的错误吗?“无法打开终端'/ dev / pts / 0'-请检查。”
吉姆(Jim)2010年

是的,那是一个。我了解为什么会发生这种情况,但是有解决方法吗?
luckytaxi

4
关于您的命令的评论-我一直看到有人在奔波sudo su "user" -。为什么不使用sudo -u user -s
Andrew Aylett

2
@Jim:+1用于提供缺少的错误消息。
丹尼斯·威廉姆森

1
@Andrew我知道的大多数人都知道sudo su-我认为这是人们习惯的(在我的情况下,这是因为您不需要了解任何sudo标志sudo su-我认为我从未读过sudo手册页:)
voretaq7'2

Answers:


245

在启动屏幕之前,尝试script /dev/null以您su要运行的用户身份运行-这是一个贫民窟的小技巧,但它应该会使屏幕开心。


5
回复:安全隐患,我不知道(但这并不意味着不存在任何隐患:)-IIRC依赖于“脚本”打开新终端设备的副作用(因为用户正在调用它) ,并且由于您要将脚本的输出发送到/ dev / null,因此没有任何要捕获的内容。它绝对比将用户添加到tty组(IMHO)更安全
voretaq7'2

2
@nalply坦率地说,如果您是Unix系统管理员,那么您应该不会发现多个shell令人困惑-也就是说,script可以用来启动它screen。然后,您只需要退出两次即可(一次为screen,一次为su)。(script如果您花时间阅读手册页,这可以帮助您澄清一下……)
voretaq7 2013年

10
还是随便跑sudo -u bob script -q -c 'screen -dr myscreen' /dev/null。这样,您只有一个终端可以退出/分离。
安迪·舒尔曼

4
谢谢,这救了我。但是,为什么要解决此问题?据我了解,它可以打印从stdout到...的所有内容。并以某种方式修复屏幕。
sudo

3
@sudo为了执行该操作,script将打开它自己的tty设备,该设备由运行它的用户拥有(查看/dev并在运行后会看到它script)。screen然后抓取该tty设备(该设备由运行中的用户拥有,screen因此访问它没有麻烦)。这是一个完全的骇客工作,但确实可行。查看我的某些机器,似乎新版本的屏幕似乎安装了setuid-root,它也可以工作,但是意味着您还有另一个setuid-root二进制文件在周围浮动,这使某些人感到不舒服。
voretaq7 '01

33

我正在为我要使用screen的用户使用包装函数sudo su。这是我添加到用户的包装函数~/.bashrc

功能screen(){
  / usr / bin / script -q -c“ / usr / bin / screen $ {*}” / dev / null
}

这使我可以使用所有screen可能要使用的选项和参数。我正在考虑将此功能放在系统范围内。


1
完美运作。对于那些希望在系统范围内使用的用户,我建议将其添加到/etc/bash.bashrc中-适用于所有用户。
Someguy123

2
这不会引用参数来正确筛选,否则是一个很好的解决方案。
augurar

7

假设他们仍然通过SSH进入主机,则可以在〜monitor / .ssh / authorized_keys文件中为需要访问监视帐户的每个用户添加公共ssh密钥。然后,他们可以在每个用户的远程计算机上运行

ssh -t monitor@remote.machine屏幕-RD


这是另一种很好的方法-尽管您必须在授权密钥文件中指定强制命令(按照上述的“幸运的运气”,“使他们无法访问'监视'用户”)注释–强制命令可能会将其限制为仅附加屏幕会话)
voretaq7,2010年

2
我不确定如何在我的答案中解决该问题,因为他说过“让他们访问...是不可能的”,但他也说“ ...他们对'监视'用户感到很恼火”。但是我同意,在authorized_keys中强制执行命令限制应该可以解决这一问题。
亚历克斯(Alex)2010年

7

假设我们正在谈论此错误:

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.

这是单线纸(例如,可以用作“别名图案”):

sudo su - bob -c "script -c bash /dev/null"'

说明:

这将以bob用户身份启动外壳程序(如登录外壳程序)。用户bob starts script,被告知调用bash(可以是dash或ksh ...),并且会话的副本被丢弃。


0

可能必须更改有关设备的权限,或者将监视器添加到具有读取该设备权限的组中,这是我的初衷。但是您必须权衡这样做的安全隐患。


0

您说您这样做:

sudo su "monitor" -

我想知道后面的破折号。我通常这样做:

sudo su - username

破折号(根据su手册页)告诉su“将shell设为登录shell”。这意味着它将获取所有常用的shell启动脚本并正确设置诸如PATH和HOME之类的内容。


3
不。 sudo su - usernamesudo su username -做同样的事情。
蒂姆·卢德温斯基

-4

我刚遇到这个问题。chmod +rw $(tty)在运行sudo之前解决了它。此解决方案的问题在于,此后任何人都可以连接并监听您的终端。


2
听起来是个不错的解决方案。
埃文·卡罗尔

10
@EvanCarroll这是一个很好的解决方案,除了它可以使整个世界对其终端进行读写访问的部分。只是一个很小的安全性问题-除了程序在接受密码之前检查终端安全性的任何内容(gpg例如)外,任何程序都不会关心它。并且肯定他永远不会在具有会监视tty和嗅探密码的恶意用户的系统上……
voretaq7 2013年

警告:切勿在家尝试!这很危险!!!
ruizpauker
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.