我创建了一个简单的脚本,如下面的名为" / usr / bin / mytool1"并使其可执行。
#!/usr/bin/rlwrap /usr/bin/perl
while (1) {
chomp($cmd = <STDIN>);
print "cmd=$cmd\n";
}
问题是,如果我以普通用户身份运行它,它可以正常工作。
然后我做了一个&#34; sudo bash&#34;而作为root,我运行mytool1,它也可以正常工作。现在我以常规用户身份回来,运行命令&#34; mytool1&#34;会给出错误,如:
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
会在以root身份运行时将/home/user1/.perl_history
的所有者更改为root。
我认为这是rlwrap的一个错误,因为在Ubuntu的情况下,$HOME
在我运行sudo bash
后没有改变,rlwrap
应该使用$USER
构建历史文件。
您怎么看?
答案 0 :(得分:1)
sudo
可能配置了安全策略,不会更改环境变量,包括HOME
。您可以尝试使用-H
选项覆盖此行为。有关详细信息,请参阅man sudo
。
答案 1 :(得分:1)
找到适合我的解决方案:下载rlwrap source并更改为src文件“main.c”,然后在第604行添加
history_filename = malloc(100);
sprintf(history_filename, "/home/%s/.%s_history",getenv("USER"), command_name);
现在rlwrap将为不同的用户使用不同的历史文件。
答案 2 :(得分:1)
无需修改和重新编译rlwrap
,只需在命令行中指定历史文件:
rlwrap --history-filename=$HOME/.${USER}_command_history command
我很惊讶Ubuntu的sudo
默认保留$HOME
,我不明白为什么这会有用(在{0}} Ubuntu列表中有here反对此政策,但肯定没有抗议风暴)
与此同时,我会保持rlwrap
的行为,但occasional murmurings是否以及其他程序是否以及如何避免此类问题(try to find out)
汉斯(rlwrap
维护者)