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 будет использовать разные файлы истории для разных пользователей.

Другие вопросы по тегам