使用 libutempter 支持编译静态 tmux

使用 libutempter 支持编译静态 tmux

我想解决 tmux 无法通过以下方式报告用户名的问题logname

logname: no login name

我正在使用以下步骤:

# lets assume all other prerequisites are compiled already
# and staged/installed to $HOME/opt

# libutempter (http://freecode.com/projects/libutempter)
# URL : ftp://ftp.altlinux.org/pub/people/ldv/utempter/libutempter-1.1.5.tar.bz2
tar xvfj libutempter-1.1.5.tar.bz2
cd libutempter-1.1.5
vi Makefile
grep 'DESTDIR =' Makefile
---
DESTDIR = /home/xxxxxx/opt

make
make install

# tmux (http://tmux.sourceforge.net/)
# URL : git://git.code.sf.net/p/tmux/tmux-code
git clone git://git.code.sf.net/p/tmux/tmux-code tmux
cd tmux
sh autogen.sh

CFLAGS="-I$HOME/opt/include -I$HOME/opt/usr/include -I$HOME/opt/include/ncurses" \
CPPFLAGS="-I$HOME/opt/include -I$HOME/opt/usr/include -I$HOME/opt/include/ncurses" \
LDFLAGS="-L$HOME/opt/lib -L$HOME/opt/include/ncurses -L$HOME/opt/include -L$HOME/opt/usr/lib" \
./configure --enable-static

CPPFLAGS="-I$HOME/opt/include -I$HOME/opt/usr/include -I$HOME/opt/include/ncurses" \
LDFLAGS="-static -L$HOME/opt/include -L$HOME/opt/usr/include -L$HOME/opt/include/ncurses -L$HOME/opt/lib -L$HOME/opt/usr/lib" \
make

但 tmux 仍然无法通过 报告登录名logname

我无法安装软件包(没有 root 访问权限)。

我更新了环境变量和标志,ldd 报告没有共享库,但 tmux 仍然无法通过日志名显示登录名。

答案1

这是 的预期目的libutempter,但它也需要一定程度的应用程序支持,这tmux直到最近(2014 年 2 月)进入了掌握分支(您正在使用),但可能尚未准备好使用。

来自当前 1.9a 源代码分发中的常见问题解答:

* How is tmux different from GNU screen?
  [...]
  - screen has support for updating utmp. Nobody has really come up with a clean,
    portable way to do this without making tmux setuid or setgid yet.

主分支在线常见问题解答CHANGES尽管该文件尚未更新 ,但完全忽略了这一点。

运行后检查定义HAVE_UTEMPTERMakefile不是预期的!) ,如果没有定义,那么您需要阅读以确定构建环境有什么问题。config.hconfigureconfig.log

我目前最好的猜测是:

  • 你没有libutempter.a, only libutempter.so,所以使用-static会导致 libutempter 检测失败,因为它无法链接
  • 它被检测到并编译进去,但是utempter助手(更新的特权任务utmp被委托给它)不是setgid(通常是setgid utmp)
  • 有些系统是已知限制访问到那个帮手防止愚蠢,因此调用二进制文件(即tmux)必须被setgid(通常是setgid utempter)

如果你libutempter自己构建它应该使两个都静态和动态版本,但我怀疑分发包将只包含动态版本。

如果您没有 root 访问权限,您不能正确安装您自己的 libutempter:它无法维护系统utmp/wtmp文件。如果系统安装的 libutempter 仅缺少libutempter.a,那么您应该能够编译自己的 libutempterlibutempter.a以便tmux静态配置/链接,并使用已安装的系统 setgid 帮助程序(通常/usr/lib/utempter/utempter为 或/usr/libexec/utempter/utempter)。如果对该二进制文件的访问也受到限制,即tmux需要 setgid 才能运行它,则无法解决该问题。

tmux目前,新 libutempter 功能的错误处理尚不完整,如果您可以使用-DUTEMPTER_DEBUG它重建 libutempter,如果上述情况均未完成,可能会有所帮助:

make CFLAGS=-DUTEMPTER_DEBUG

相关内容