Як я можу використовувати sudo, щоб перевірити, чи існує файл?


13

Я хочу перевірити, чи існує такий файл

[ -f /path/to/file/ ]

Однак я виконую цю команду як звичайний користувач, а файл належить root. Як я можу використовувати судо для цього.

sudo [ -f /path/to/file/ ] не працює.


2
Це працює в моїй системі. Які симптоми? Ви впевнені, що хочете використовувати -f, а не -e?
b0fh

Відповіді:


11

Те, що ви описуєте, має працювати добре - доки ви використовуєте абсолютні шляхи, і -f("Файл існує та є звичайним файлом") - це справді тест, який ви хочете виконати.

Я бачу крок /у тому, що ви розмістили у своєму запитанні - чи ви протестуєте каталог? Це має бути -d, або просто -e("Щось існує з цією назвою - незалежно від типу")

Також зауважте, що якщо щось по дорозі не читається test( [), ви повинні мати можливість повідомити вам про те, чи існує файл, що належить root, чи ні (наприклад [ -f /root/.ssh/known_hosts ], ймовірно, не вдасться, оскільки каталог /root/.ssh не є (або принаймні не повинен бути нечитабельним звичайним користувачем. [ -f /etc/crontab ]повинен досягти успіху).


4
Можлива проблема: якщо sudoкоманда не вдається (неправильний пароль, не дозволено в / etc / sudoers тощо), це дасть такий самий результат, як якщо б файл не існував.
Гордон Девіссон

1
@Gordon - правда: моя відповідь розрахована на sudoчастину, що працює :)
voretaq7

13
if sudo test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

тестова сторінка людини

Для завершення речей, на протилежному боці, якщо ви хочете перевірити з кореня, чи файл чи каталог читається для певного користувача, який ви можете використовувати

if sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

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

1

Додавши до інших відповідей, розрізнити тест або тестування автентичності судо можна за допомогою першого запуску sudo true. Більшість реалізацій sudo, про які я знаю, не потребуватимуть повторної автентифікації протягом короткого періоду.

Наприклад:

if sudo true; then
    if sudo test -f "/path/to/file"; then
        echo "FILE EXISTS"
    else
        echo "FILE DOESN'T EXIST"
    fi
else
    echo "SUDO AUTHENTICATION FAILED"
fi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.