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.
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.
Odpowiedzi:
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ć -d
lub 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ść).
sudo
polecenie się nie powiedzie (złe hasło, niedozwolone w / etc / sudoers itp.), Da ten sam rezultat, jakby plik nie istniał.
sudo
if sudo test -f "/path/to/file"; then
echo "FILE EXISTS"
else
echo "FILE DOESN'T EXIST"
fi
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
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