Jak sprawdzić, czy cygwin mintty / bash jest uruchamiany jako administrator?

15

Opis problemu: Jaki jest najbardziej elegancki i niezawodny sposób na sprawdzenie, czy mintty bashsesja Cygwin to „Uruchom jako administrator”?

Dlaczego konkretnie? Zazwyczaj mam kilka minttyotwartych terminali podczas korzystania z systemu Windows ( minttynie ma zakładek). Najbardziej niezręczne jest, gdy muszę znaleźć okno terminala, które uruchomiłem, klikając prawym przyciskiem myszy „Uruchom jako administrator”, gdy na przykład chcę uruchomić pinglub inną jednorazową procedurę. Chciałbym wskazać wizualnie „uruchom jako administrator” sesji terminala (zmieniając bashzmienną zachęty powłoki PS1w moim pliku startowym ~/.bashrc).

Kilka szybkich potencjalnych rozwiązań:

  1. Potrafię porównać wartość niektórych zmiennych środowiskowych. Po szybkim spojrzeniu na envwynik jest dość wiele różnic. Trudno jednak stwierdzić, która z nich jest najbardziej niezawodna pod względem możliwości przenoszenia na inny komputer z systemem Windows (być może z inną wersją systemu Windows).
  2. id, dokładniej id -Gnpokazuje różne grupy, jeśli są uruchamiane jako administrator. Na moim komputerze z systemem Windows 7 mam Administratorsi rootgrupy dodane do listy. Ponownie nie jestem pewien, czy jest to przenośne.
  3. Mógłbym spróbować zapisać plik w lokalizacji, która zawiodłaby jako normalny użytkownik. Ale nie chcę zapisywać żadnych plików w dziwnych miejscach - w niektórych wyobrażonych scenariuszach może to być potencjalnie destrukcyjne (np. Awaria nośników pamięci) i wydaje mi się to zupełnie nieeleganckie.
  4. Uruchamianie jakiegoś programu Windows, który wskaże status powrotu lub wyjście, jeśli polecenie zostanie uruchomione „jako administrator”. Najlepsze byłyby takie, które mają analogiczny cel jak id(1)polecenie UNIX (ale natywnie istnieje w Windows - lub Cygwin, ale bez zbyt daleko idącego tłumaczenia koncepcji systemu Windows na emulowane przez POSIX).

Jakieś lepsze lub bardziej eleganckie sugestie? Być może cygwin udostępnia narzędzie poleceń przeznaczone do tego celu?

Aktualizacja: 97% duplikat /programming/4051883/batch-script-how-to-check-for-admin-rights/ - różnica polega tylko na zastosowaniu bashzamiast (dziwnego i archaicznego systemu Windows) cmd.exe. Sprawdź tam odpowiedzi i komentarze.

FooF
źródło
użyj opcji „uruchom jako administrator”, chyba że to zrobisz, wówczas proces nie zostanie podniesiony do uprawnień administratora, nawet jeśli konto administratora rozpocznie proces. Wystarczy utworzyć skrót, aby zawsze tak było.
Ramhound
1
Polecam wypróbowanie ConEmu . Ma zakładki, może uruchamiać kartę jako administrator wskazany inną ikoną na pasku kart i co najważniejsze używa konsoli za sceną, więc natywne aplikacje Windows działają na niej poprawnie, w przeciwieństwie do mennicy.
Jan Hudec
2
@Ramhound Masz rację, że mój pierwotny problem (rozróżnienie okna terminala administratora), który już zawęziłem do tego pytania, można rozwiązać, wykonując skrót do minttytego 1. działa jako administrator, 2. używa innego pliku konfiguracyjnego o różnych kolorach ustawienia i 3. używa alternatywnej ikony. Jeśli opiszesz ogółowi społeczeństwa, jak to stworzyć, dam ci głos uprzywilejowany (chyba że w odpowiedzi odpowiesz, że nie można tego zrobić w skrypcie :-).
FooF
1
@FooF - Tylko dlatego, że uruchamiasz proces z użytkownikiem na poziomie administratora, nie oznacza, że ​​sam proces został eskalowany. System Windows domyślnie oceni proces tylko wtedy, gdy użytkownik zatwierdzi takie działanie, stąd funkcja „uruchom jako administrator” w systemie Windows. Możesz także dostarczyć WSZYSTKIE uprawnienia do DOWOLNEJ grupy, w której chcesz, nawet do Foogrupy użytkowników, jeśli chcesz.
Ramhound,
1
@FooF - Pomyśl, sudoco jest wymagane, nawet jeśli działasz jako użytkownik root.
Ramhound,

Odpowiedzi:

9

Właśnie napisałem tę funkcję z tego samego powodu. Nigdy nie wiem, która powłoka ma uprawnienia administratora.

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

Zaadaptował z tej odpowiedzi /programming//a/11995662/307968 dla powłoki cmd systemu Windows. Net Session zwraca 0, jeśli jesteś administratorem.

Teraz muszę tylko zmienić monit, a może kolor paska tytułu ....

Darrel Lee
źródło
Niezłe znalezisko. Chociaż zdarzają się przypadki skrajne, w których to też się nie udaje, jeśli sprawdzisz komentarze dotyczące przepływu stosu.
FooF,
Niemniej jednak zaakceptowałem tę odpowiedź, ponieważ wskazuje ona na bardzo obszerne dyskusje (pytanie o przepełnienie stosu i tam zaakceptowana odpowiedź mają obecnie wyniki odpowiednio 147 i 255).
FooF,
Dzięki! Używam tego, aby wybiórczo pokolorować nazwę użytkownika w moim monicie. Jeśli sprzedaż jest podwyższona, koloruję na czerwono, w przeciwnym razie na zielono. Przydatne do śledzenia, które powłoki są podniesione, jeśli masz otwartych wiele okien terminali.
HelloGoodbye
16

Ostateczna odpowiedź na to pytanie pochodzi z listy mailingowej Cygwin . Proces jest uruchamiany z uprawnieniami administratora, jeśli użytkownik, który go uruchomił, należy do grupy 544 (Administratorzy). Również z poniższego komentarza Cromax wydaje się, że grupa 114 (konto lokalne i członek grupy administratora) również czasami jest obecna. Test dla tych dwóch grup jest

id -G | grep -qE '\<(114|544)\>'

Na przykład,

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

W przeszłości musiałeś także sprawdzać, czy jest grupa 0, grupa główna w / etc / group. Ale / etc / group nie jest już zainstalowany w Cygwin i zwykle powinien zostać usunięty, jeśli jest obecny, więc nie jest już zalecane sprawdzanie grupy 0. Tylko grupa 544.

Andrew Schulman
źródło
1
Dziękujemy za pytanie na liście mailingowej Cygwin. :-) Miło wiedzieć, że (emulowany / przetłumaczony) identyfikator grupy pozostaje stały między systemami.
FooF,
Jasne ... Chciałem poznać siebie, a ludzie tam znają .
Andrew Schulman,
1
Niestety nie działa to w Mingw / Msys. Odpowiedź Stevena brzmi, chociaż tylko w systemie Windows 7.
sparrowt
1
Właśnie tego próbowałem (na W7) i to nie działało, ale zauważyłem, że jeśli użytkownik Windows jest zalogowany jako administrator, to kiedy Cygwin jest uruchamiany jako administrator, istnieje inna grupa, która pojawia się w wynikach id, a mianowicie 114 (konto lokalne i członek grupy administratora). Dlatego id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
wyrażenie regularne
Dzięki. Sam tego nie widziałem, ale widzę, że grupa 114 wydaje się być grupą Administratorów, więc rozsądne wydaje się jej sprawdzenie. Poprawiłem odpowiedź.
Andrew Schulman,
7

Korzystam z wartości zwracanej programu Windows at. Odtworzyłem również funkcjonalność znaku specjalnego PROMPTING \$.

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

Przykłady

Steven
źródło
Zakładając, że idw systemie Windows nie ma odpowiednika polecenia UNIX , akceptuję to jako poprawną odpowiedź. Przynajmniej uruchomienie atpolecenia bez żadnych argumentów nie wydaje się mieć żadnych skutków ubocznych. Odtąd będę używać tej metody w moim .bashrcpliku! Dzięki za włamanie.
FooF
1
nie działa na Windows 8.1
zzapper
1
@zzapper Bądź bardziej szczegółowy. Co się dzieje / nie dzieje? Komunikaty o błędach?
Steven
4
id zwraca te same wartości, at jest przestarzałe, zamiast tego użyj schtasks.exe, ale działa to niezależnie od tego, czy admin, czy nie
zzapper
2

id -G | grep -qE '\<(544|0)\>'nie działało dla mnie, ponieważ mój wynik nie miał ani <>, ani 544, nawet gdy był podwyższony. Ponieważ jednak do zapisu jest wymagane podniesienie uprawnień %WINDIR%\system32, użyłem go do przetestowania podniesienia uprawnień za pomocą funkcji powłoki:

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

W przypadku doskonałego pomysłu Stevena na postać z czerwonym haszem:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '
Josh
źródło
1

Zrób coś, co tylko administrator może zrobić i przetestować pod kątem sukcesu lub niepowodzenia: -

if touch c:/Users/.x ; then  echo 'ok'  ; fi

lub

touch c:/Users/.x && echo ok

lub

touch c:/Users/.x && \rm c:/Users/.x && echo ok

lub

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin
zzapper
źródło
1

W Msys na Windows spróbuj tego (okazało się, że zaakceptowana odpowiedź nie działa w Msys)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

Zależy to od tego, czy kod powrotu atwynosi zero tylko podczas działania jako administrator.

wróbel
źródło
1
Wydaje się, że jest to ta sama metoda, co @Steven podana we wcześniejszej odpowiedzi (która wydaje się nie działać w systemie Windows 8.1 zgodnie z komentarzem - chyba że MSYS „at” jest w jakiś sposób). Chociaż pytanie dotyczyło Cygwina, interesujące jest porównanie z podobnym MSYS. Dzięki za wkład.
FooF
Bardzo podobne tak. Skończyło się na tym pytaniu, próbując użyć go do sprawdzenia skryptu (Win7, Msys), zamiast ustawiać styl zachęty, więc pomyślałem, że może to być przydatne dla kogoś, kto robi to samo
sparrowt 24.04.15
Zgadzam się co do przydatności.
FooF