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

15

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

Por que, especificamente? Normalmente, tenho vários minttyterminais abertos ao usar o Windows ( minttynão possui guias). O mais estranho é quando preciso encontrar uma janela de terminal iniciada clicando com o botão direito do mouse em "Executar como administrador" quando, por exemplo, quero executar pingou outro procedimento único. Gostaria de indicar visualmente a condição "executar como administrador" da sessão do terminal (alterando a bashvariável de prompt do shell PS1no meu arquivo de inicialização ~/.bashrc).

Algumas soluções potenciais rápidas:

  1. Eu posso comparar o valor de algumas variáveis ​​ambientais. Pela rápida olhada na envsaída, existem muitas diferenças. No entanto, é difícil dizer qual é o mais confiável em termos de portabilidade para outra máquina Windows (talvez executando uma versão diferente do Windows).
  2. id, id -Gnmostra mais especificamente grupos diferentes se executado como administrador. Na minha máquina com Windows 7, tenho Administratorse rootgrupos foram 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 não quero gravar nenhum arquivo em lugares estranhos - isso em alguns cenários imaginados pode ser potencialmente destrutivo (por exemplo, falha na mídia de armazenamento) e isso parece totalmente deselegante para o meu gosto.
  4. Executando algum programa do Windows que indicará por status de retorno ou saída, se o comando for executado "como administrador". O melhor seria alguns com finalidade análoga à do id(1)comando UNIX (mas que existe originalmente no Windows - ou Cygwin, mas sem tradução muito buscada dos conceitos de 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% duplicado do /programming/4051883/batch-script-how-to-check-for-admin-rights/ - a diferença está aqui, em bashvez de usar o Windows (IMHO estranho e arcaico) cmd.exe. Por favor, verifique as respostas e comentários lá.

FooF
fonte
use o "executar como administrador", a menos que você faça isso, o processo não será elevado às permissões de administrador, mesmo que uma conta de administrador inicie o processo. Basta criar um atalho para que isso seja sempre feito.
Ramhound #
1
Eu recomendo experimentar o ConEmu . Possui guias, pode executar a guia como administrador indicado por um ícone diferente na barra de guias e, mais importante, usa o console nos bastidores para que os aplicativos nativos do Windows funcionem corretamente, diferentemente do mintty.
Jan Hudec
2
@ Ramhound Você está certo de que meu problema original (que distingue a janela do terminal do administrador) que eu já havia abordado nesta questão pode ser resolvido com um atalho para minttyque 1. seja executado como administrador, 2. use arquivo de configuração diferente com cores diferentes configurações e 3. usa um ícone alternativo. Se você descrever ao público em geral como criar isso, eu darei um voto positivo (a menos que você diga na sua resposta que isso não pode ser feito dentro de um script :-).
Foof
1
@FooF - Só porque você executa um processo com um usuário no nível de Administrador não significa que o processo em si tenha sido escalado. Por padrão, o Windows escluirá um processo apenas se o usuário aprovar tal ação, portanto, o recurso "executar como administrador" no Windows. Você também pode fornecer TODAS as permissões para QUALQUER grupo que desejar, até o Foogrupo de usuários, se desejar.
Ramhound
1
@FooF - Pense como sudonecessário, mesmo se você estiver executando como usuário root.
Ramhound

Respostas:

9

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
}

Foi adaptado desta resposta /programming//a/11995662/307968 para o shell do cmd do windows. Net Session retorna o status 0 se você for administrador.

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

Darrel Lee
fonte
Bom achado. Embora pareça haver casos extremos onde isso também falha, se você verificar os comentários do stackoverflow.
19416 FooF
No entanto, aceitei esta resposta porque ela aponta para discussões muito abrangentes (a pergunta sobre o stackoverflow e a resposta aceita no momento têm pontuações de 147 e 255, respectivamente).
#
Obrigado! Eu uso isso para colorir seletivamente o nome de usuário no meu prompt. Se a venda for elevada, eu a cor vermelha, caso contrário, verde. Útil para controlar quais cascas são elevadas se você tiver muitas janelas de terminal abertas.
HelloGoodbye 12/02/19
16

A resposta definitiva a esta pergunta vem da lista de discussão 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 Administrador) também está presente às vezes. 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 geralmente deve ser removido se estiver presente, portanto, não é mais recomendável verificar também o grupo 0. Apenas o grupo 544.

Andrew Schulman
fonte
1
Obrigado por perguntar na lista de e-mails da Cygwin. :-) É bom saber que os IDs do grupo (emulados / traduzidos) permanecem constantes entre os sistemas.
Foof
Claro ... eu queria me conhecer, e as pessoas lá sabem .
Andrew Schulman
1
Infelizmente isso não funciona no Mingw / Msys. A resposta de Steven faz, embora apenas no Windows 7.
sparrowt
1
Eu apenas tentei isso (no W7) e não funcionou, mas notei que se o usuário do Windows estiver logado como também administrador, quando o Cygwin for executado como administrador, haverá outro grupo que aparece na idsaída de, nomeadamente 114 (conta local e membro do grupo de administradores). Portanto, o regexp deve ser atualizado para:id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
Cromax
Obrigado. Eu mesmo não vi isso, mas vejo que o grupo 114 parece ser um grupo de Administradores, por isso parece razoável verificar isso também. Eu revi a resposta.
Andrew Schulman
7

Eu uso o valor de retorno do programa Windows at. Também recriei 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 "

Exemplos

Steven
fonte
Supondo que não haja equivalente ao idcomando UNIX no Windows, aceito isso como uma resposta correta. Pelo menos, executar o atcomando sem argumentos não parece ter efeitos colaterais. Vou usar esse método no meu .bashrcarquivo a partir de agora! Obrigado pelo hack.
FooF
1
não parece trabalhar em windows8.1
ZZAPPER
1
@zzapper Por favor, seja mais específico. O que acontece / não acontece? Mensagens de erro?
Steven
4
id retorna mesmos valores, no schtasks.exe utilização está obsoleta vez, mas este funciona se administrador ou não
ZZAPPER
2

id -G | grep -qE '\<(544|0)\>'pareceu não funcionar para mim, pois minha produção não tinha nem <> nem 544, mesmo quando elevada. No entanto, como a elevação é necessária para a gravação %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 aplicado à excelente idéia de Steven de um personagem de 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\] '
Josh
fonte
1

Faça algo que apenas o administrador possa fazer e teste para obter 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
zzapper
fonte
1

No Msys no Windows, tente isso (eu achei a resposta aceita não funcionou no Msys)

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

Isso depende do código de retorno de atzero somente quando executado como administrador.

sparrowt
fonte
1
Esse parece o mesmo método que o @Steven deu na resposta anterior (que parece não funcionar no Windows 8.1 de acordo com um comentário - a menos que o MSYS "at" seja de alguma forma). Enquanto a pergunta era sobre Cygwin, é interessante comparar com MSYS semelhantes. Obrigado pela contribuição.
FooF
Muito parecido sim. No entanto acabei sobre esta questão tentando usá-lo para verificar em um script (Win7, Msys) em vez de definir a festa estilo rápido, então eu pensei que isso poderia ser de utilidade para alguém fazer o mesmo
sparrowt
Eu concordo com a utilidade.
Foof