rlwrap 不能 read/write 它自己的历史

rlwrap cannot read/write its own history

我创建了一个名为“/usr/bin/mytool1”的简单脚本,并使其可执行。

#!/usr/bin/rlwrap /usr/bin/perl

while (1) {
    chomp($cmd = <STDIN>);
    print "cmd=$cmd\n";
}

问题是,如果我 运行 作为普通用户,它可以正常工作。

然后我做了一个 "sudo bash" 并且作为 root,我 运行 mytool1,它也工作正常。

现在我作为普通用户回来了,运行ning 命令 "mytool1" 会给出如下错误:

rlwrap: cannot read and write /home/user1/.perl_history: Permission denied

我做了一些调查,这是我的发现:

$ ls -l /home/user1/.perl_history
-rw------- 1 root root 138 Dec  6 18:13 /home/user1/.perl_history

这里的问题是,rlwrap/home/user1/.perl_history 的所有者更改为 root,而 运行 是 root。

我认为这是 rlwrap 上的一个错误,因为在 Ubuntu、$HOME 的情况下,在我 运行、sudo bashrlwrap 之后没有改变应该使用 $USER 构建历史文件。

你怎么看?

sudo 可能配置了不更改环境变量的安全策略,包括 HOME。您可以尝试使用 -H 选项覆盖此行为。有关详细信息,请参阅 man sudo

找到适合我的解决方案:下载 rlwrap source 并更改 src 文件 "main.c" 并在第 604 行之后添加

history_filename = malloc(100);
sprintf(history_filename, "/home/%s/.%s_history",getenv("USER"),  command_name);

现在 rlwrap 将为不同的用户使用不同的历史文件。

无需修改重新编译rlwrap,只需在命令行指定历史文件:

rlwrap --history-filename=$HOME/.${USER}_command_history command

令我惊讶的是 Ubuntu 的 sudo 默认保留 $HOME,我不明白为什么这会有用(有 occasional murmurings 反对此政策在 Ubuntu 名单上,但肯定没有抗议风暴)

在此期间,我将保持 rlwrap 的行为不变,但是 try to find out whether and how other programs avoid problems like this (not all of them do)

编辑(2019 年 8 月):从 sudo - 1.8.27-1ubuntu2 开始 Ubuntu(终于!)restores sudo 处理 $HOME 到其他人所做的事情:默认情况下,它将保留$HOME。这意味着 rlwrap 将能够在 sudo 下 运行 时读取和写入自己的历史记录,即使没有额外的 --history-filename 参数。

Hans(rlwrap 维护者)