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 bash
、rlwrap
之后没有改变应该使用 $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
维护者)
我创建了一个名为“/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 bash
、rlwrap
之后没有改变应该使用 $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
维护者)