rlwrap не может читать / писать свою собственную историю
Я создал простой скрипт, такой как "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
Проблема здесь в том, rlwrap
изменит владельца /home/user1/.perl_history
root, когда он запускается как root.
Я думаю, что это ошибка в rlwrap, потому что в случае с Ubuntu, $HOME
не изменился после того, как я бегу sudo bash
, rlwrap
должен был использовать $USER
построить файл истории.
Как вы думаете?
3 ответа
Нет необходимости изменять и перекомпилировать rlwrap
просто укажите файл истории в командной строке:
rlwrap --history-filename=$HOME/.${USER}_command_history command
Я удивлен, что в Ubuntu sudo
сохраняет $HOME
по умолчанию я не могу понять, почему это когда-либо было бы полезно (в списках Ubuntu время от времени бывают шумы против этой политики, но, конечно, нет бурь протеста)
А пока буду держать rlwrap
поведение, как оно есть, но попытайтесь выяснить, как другие программы избегают подобных проблем (и не все)
Ганс (rlwrap
сопровождающий)
sudo
может быть настроен с политикой безопасности, чтобы не изменять переменные среды, в том числе HOME
, Вы можете попытаться изменить это поведение с помощью -H
вариант. Увидеть man sudo
Больше подробностей.
Нашел решение, которое работает для меня: загрузите исходный код rlwrap и внесите изменения в файл src "main.c" и после строки 604 добавьте
history_filename = malloc(100);
sprintf(history_filename, "/home/%s/.%s_history",getenv("USER"), command_name);
Теперь rlwrap будет использовать разные файлы истории для разных пользователей.