题 Sudo作为不同的用户和运行屏幕


今天发现,作为一个不同的用户运行屏幕,我sudo进入将无法正常工作!

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails

我有一个作为“监视器”用户运行的脚本。我们在屏幕会话中运行它以便在屏幕上看到输出。问题是,我们有一些用户使用他们自己的帐户登录(即bob,james,susie等等),然后他们sudo进入“监控”用户。让他们访问“监视”用户是不可能的。


150
2018-02-25 15:07




这是你得到的错误吗? “无法打开你的终端'/ dev / pts / 0' - 请检查。” - Jim
是的,那就是那一个。我理解为什么会这样,但有没有解决方法? - luckytaxi
评论你的命令 - 我一直看到人们在跑 sudo su "user" -。为什么不用 sudo -u user -s? - Andrew Aylett
@Jim:+1用于提供丢失的错误消息。 - Dennis Williamson
@Andrew我认识的大多数人都这样做 sudo su  - 我认为这正是人们习惯的(在我的情况下,因为你不需要知道任何sudo标志 sudo su  - 我不认为我曾经读过sudo手册页:) - voretaq7


答案:


试试跑步 script /dev/null 作为用户你 su 在启动屏幕之前 - 这是一个小小的黑客,但它应该让屏幕开心。


220
2018-02-25 16:46



Re:安全隐患,没有我知道(但这并不意味着没有:) - IIRC这依赖于“脚本”打开新终端设备的副作用(当用户调用它时) ,因为你将脚本的输出发送到/ dev / null,所以没有什么可以捕获的。它也比将用户添加到tty组(IMHO)更安全 - voretaq7
@nalply坦率地说,如果你是一个Unix系统管理员,你不应该发现多个shell混乱 - 说, script 可以用来发射 screen。然后你只需要退出两次(一次为 screen,一次 su)。 (这就是 script man page可以为你澄清,如果你花时间阅读它...) - voretaq7
或者只是跑步 sudo -u bob script -q -c 'screen -dr myscreen' /dev/null。然后你只有一个终端退出/分离。 - Andy Shulman
谢谢,这救了我。但是为什么要解决这个问题呢?从我的理解,它打印从stdout到......无处可见的一切。并以某种方式修复屏幕。 - sudo
@sudo为了做到这一点 script 打开自己的tty设备,由运行它的用户拥有(查看 /dev 你跑完后就会看到它出现 script)。 screen 然后抓住那个tty设备(由运行的用户拥有) screen 所以访问它没有问题)。这是一个完全黑客的工作,但它的工作原理。看看我的一些机器,看起来新版本的屏幕似乎安装了setuid-root,这也有效,但意味着你有另一个setuid-root二进制文件浮动,这使得一些人有理由感到不舒服。 - voretaq7


我正在使用包装函数 screen 对于我的用户 sudo su 至。这是我添加给用户的包装函数 ~/.bashrc

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

这允许我使用所有选项和参数 screen 我可能想要使用。我正在考虑将此功能放在全系统上。


32
2017-08-13 13:45



完美的工作。对于那些想要这个系统范围的人,我建议将其添加到/etc/bash.bashrc - 适用于所有用户。 - Someguy123
这不会引用正确的屏幕参数,否则是一个很好的解决方案。 - augurar


假设他们正在SSH连接到主机,您可以为需要访问~monitor / .ssh / authorized_keys文件中的监视器帐户的每个用户添加公共ssh密钥。然后在每个用户的远程计算机上运行它们

ssh -t monitor@remote.machine screen -RD


7
2018-02-25 16:52



这是另一个好方法 - 你必须在授权密钥文件中指定强制命令(根据幸运的是“让他们访问'监视'用户是不可能的”上面注意 - 强制命令可能会限制它们只是附加屏幕会话) - voretaq7
我不知道如何在我的回答中解决这个问题,因为他说“让他们访问......是不可能的”,但也说“......他们进入'监控'用户”。但我同意,强制命令限制在authorized_keys应该照顾。 - Alex


假设我们正在谈论这个错误:

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

这是一个单行(例如可以用作“别名gobob”):

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

说明:

这将以用户bob启动shell(如登录shell)。用户bob开始 script,被告知调用bash(可能是破折号或ksh ......)并且会话的副本被丢弃。


6
2018-02-22 08:36





可能必须更改有问题的设备的权限或将监视器添加到有权读取该设备的组,这将是我的第一个倾向。但是你必须权衡这样做的安全含义。


0
2018-02-25 15:51





你说你做的:

sudo su "monitor" -

我想知道尾随的破折号。我经常这样做:

sudo su - username

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


0
2018-02-25 18:44



不。 sudo su - username 和 sudo su username - 做同样的事。 - Tim Ludwinski


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


-2
2018-06-22 02:09



听起来很棒。 - Evan Carroll
@EvanCarroll这是一个很好的解决方案,除了它提供的部分 整个世界 对终端的读写访问权限。只是一个小的安全问题 - 没有程序会关心这一点,当然除了在接受密码之前检查终端安全性的任何事情(gpg 例如)。当然,他永远不会在有恶意用户的系统上观看 tty 并嗅探密码...... - voretaq7
被警告:永远不要在家里试试!这很危险!!! - ruizpauker