поменять местами файлы вместо cp с временным файлом?

Ребята, я только что понял, что понял это, но никогда не публиковал ответ. В двух словах, мне нужно было загрузить код MIT Kerberos (, написанный на C++, также известном как Black Magic ), и найти часть кода, которая записывает билет kerberos в каталог /tmp и измените код так, чтобы он не добавлял 6 случайных символов в конец билета Kerberos, и закомментируйте любой раздел, касающийся удаления или уничтожения билета.

Мне пришлось скомпилировать в разделяемую библиотеку (файл pam _krb5.so )и поместить модифицированный код в мой контейнер docker. Тогда это сработало. К сожалению, я больше не работаю над этим проектом и не имею доступа к коду. Очень жаль, что я не поместил это в свой мерзавец.

Кстати, платная версия RStudio поддерживает этот параметр. Это хак, который вы должны сделать, если хотите использовать бесплатную версию. Если вам нужна помощь в поиске области кода для изменения, свяжитесь со мной.

5
17.10.2021, 16:51
3 ответа

Такую команду было бы легко написать, поэтому я подозреваю, что число существует. Но почему?

Какую проблему вам действительно нужно решить? В большинстве случаев есть гораздо лучшие способы.

Если у вас есть программа, которая читает файл с определенным именем, и вам нужны две версии, я обычно делаю обе версии в файловой системе с именами, указывающими на их удобство использования, и символической ссылкой на одну из них с именем программа, которая на самом деле использует. Затем я могу переключаться между ними, просто обновляя символическую ссылку (наln -sf).

0
17.10.2021, 17:10

Похоже, вы хотите избежать копирования содержимого файла Я могу придумать два способа добиться этого с файлами.

  1. используйте mvдля переименования файлов через эфемерный файл (содержимое не копируется ).

  2. используйте символическую ссылку, аналогичную указателю, и явно укажите, какая конфигурация вам требуется, а не подкачку. например

    
    $ ls
    a.txt  b.txt  define_setcfg.bash
    $ cat a.txt 
    hello
    $ cat b.txt
    world
    $ cat define_setcfg.bash 
    function setcfg () {
    echo Setting config to $1 # Should check that $1 is set to valid cfg filename
    ln -sf $1 actual.cfg       # create symbolic link of $1 named actual.cfg
    }   
    
    $ source./define_setcfg.bash # define the function in the current bash
    $ setcfg b.txt # use the function setcfg
    Setting config to b.txt
    $ ls -l # check what we have now
    total 12
    lrwxrwxrwx 1 username username   5 Oct 17 18:33 actual.cfg -> b.txt
    -rw-rw-r-- 1 username username   6 Oct 17 18:08 a.txt
    -rw-rw-r-- 1 username username   6 Oct 17 18:08 b.txt
    -rw-rw-r-- 1 username username 161 Oct 17 18:25 define_setcfg.bash
    $ setcfg a.txt # use the function providing a.txt as parameter 1
    Setting config to a.txt
    $ ls -l # check what we have now
    total 12
    lrwxrwxrwx 1 username username   5 Oct 17 18:34 actual.cfg -> a.txt
    -rw-rw-r-- 1 username username   6 Oct 17 18:08 a.txt
    -rw-rw-r-- 1 username username   6 Oct 17 18:08 b.txt
    -rw-rw-r-- 1 username username 161 Oct 17 18:25 define_setcfg.bash
    $   

0
17.10.2021, 17:53

Я не думаю, что есть такой стандартный системный вызов. Однако в Linux он есть.

Важно наличие или отсутствие выделенного системного вызова, поскольку хотя вы, конечно, можете выполнять rename(a, tmp); rename(b, a); rename(tmp, b);в любой системе, это не атомарно. Другой процесс, работающий в то же время, может, например. попробуйте открыть aсразу после того, как он был переименован, и он получит ошибку «файл не найден». Даже если вы замените этот первый rename()на link(), убедившись, что aсуществует все время, другой процесс может открыть и a, и bи получить один и тот же файл.

К счастью, замена двух файлов требуется не часто. (Я не уверен, что замена двух переменных так уж часто требуется ). Вместо этого более распространенной потребностью является замена содержимого за одним именем файла, не оставляя места, где читатель может получить частичные, смешанные или отсутствующие данные. И это легко сделать с помощью rename(), link()или symlink().

В вашем примере перехода от одного набора конфигураций к другому вы могли бы иметь символическую ссылку, указывающую на активную конфигурацию, а затем атомарно заменить ссылку.

. если у вас есть

$ ls -l
total 8
-rw-r--r-- 1 ilkkachu ilkkachu  6 Oct 17 21:07 conf1
-rw-r--r-- 1 ilkkachu ilkkachu 13 Oct 17 21:07 conf2
lrwxrwxrwx 1 ilkkachu ilkkachu  5 Oct 17 21:07 current -> conf1

, затем ln -sf conf2 currentатомарно изменит его на

$ ls -l
total 8
-rw-r--r-- 1 ilkkachu ilkkachu  6 Oct 17 21:07 conf1
-rw-r--r-- 1 ilkkachu ilkkachu 13 Oct 17 21:07 conf2
lrwxrwxrwx 1 ilkkachu ilkkachu  5 Oct 17 21:07 current -> conf2

Аналогично, вместо этого вы можете использовать conf1и currentв качестве жестких ссылок на один и тот же файл и заменить ссылку на ln -f conf2 current.

8
17.10.2021, 18:10

Теги

Похожие вопросы