Come verificare se cygwin mintty / bash viene eseguito come amministratore?


15

Dichiarazione del problema: qual è il modo più elegante e robusto per verificare se la mintty bashsessione Cygwin è "Esegui come amministratore"?

Perché, in particolare? In genere ho diversi minttyterminali aperti quando si utilizza Windows ( minttynon ha schede). Il più imbarazzante è quando ho bisogno di trovare una finestra terminale che ho iniziato facendo clic con il tasto destro del mouse su "Esegui come amministratore" quando, ad esempio, voglio eseguire pingo un'altra procedura singola. Vorrei indicare visivamente "Esegui come amministratore" della sessione del terminale (modificando la bashvariabile del prompt della shell PS1nel mio file di avvio ~/.bashrc).

Alcune soluzioni potenziali rapide:

  1. Posso confrontare il valore di alcune variabili ambientali. Dalla rapida occhiata envall'output ci sono molte differenze. È tuttavia difficile stabilire quale sia il più affidabile in termini di portabilità su un altro computer Windows (forse con una versione diversa di Windows).
  2. id, più specificamente id -Gnmostra gruppi diversi se eseguito come amministratore. Nella mia macchina Windows 7 ho Administratorse rootgruppi aggiunti all'elenco. Ancora una volta, non sono sicuro che sia portatile.
  3. Potrei provare a scrivere un file in una posizione che fallirebbe come normale utente. Ma non voglio scrivere alcun file in posti strani - questo in alcuni scenari immaginati potrebbe essere potenzialmente distruttivo (ad esempio, supporti di archiviazione non funzionanti) e questo sembra assolutamente inelegante per i miei gusti.
  4. Esecuzione di un programma Windows che indicherà lo stato o l'output di ritorno se il comando viene eseguito "come amministratore". Il migliore sarebbe qualcuno con uno scopo analogo a quello del id(1)comando UNIX (ma nativamente esistente in Windows - o Cygwin, ma senza una traduzione troppo estesa dei concetti di sistema di Windows in concetti emulati POSIX).

Qualche suggerimento migliore o più elegante? Forse Cygwin fornisce un'utilità di comando dedicata a questo scopo?

Aggiornamento: duplicato del 97% di /programming/4051883/batch-script-how-to-check-for-admin-rights/ - la differenza è qui usando bashinvece di (IMHO strano e arcaico) Windows cmd.exe. Si prega di controllare le risposte e i commenti lì.


utilizzare "Esegui come amministratore" a meno che non lo si faccia, quindi il processo non viene elevato alle autorizzazioni di amministratore anche se un account amministratore avvia il processo. Basta creare una scorciatoia per farlo sempre.
Ramhound,

1
Consiglio di provare ConEmu . Ha schede, può eseguire la scheda come amministratore indicato da un'icona diversa nella barra delle schede e, soprattutto, utilizza la console dietro le quinte, quindi le applicazioni Windows native funzionano correttamente su di essa, diversamente da Menta.
Jan Hudec,

2
@Ramhound Hai ragione nel dire che il mio problema originale (distinguendo la finestra del terminale dell'amministratore) che avevo già ristretto a questa domanda poteva essere risolto facendo una scorciatoia per minttyquello 1. funziona come amministratore, 2. usa un file di configurazione diverso con colori diversi impostazioni e 3. utilizza un'icona alternativa. Se descrivi al pubblico come creare questo, ti darò un voto (a meno che tu non dica nella tua risposta che non può essere fatto all'interno di uno script :-).
FooF,

1
@FooF - Solo perché si esegue un processo con un utente di livello Amministratore non significa che il processo stesso sia stato intensificato. Windows per impostazione predefinita esclude un processo solo se l'utente approva tale azione, quindi la funzione "Esegui come amministratore" in Windows. Puoi anche fornire TUTTE le autorizzazioni a QUALSIASI gruppo, se lo desideri, anche il Foogruppo di utenti.
Ramhound,

1
@FooF - Basti pensare come sudorichiesto anche se si esegue come utente root.
Ramhound,

Risposte:


9

Ho appena scritto questa funzione per lo stesso motivo. Non so mai quale shell ha i privilegi di amministratore.

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

Si è adattato da questa risposta /programming//a/11995662/307968 per la shell cmd di Windows. Sessione netta restituisce lo stato 0 se si è amministratori.

Ora ho solo bisogno di cambiare il mio prompt, o forse il colore della barra del titolo ....


Bella scoperta. Anche se sembra che ci siano casi limite in cui anche questo fallisce, se controlli i commenti di StackOverflow.
FooF,

Ciononostante ho accettato questa risposta perché indica discussioni molto esaurienti (la domanda StackOverflow e la risposta accettata al momento hanno punteggi rispettivamente di 147 e 255).
FooF

Grazie! Lo uso per colorare selettivamente il nome utente nel mio prompt. Se la vendita è elevata, la colora di rosso, altrimenti il ​​verde. Utile per tenere traccia di quali shell sono elevate se hai molte finestre terminali aperte.
Ciao Arrivederci,

16

La risposta definitiva a questa domanda proviene dalla mailing list di Cygwin . Un processo è in esecuzione con diritti di amministratore se l'utente che lo ha avviato fa parte del gruppo 544 (Amministratori). Sempre dal commento qui sotto di Cromax, sembra che a volte sia presente anche il gruppo 114 (Account locale e membro del gruppo Amministratore). Il test per questi due gruppi è

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

Per esempio,

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

In passato era necessario anche verificare il gruppo 0, il gruppo radice in / etc / group. Ma / etc / group non è più installato in Cygwin e di solito dovrebbe essere rimosso se è presente, quindi non è più consigliabile controllare anche il gruppo 0. Solo il gruppo 544.


1
Grazie per avermelo chiesto nella mailing list di Cygwin. :-) Bello sapere che gli id ​​del gruppo (emulato / tradotto) rimangono costanti tra i sistemi.
FooF

Certo ... Volevo conoscere me stesso e le persone lì lo sanno .
Andrew Schulman,

1
Purtroppo questo non funziona in Mingw / Msys. La risposta di Steven lo fa, sebbene solo su Windows 7.
sparrowt

1
L'ho appena provato (su W7) e non ha funzionato, ma ho notato che se l'utente di Windows viene registrato come anche un amministratore, quando quando Cygwin viene eseguito come amministratore, c'è un altro gruppo che visualizza l' idoutput, ovvero 114 (account locale e membro del gruppo di amministratori). Quindi la regexp dovrebbe essere aggiornata a:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax

Grazie. Non l'ho visto da solo, ma vedo che il gruppo 114 sembra essere un gruppo di amministratori, quindi sembra ragionevole verificarlo anche. Ho rivisto la risposta.
Andrew Schulman,

7

Uso il valore di ritorno del programma Windows at. Ho anche ricreato la funzionalità del personaggio speciale 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 "

Esempi


Supponendo che non vi sia un equivalente del idcomando UNIX in Windows, accetto questo come una risposta corretta. Almeno il atcomando in esecuzione senza argomenti non sembra avere effetti collaterali. Da ora in poi userò questo metodo nel mio .bashrcfile! Grazie per l'hack.
FooF

1
non sembra funzionare su windows8.1
zzapper

1
@zzapper Per favore, sii più specifico. Cosa succede / non succede? Messaggio di errore?
Steven,

4
id restituisce gli stessi valori, a è deprecato usa invece schtasks.exe ma questo funziona se admin o no
zzapper

2

id -G | grep -qE '\<(544|0)\>'non sembrava funzionare per me, poiché la mia uscita non aveva né <> né 544 anche quando elevata. Tuttavia, poiché è richiesto elevazione per scrivere %WINDIR%\system32, l'ho usato per testare l'elevazione con una funzione shell:

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

Quando applicato all'ottima idea di Steven di un personaggio con hash rosso:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '

1

Fai qualcosa che solo l'amministratore potrebbe fare e testare il successo o il fallimento: -

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

o

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

o

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

o

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin

1

In Msys su Windows prova questo (ho trovato che la risposta accettata non funzionava in Msys)

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

Questo si basa sul codice di ritorno di atessere zero solo quando eseguito come amministratore.


1
Questo sembra lo stesso metodo fornito da @Steven nella risposta precedente (che non sembra funzionare su Windows 8.1 secondo un commento - a meno che MSYS "at" non sia in qualche modo). Mentre la domanda riguardava Cygwin, è interessante confrontare con MSYS simili. Grazie per il contributo
FooF

Molto simile sì. Comunque ho finito con questa domanda cercando di usarlo per archiviare uno script (Win7, Msys) piuttosto che impostare lo stile del prompt bash, quindi ho pensato che potesse essere utile a qualcun altro che fa lo stesso
sparrowt

Sono d'accordo sull'utilità.
FooF,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.