+1. TIL lsof(i fuser) domyślnie nie robi tego, czego potrzebujesz.
Celada
@celada czy mógłbyś wyjaśnić?
YoungFrog,
Jakie masz obawy? Czy oglądasz wideo, czy martwisz się także dźwiękiem (w takim przypadku przykrycie obiektywu nie rozwiązałoby problemu)? A może chodzi o debugowanie, a nawet ciekawość? #
Chris H
@YoungFrog Właśnie komplementowałem OP w tym pytaniu, ponieważ sprawiło, że się czegoś nauczyłem. Początkowo założyłem, że lsof /dev/video0chciałbym, aby wszystkie procesy, które trzymały otwarty deskryptor pliku, były podłączone do obiektu vfs jądra, /dev/video0do którego się odnosi, bez względu na to, która ścieżka systemu plików została użyta do jego otwarcia, ale pytanie OP wyjaśnia, że to nieprawda.
Celada
Odpowiedzi:
15
Jeśli twoje jądro korzysta z modułów (co jest wysoce prawdopodobne), jednym ze sposobów ustalenia, czy program uzyskuje dostęp do twojej kamery internetowej, jest sprawdzenie liczby użyć modułu:
$ lsmod | grep uvcvideo
uvcvideo 90112 0
0 w trzecim polu pokazuje, że nic nie ma otwartego urządzenia dla uvcvideokontrolowanej kamery internetowej (po lsmoduruchomieniu). Oczywiście musisz dokładnie wiedzieć, który moduł jest odpowiedzialny za twoją kamerę internetową; łatwo to sprawdzić, zobaczysz zmianę wyniku podczas uruchamiania programu takiego jak Cheese.
Należy pamiętać, że ściśle mówiąc, dodatnia liczba oznacza tylko, że coś otworzyło urządzenie, nie oznacza to, że przechwytywane są obrazy.
Nie pozytywny liczyć również oznaczać jedynie, że coś takiego urządzenia otworzyć teraz , w przeciwieństwie do może być otwarcie go na ułamek sekundy, aby zrobić zdjęcie, a następnie go zamknąć? Przy takim wzorcu użytkowania musiałbyś mieć ogromne szczęście, aby złapać go na gorącym uczynku.
CVn
@ MichaelKjörling, dlatego wspomniałem „po lsmoduruchomieniu”. To zasługuje na rozbudowę, biorąc pod uwagę scenariusz, który podajesz (chociaż z mojego doświadczenia, opóźnienia aparatów są wystarczająco duże, że otwarcie urządzenia, zrobienie zdjęcia i zamknięcie urządzenia zajmuje sporo czasu). Patrząc na użycie urządzenia przy użyciu fuserlub lsofcierpi na ten sam problem; bardziej niezawodne podejście wymagałoby zaczepienia interfejsów API V4L za pomocą tracepoints lub czegoś podobnego.
Stephen Kitt
@ MichaelKjörling Rzeczywiście. Aby uchwycić ten wzorzec użytkowania, należy monitorować dostęp do plików urządzenia, a nie tylko sprawdzać je w jednym momencie.
Gilles „SO- przestań być zły”
7
Zakładając, że tak naprawdę chcesz, aby kamera internetowa nie była używana, gdy nie chcesz , najprostszym rozwiązaniem jest po prostu odłączenie jej (jeśli jest zewnętrzna), gdy nie jest potrzebna. Lub zakrycie kamery internetowej (wystarczy kawałek taśmy izolacyjnej).
Podejścia oparte na fizyce są znacznie bezpieczniejsze niż podejścia programowe.
Taśma nie blokuje mikrofonu, który może (nawet na wbudowanej kamerze internetowej) być częścią kamery, a nie modułu dźwiękowego.
Chris H
Zdecydowanie odradzałbym taśmę klejącą, ponieważ może ona łatwo pozostawić osad. Użyłem taśmy chirurgicznej (dostępnej w aptekach), ponieważ po usunięciu pozostawia bardzo mało pozostałości, z małą naklejką zakrywającą soczewkę, od strony lepkiej do lepkiej. W ten sposób nie ma ryzyka pozostałości kleju na soczewce. Jest to wprawdzie rozwiązanie, które jest nieco trwałe; nie chcesz przez cały czas zdejmować taśmy.
CVn
@ChrisH, co nie ma sensu (jak na ironię, twoje najlepsze SE to angielski ...) Co masz na myśli?
theonlygusti
@ thehelylygusti Miałem na myśli moduł jak w kawałku sprzętu; oczywiście w tym wątku bardziej logiczne byłoby odczytanie go jako oprogramowania, co nie miałoby większego sensu. Taśma nie blokuje mikrofonu. Mikrofon może być częścią sprzętu kamery internetowej, zamiast lub oprócz czegokolwiek podłączonego przez kartę dźwiękową (terminu, którego unikałem ze względu na sprzęt SoC). Aby ustalić, czy kamera internetowa jest włączona / aktywna / szpiegująca, możesz martwić się czymś więcej niż tylko obiektywem. Ale jedynym systemem linux, który tu mam, jest chrombook (crouton), więc trochę ograniczony.
Chris H
1
Jasne, ale nie o to chodziło
Gilles „SO- przestań być zły”
7
W każdym zdrowym systemie, chyba że skonfigurowałeś chrooty z ich własnym /dev, wszystkie pliki urządzeń są poniżej /dev. Tylko root może tworzyć pliki urządzeń, więc nie musisz się martwić, że złośliwi użytkownicy utworzą pliki urządzeń w innym miejscu.
Więc wszystko, co musisz zrobić, to zlokalizować pliki, /devktóre odnoszą się do tego samego urządzenia, które Cię interesuje.
Prawdopodobnie pokaże to tylko /dev/video0. Zwykle dla każdego urządzenia jest jeden plik urządzenia i możliwe są do niego dodatkowe dowiązania symboliczne.
Zatem praktyczna odpowiedź na twoje pytanie jest prosta. Wystarczy sprawdzić, jakie procesy mają otwarty plik urządzenia.
fuser /dev/video0
Jeśli chcesz monitorować dostęp (tzn. Przechwytywać procesy, które mogą otworzyć plik urządzenia w dowolnym momencie), użyj jednej z metod monitorowania dostępu do plików w systemie Linux na plikach urządzenia: skonfiguruj zegarek (i sprawdź, jakie procesy już mają urządzenie) plik (i) otwarte)
inotifywait -m -e open,close /dev/video0 &
sleep 1; fuser /dev/video0 # check for processes that have already opened the device
lub skonfiguruj regułę audytu, która będzie rejestrować dostęp do dzienników systemowych (zwykle /var/log/audit/audit.log)
auditctl -w path=/dev/video0 &
sleep 1; fuser /dev/video0 # check for processes that have already opened the device
Słuszna uwaga! Ale nadal cierpi na problem rozwiązania Angel! W czasie (por. Tam komentarze). Najbardziej niezawodnym rozwiązaniem programowym jest prawdopodobnie umieszczenie tego urządzenia na czarnej liście, udevaby nie pobierało pliku urządzenia podczas uruchamiania; a następnie dodaj plik urządzenia, jeśli i kiedy planujesz korzystać z aparatu ... lub fizycznie go odłącz.
jpaugh
@jpaugh Pytanie dotyczyło znalezienia procesów za pomocą kamery internetowej, a nie jej wyłączenia.
Gilles „SO- przestań być zły”
Powinien być monitorowany na poziomie jądra. Urządzenie można dodać w dowolnym miejscu: np.mknod /root/video0 b 81 0
użytkownik123456
@ j658063.mvrht.com Ale tylko root może to zrobić. Jeśli root nie robi głupich rzeczy, jesteś bezpieczny. Jeśli root robi głupie rzeczy, to i tak masz problemy - root może również zmienić jądro, aby ukryć niektóre procesy.
lsof
(ifuser
) domyślnie nie robi tego, czego potrzebujesz.lsof /dev/video0
chciałbym, aby wszystkie procesy, które trzymały otwarty deskryptor pliku, były podłączone do obiektu vfs jądra,/dev/video0
do którego się odnosi, bez względu na to, która ścieżka systemu plików została użyta do jego otwarcia, ale pytanie OP wyjaśnia, że to nieprawda.Odpowiedzi:
Jeśli twoje jądro korzysta z modułów (co jest wysoce prawdopodobne), jednym ze sposobów ustalenia, czy program uzyskuje dostęp do twojej kamery internetowej, jest sprawdzenie liczby użyć modułu:
0 w trzecim polu pokazuje, że nic nie ma otwartego urządzenia dla
uvcvideo
kontrolowanej kamery internetowej (polsmod
uruchomieniu). Oczywiście musisz dokładnie wiedzieć, który moduł jest odpowiedzialny za twoją kamerę internetową; łatwo to sprawdzić, zobaczysz zmianę wyniku podczas uruchamiania programu takiego jak Cheese.Należy pamiętać, że ściśle mówiąc, dodatnia liczba oznacza tylko, że coś otworzyło urządzenie, nie oznacza to, że przechwytywane są obrazy.
źródło
lsmod
uruchomieniu”. To zasługuje na rozbudowę, biorąc pod uwagę scenariusz, który podajesz (chociaż z mojego doświadczenia, opóźnienia aparatów są wystarczająco duże, że otwarcie urządzenia, zrobienie zdjęcia i zamknięcie urządzenia zajmuje sporo czasu). Patrząc na użycie urządzenia przy użyciufuser
lublsof
cierpi na ten sam problem; bardziej niezawodne podejście wymagałoby zaczepienia interfejsów API V4L za pomocą tracepoints lub czegoś podobnego.Zakładając, że tak naprawdę chcesz, aby kamera internetowa nie była używana, gdy nie chcesz , najprostszym rozwiązaniem jest po prostu odłączenie jej (jeśli jest zewnętrzna), gdy nie jest potrzebna. Lub zakrycie kamery internetowej (wystarczy kawałek taśmy izolacyjnej).
Podejścia oparte na fizyce są znacznie bezpieczniejsze niż podejścia programowe.
źródło
W każdym zdrowym systemie, chyba że skonfigurowałeś chrooty z ich własnym
/dev
, wszystkie pliki urządzeń są poniżej/dev
. Tylko root może tworzyć pliki urządzeń, więc nie musisz się martwić, że złośliwi użytkownicy utworzą pliki urządzeń w innym miejscu.Więc wszystko, co musisz zrobić, to zlokalizować pliki,
/dev
które odnoszą się do tego samego urządzenia, które Cię interesuje.Prawdopodobnie pokaże to tylko
/dev/video0
. Zwykle dla każdego urządzenia jest jeden plik urządzenia i możliwe są do niego dodatkowe dowiązania symboliczne.Zatem praktyczna odpowiedź na twoje pytanie jest prosta. Wystarczy sprawdzić, jakie procesy mają otwarty plik urządzenia.
Jeśli chcesz monitorować dostęp (tzn. Przechwytywać procesy, które mogą otworzyć plik urządzenia w dowolnym momencie), użyj jednej z metod monitorowania dostępu do plików w systemie Linux na plikach urządzenia: skonfiguruj zegarek (i sprawdź, jakie procesy już mają urządzenie) plik (i) otwarte)
lub skonfiguruj regułę audytu, która będzie rejestrować dostęp do dzienników systemowych (zwykle
/var/log/audit/audit.log
)źródło
udev
aby nie pobierało pliku urządzenia podczas uruchamiania; a następnie dodaj plik urządzenia, jeśli i kiedy planujesz korzystać z aparatu ... lub fizycznie go odłącz.mknod /root/video0 b 81 0