问题
在我的机器(Ubuntu 18.04)上,我可以man
在控制台中正常查看页面。
但是,我似乎无法让man --html
( man -H
) 或man --gxditview
( man -X
) 工作。
可能有人对出了什么问题有任何暗示吗?
相关文章
- https://askubuntu.com/a/339268/692420- 发现这个意识到我需要
sudo apt install groff
。 - https://bbs.archlinux.org/viewtopic.php?id=238227- 提到过
MAN_DISABLE_SECCOMP
,但我尝试了一下,似乎没有改变我的问题。 - 重新安装手册页并修复手册- 这提到了重新安装软件包,但该用户甚至无法
man cp
在控制台上查看。 - 对于我搜索和发现的其他帖子,他们只是遇到了问题
DISPLAY
。在这种情况下,我觉得我已经通过开放而打消了这种可能性firefox
,并且gxditview
自己就好了。
潜在的解决方法
我猜我可以使用man2html
其他帖子中类似的东西,但如果可能的话,我更愿意先知道如何修复“内置”设置。
还有yelp man:cp
,来自的建议上面链接的帖子,看起来非常好,所以现在可能会坚持使用(但希望外部参照在那里......)
再生产
我已经“最小化”了我的环境变量使用以下命令:
$ alias bash-isolate='env -i HOME=$HOME DISPLAY=$DISPLAY SHELL=$SHELL TERM=$TERM USER=$USER PATH=/usr/local/bin:/usr/bin:/bin bash --norc'
$ bash-isolate
# In isolated session
$ env | sort
DISPLAY=:1
HOME=/home/eacousineau
PATH=/usr/local/bin:/usr/bin:/bin
PWD=/home/eacousineau
SHELL=/bin/bash
SHLVL=1
TERM=screen
USER=eacousineau
_=/usr/bin/env
我的所有示例都将从这个环境开始发布。
这里显示man
通常有效:
$ man cp | head -n 4
CP(1) User Commands CP(1)
NAME
cp - copy files and directories
但是,当我尝试致电man --html=/usr/bin/firefox
或 时man --gxditview
,我得到以下信息:
$ which groff
/usr/bin/groff
$ firefox
# A window opens up fine and dandy.
$ man --html=/usr/bin/firefox cp
Unable to init server: Could not connect: Connection refused
Error: cannot open display: :1
man: couldn't execute any browser from /usr/bin/firefox
$ gxditview
# A window opens up fine and dandy, also.
$ man --gxditview cp
groff: gxditview: Signal 31 (core dumped)
man: command exited with status 1: (cd /usr/share/man && /usr/lib/man-db/zsoelim) | (cd /usr/share/man && /usr/lib/man-db/manconv -f UTF-8:ISO-8859-1 -t UTF-8//IGNORE) | (cd /usr/share/man && preconv -e UTF-8) | (cd /usr/share/man && tbl) | (cd /usr/share/man && groff -mandoc -TX75 -X)
如果我运行相同的命令,但在它们前面加上export MAN_DISABLE_SECCOMP=1
,我看不到行为上的差异:
$ export MAN_DISABLE_SECCOMP=1
$ env | sort
DISPLAY=:1
HOME=/home/eacousineau
MAN_DISABLE_SECCOMP=1
PATH=/usr/local/bin:/usr/bin:/bin
PWD=/home/eacousineau
SHELL=/bin/bash
SHLVL=1
TERM=screen
USER=eacousineau
_=/usr/bin/env
$ man --html=/usr/bin/firefox cp
# Same as above.
$ man --gxditview cp
# Same as above.
我还尝试随意使用xhost +
and xhost +local:root
(并快速调用xhost -
/xhost -local:root
并随后终止这些会话),但发现了相同的行为。
答案1
针对 Ubuntu 18.04.4 LTS 的修复
跑步
BROWSER=firefox man --html cp
在一个终端窗口中并且
tail -f /var/log/syslog
在另一个窗口中,我的虚拟机中显示了以下输出:
Jun 20 22:25:00 redacted kernel: [186784.927254] audit: type=1400 audit(1592684700.904:81): apparmor="DENIED" operation="file_inherit" profile="man_groff" name="/tmp/hmanwJkIBp/cp.html" pid=6943 comm="preconv" requested_mask="w" denied_mask="w" fsuid=1000 ouid=1000
Jun 20 22:25:00 redacted kernel: [186784.960191] audit: type=1400 audit(1592684700.936:82): apparmor="DENIED" operation="file_inherit" profile="man_groff" name="/tmp/hmanwJkIBp/cp.html" pid=6944 comm="tbl" requested_mask="w" denied_mask="w" fsuid=1000 ouid=1000
Jun 20 22:25:00 redacted kernel: [186785.004522] audit: type=1400 audit(1592684700.980:83): apparmor="DENIED" operation="file_inherit" profile="man_groff" name="/tmp/groff-regions-GzqhRi" pid=6952 comm="troff" requested_mask="w" denied_mask="w" fsuid=1000 ouid=1000
Jun 20 22:25:01 redacted kernel: [186785.022296] audit: type=1400 audit(1592684700.992:84): apparmor="DENIED" operation="open" profile="man_groff" name="/etc/papersize" pid=6952 comm="troff" requested_mask="r" denied_mask="r" fsuid=1000 ouid=0
Jun 20 22:25:01 redacted kernel: [186785.652245] audit: type=1400 audit(1592684701.628:85): apparmor="DENIED" operation="connect" profile="/usr/bin/man" pid=6958 comm="firefox" family="unix" sock_type="stream" protocol=0 requested_mask="send receive connect" denied_mask="send connect" addr=none peer_addr="@/tmp/.X11-unix/X0" peer="unconfined"
Jun 20 22:25:01 redacted kernel: [186785.654920] audit: type=1400 audit(1592684701.632:86): apparmor="DENIED" operation="connect" profile="/usr/bin/man" pid=6961 comm="firefox" family="unix" sock_type="stream" protocol=0 requested_mask="send receive connect" denied_mask="send connect" addr=none peer_addr="@/tmp/.X11-unix/X0" peer="unconfined"
含义apparmor
和配置文件man_groff
并/usr/bin/man
以某种方式参与非功能命令。
运行sudo aa-status | grep man
确实输出:
/usr/bin/man
/usr/lib/connman/scripts/dhclient-script
man_filter
man_groff
要禁用man
配置文件并从内核中删除 AppArmor 定义,请运行
sudo ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/
sudo apparmor_parser -R /etc/apparmor.d/usr.bin.man
并再次验证输出sudo aa-status | grep man
。条目/usr/bin/man
、man_filter
和man_groff
应该消失。
然后运行
BROWSER=firefox man --html cp
或者
man --html=firefox cp
或者
MAN_DISABLE_SECCOMP=1 man --gxditview cp
享受。
笔记:我以前从未使用过 AppArmor,甚至不知道它在我的 Ubuntu VM 中处于活动状态。这些链接为我提供了禁用配置文件的信息:
答案2
如果您不想完全禁用默认的 AppArmor 配置文件/etc/apparmor.d/usr.bin.man
,您可以编辑以添加所需的缺失规则,或者在/etc/apparmor.d/local/usr.bin.man
aa-notify
使用、和类似工具的组合aa-logprof
,如此处所述来自 Ubuntu 的优秀教程,您可以找到所需的规则:
# Needed by /usr/bin/man main profile:
#include <abstractions/nameservice>
capability sys_admin,
# Needed by man_groff child profile:
#include <abstractions/user-tmp>
/etc/papersize r,