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ć -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ść).
sudopolecenie 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