Jak mogę użyć sudo, aby sprawdzić, czy plik istnieje?

13

Chcę sprawdzić, czy plik istnieje w ten sposób

[ -f /path/to/file/ ]

Jednak uruchamiam to polecenie jako zwykły użytkownik, a plik jest własnością root. Jak mogę użyć sudo, aby to osiągnąć.

sudo [ -f /path/to/file/ ] nie działa.

ckliborn
źródło
2
Działa w moim systemie. Jakie są objawy ? Czy na pewno chcesz użyć opcji -f, a nie -e?
b0fh

Odpowiedzi:

11

To, co opisujesz, powinno działać dobrze - o ile korzystasz ze ścieżek bezwzględnych, a -f(„Plik istnieje i jest zwykłym plikiem”) jest tak naprawdę testem, który chcesz wykonać.

Widzę ślad /w tym, co napisałeś w swoim pytaniu - Czy testujesz katalog? To powinno być -dlub po prostu -e(„Coś istnieje z tą nazwą - niezależnie od typu”)

Zauważ też, że jeśli coś po drodze jest nieczytelne test( [), powinno być w stanie stwierdzić, czy plik należący do roota istnieje, czy nie (np. [ -f /root/.ssh/known_hosts ]Prawdopodobnie zawiedzie, ponieważ katalog /root/.ssh nie jest (a przynajmniej nie powinien powinien być czytelny dla zwykłego użytkownika. [ -f /etc/crontab ]powinien się powieść).

voretaq7
źródło
4
Istnieje możliwy problem: jeśli sudopolecenie się nie powiedzie (złe hasło, niedozwolone w / etc / sudoers itp.), Da ten sam rezultat, jakby plik nie istniał.
Gordon Davisson,
1
@Gordon - prawda: Moja odpowiedź jest sudo
uzależniona od
13
if sudo test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi

strona testowa

Aby wykonać czynności, po przeciwnej stronie, jeśli chcesz sprawdzić z katalogu głównego, czy plik lub katalog jest czytelny dla określonego użytkownika, którego możesz użyć

if sudo -u username test -f "/path/to/file"; then
    echo "FILE EXISTS"
else
    echo "FILE DOESN'T EXIST"
fi
Luca Borrione
źródło
Odpowiedź Lucy Borrione działała dla mnie idealnie. Musiałem przetestować istnienie plików, które były głęboko w katalogach odczytywalnych tylko przez root.
wallheater
1

Dodając do innych odpowiedzi, rozróżnienie między niepowodzeniem uwierzytelnienia testowego lub sudo można wykonać przy pierwszym uruchomieniu sudo true. Większość implementacji sudo, o których wiem, nie wymaga ponownego uwierzytelnienia w krótkim czasie.

Na przykład:

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
Robrecht Dewaele
źródło