Как я могу использовать sudo, чтобы проверить, существует ли файл?

13

Я хочу проверить, существует ли файл так

[ -f /path/to/file/ ]

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

sudo [ -f /path/to/file/ ] не работает.

ckliborn
источник
2
Это работает на моей системе. Каковы симптомы? Вы уверены, что хотите использовать -f, а не -e?
b0fh

Ответы:

11

То, что вы описываете, должно работать нормально - если вы используете абсолютные пути, и -f(«Файл существует и является обычным файлом») - это действительно тест, который вы хотите выполнить.

Я вижу трейлинг /в том, что вы разместили в своем вопросе - тестируете ли вы каталог? Это должно быть -dили просто -e(«Что-то существует с этим именем - независимо от типа»)

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

voretaq7
источник
4
Возможная проблема: в случае sudoсбоя команды (неверный пароль, недопустимый в / etc / sudoers и т. Д.) Результат будет таким же, как если бы файл не существовал.
Гордон Дэвиссон
1
@ Гордон - правда: мой ответ основан на 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
Люка Боррионе
источник
Ответ Луки Боррионе отлично сработал для меня. Мне нужно было проверить наличие файлов, которые находились глубоко внутри каталогов, доступных для чтения только пользователю root.
настенный обогреватель
1

В добавление к другим ответам, различие между ошибкой проверки или проверки подлинности sudo может быть выполнено при первом запуске 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
Робрехт Деваэле
источник