2

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

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

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

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

然后我做了一个“sudo bash”并以 root 身份运行 mytool1,它也可以正常工作。

现在我作为普通用户回来了,运行命令“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

这里的问题是,当它以 root 身份运行时,rlwrap会将其所有者更改/home/user1/.perl_history为 root。

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

你怎么看?

4

3 回答 3

1

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

于 2015-12-07T01:37:37.697 回答
1

找到了一个适合我的解决方案:下载 rlwrap并更改 src 文件“main.c”,在第 604 行之后,添加

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

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

于 2015-12-07T03:05:13.850 回答
1

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

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

我很惊讶 Ubuntu 的默认sudo保留$HOME,我不明白为什么这会很有用(在 Ubuntu 列表中偶尔会有反对这项政策的抱怨,但肯定没有抗议风暴)

同时,我将保持rlwraps 的行为不变,但尝试找出其他程序是否以及如何避免此类问题(并非所有程序都这样做

编辑(2019 年 8 月):从sudo - 1.8.27-1ubuntu2以后 Ubuntu(终于!)恢复 对其他人所做sudo的处理:默认情况下它不会保留。这意味着即使没有额外的参数,它也可以在运行时读取和写入自己的历史记录。$HOME$HOMErlwrapsudo--history-filename

汉斯(rlwrap维护者)

于 2015-12-08T00:46:40.640 回答