Como verificar se o cygwin mintty / bash é executado como administrador?

12

Descrição do problema: Qual é a maneira mais elegante e robusta de testar se o Cygwin mintty bash session é "Executar como administrador"?

Por que, especificamente? Eu tenho tipicamente vários mintty terminais abertos ao usar o Windows ( mintty não possui guias). O mais complicado é quando eu preciso encontrar uma janela de terminal que comecei clicando com o botão direito do mouse em "Executar como administrador" quando, por exemplo, eu quero executar ping ou outro procedimento único. Gostaria de indicar visualmente a condição "executar como administrador" da sessão de terminal (alterando a variável de prompt bash shell PS1 no meu arquivo de inicialização ~/.bashrc ).

Algumas soluções potenciais rápidas:

  1. Eu posso comparar o valor de algumas variáveis ambientais. Pela aparência rápida da saída env , há muitas diferenças. No entanto, é difícil dizer qual é a mais confiável em termos de portabilidade para outra máquina Windows (talvez executando uma versão diferente do Windows).
  2. id , mais especificamente id -Gn mostra grupos diferentes se for executado como administrador. Na minha máquina com Windows 7 eu tenho Administrators e root grupos adicionados à lista. Mais uma vez, não tenho certeza se isso é portátil.
  3. Eu poderia tentar gravar um arquivo em um local que falharia como usuário normal. Mas eu não quero escrever nenhum arquivo em lugares estranhos - isso poderia, em alguns cenários imaginários, ser potencialmente destrutivo (por exemplo, falhar na mídia de armazenamento) e isso parece totalmente deselegante para o meu gosto.
  4. Executar algum programa do Windows que indique por status de retorno ou saída se o comando for executado "como administrador". Melhor seria alguns com um propósito análogo ao do comando id(1) do UNIX (mas nativamente existente no Windows - ou no Cygwin, mas sem uma tradução muito distante dos conceitos do sistema Windows para conceitos emulados POSIX).

Alguma sugestão melhor ou mais elegante? Talvez o cygwin forneça um utilitário de comando dedicado para esse fim?

Atualização: 97% de duplicatas de link - a diferença é apenas aqui usando bash em vez de (IMHO estranho e arcaico) Windows cmd.exe . Por favor, verifique as respostas e comentários lá.

    
por FooF 15.10.2013 / 15:12

6 respostas

4

Acabei de escrever esta função pelo mesmo motivo. Eu nunca sei qual shell tem privilégios de administrador.

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

Ele se adaptou desta resposta link para o shell do Windows cmd. A sessão de rede retorna o status 0 se você for administrador.

Agora só preciso alterar meu prompt, ou talvez a cor da barra de título ....

    
por 19.07.2016 / 10:47
13

A resposta definitiva a essa pergunta vem da lista de discussão do Cygwin . Um processo está sendo executado com direitos de Administrador se o usuário que o iniciou fizer parte do grupo 544 (Administradores). Também a partir do comentário abaixo por Cromax, parece que o grupo 114 (conta local e membro do grupo de administradores) às vezes também está presente. O teste para esses dois grupos é

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

Por exemplo,

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

No passado, você também precisava verificar o grupo 0, o grupo raiz em / etc / group. Mas o / etc / group não está mais instalado no Cygwin, e normalmente deve ser removido se estiver presente, portanto não mais recomendado para verificar o grupo 0 também. Apenas o grupo 544.

    
por 06.02.2015 / 18:12
7

Eu uso o valor de retorno do programa do Windows at . Eu também recriou a funcionalidade do caractere especial 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 "

    
por 28.02.2014 / 18:05
2

id -G | grep -qE '\<(544|0)\>' não parece funcionar para mim, pois minha saída não tinha nem < > ou 544, mesmo quando elevado. No entanto, como a elevação é necessária para gravar em %WINDIR%\system32 , usei isso para testar a elevação com uma função de shell:

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

Quando aplicada à excelente ideia de Steven de um caractere hash vermelho:

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '
    
por 02.10.2015 / 19:55
1

Faça algo que apenas o administrador possa fazer e teste para ter sucesso ou falhar: -

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

ou

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

ou

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

ou

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin
    
por 07.10.2014 / 18:12
1

Em Msys no Windows, tente isto (achei que a resposta aceita não funcionou em Msys)

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

Isso depende do código de retorno de at ser zero apenas quando executado como administrador.

    
por 23.04.2015 / 18:12