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

sdo*_*257 178 sudo gnu-screen

今天发现作为我 sudo 进入的不同用户运行屏幕将不起作用!

IE

ssh bob@server         # ssh into server as bob
sudo su "monitor" -
screen                 # fails: Cannot open your terminal '/dev/pts/0'
Run Code Online (Sandbox Code Playgroud)

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

vor*_*aq7 256

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

  • 或者直接运行 `sudo -u bob script -q -c 'screen -dr myscreen' /dev/null`。那么你只有一个终端可以退出/分离。 (11认同)
  • 回复:安全隐患,我不知道(但这并不意味着没有任何 :) - IIRC 这依赖于打开新终端设备的“脚本”的副作用(当用户调用它时) ,并且由于您将脚本的输出发送到 /dev/null,因此没有什么可捕获的。这也绝对比将用户添加到 tty 组(恕我直言)更安全 (5认同)
  • 谢谢,这救了我。但是为什么要解决这个问题?据我所知,它打印了从标准输出到……无处可去的所有内容。这以某种方式修复了屏幕。 (4认同)
  • @sudo 为了完成它的事情,`script` 打开了它自己的 tty 设备,由运行它的用户拥有(查看 `/dev`,你会在运行 `script` 后看到它出现)。`screen` 然后抓取那个 tty 设备(它由运行 `screen` 的用户拥有,因此访问它没有问题)。这是一个完全的黑客工作,但它有效。看看我的一些机器,似乎新版本的 screen 似乎安装了 setuid-root,它也可以工作,但意味着你有另一个 setuid-root 二进制文件在浮动,这让一些人感到不舒服。 (4认同)
  • @nalply 坦率地说,如果您是 Unix 系统管理员,您不应该发现多个 shell 令人困惑——也就是说,`script` 可用于启动 `screen`。然后你只需要退出两次(一次是`screen`,一次是`su`)。(这是 `script` 手册页可以为您澄清的内容,如果您花时间阅读它...) (2认同)

小智 36

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

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

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

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

Ale*_*lex 7

假设他们无论如何都通过 SSH 连接到主机,您可以在 ~monitor/.ssh/authorized_keys 文件中为每个需要访问监控帐户的用户添加公共 ssh 密钥。然后在每个用户的远程机器上他们可以运行

ssh -t monitor@remote.machine screen -RD

  • 我不确定如何在我的回答中解决这个问题,因为他说“给他们访问权限......是不可能的”,但也说“......他们sudo 到'监控'用户”。但我同意,在authorized_keys 中强制执行命令限制应该解决这个问题。 (2认同)

bas*_*ic6 7

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

$ sudo su - bob
$ screen
Cannot open your terminal '/dev/pts/5' - please check.
Run Code Online (Sandbox Code Playgroud)

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

sudo su - bob -c "script -c bash /dev/null"'
Run Code Online (Sandbox Code Playgroud)

解释:

这将作为用户 bob 启动一个 shell(如登录 shell)。用户 bob starts script,它被告知调用 bash(可以是 dash 或 ksh ...),并且会话的副本被丢弃。