我使用 iptables 阻止我孩子的 Linux 帐户的所有互联网流量。有时我想让他们使用一个程序或另一个程序。在这种情况下,我允许他们通过 sudoers 作为另一个(无限)用户运行该程序。这次我尝试让他们使用翻译外壳以及mpg123
播放声音/发音翻译单词:
kiddy ALL= (daddy) NOPASSWD: /usr/bin/trans
但是,sudo -u daddy trans en:he -speak -player mpg123 apple
以kiddy
用户身份运行会在终端中显示正确的翻译,但不会播放声音,并指出:“语音输出不适用于英语”。一旦我登录daddy
Gnome 并运行相同的命令:trans en:he -speak -player mpg123 apple
- 一切都按预期进行,我得到了文本翻译和声音播放。两个用户都属于该audio
组。我试过这种方法但 id 没有帮助。我使用的是 Debian 12,无论是 Wayland 还是 Xorg 都没有$HOME/.Xauthority
用于该解决方案的文件...
如何使 translate-shell 以另一个用户身份通过 sudo 播放音频?
答案1
现代系统上的音频设备由管线它在您的目录中有一个套接字/run/user
。为了让 sudo:ed 进程访问当前会话的 pipeline 实例,您需要允许它访问套接字$XDG_RUNTIME_DIR/pipewire-0
。套接字本身通常对任何人开放,但$XDG_RUNTIME_DIR
事实并非如此。
有效的命令序列是
chmod a+x $XDG_RUNTIME_DIR
sudo -u daddy XDG_RUNTIME_DIR=$XDG_RUNTIME_DIR trans en:he -speak -player mpg123 apple
但是,请务必考虑到您正在$XDG_RUNTIME_DIR
向您可能不想要的任何人开放。
答案2
根据 Göran Uddeborg 的回答,我这样做了:
- chmod 705 $XDG_RUNTIME_DIR
- 使用
sudo visudo
我添加了这些行:
Defaults:kiddy env_keep += "XDG_RUNTIME_DIR"
kiddy ALL= (daddy) NOPASSWD: /usr/bin/trans
现在可以了!
答案3
该XDG_RUNTIME_DIR
指令并没有给我带来最终结果,而是一个更简单、更整洁的结果操作说明做过:
$ 须藤添加用户用户声音的 $ 须藤添加用户用户脉冲 $ 须藤添加用户用户脉冲存取
在这里,这user
将是daddy
原始答案,孩子想要以sudo
爸爸的身份执行应用程序,并让音频工作。