Usuário root / sudo equivalente no Cygwin?


156

Estou tentando executar um script bash no Cygwin.

Eu recebo Must run as root, i.e. sudo ./scriptnameerros.

chmod 777 scriptname não faz nada para ajudar.

Procurei maneiras de imitar o sudo no Cygwin, para adicionar um usuário root, pois chamar "su" gera o erro su: user root does not exist, qualquer coisa útil, e não encontrei nada.

Alguém tem alguma sugestão?


Olá KenB, você poderia nos dar mais detalhes sobre o whatscript que está tentando executar? Não há equivalente a 'sudo' dentro de um shell cygwin - os direitos são os do usuário win que lançou o shell cygwin; portanto, o link KyleWpppd é bom para evitar erros como "comando sudo unknown". No seu caso, parece um problema específico com o script que você deseja executar.
Stefano

1
Honestamente, esse é um problema antigo, e na verdade não me lembro qual era o script. Obrigado pelo interesse, no entanto.
Ken Bellows

Respostas:


225

Respondi a essa pergunta no SuperUser, mas somente após o OP desconsiderar a resposta inútil que era a única resposta para a pergunta na época.

Aqui está a maneira correta de elevar as permissões no Cygwin, copiadas da minha própria resposta no SuperUser:

Encontrei a resposta na lista de e-mails da Cygwin . Para executar commandcom privilégios elevados no Cygwin, preceda o comando da cygstart --action=runasseguinte maneira:

$ cygstart --action=runas command

Isso abrirá uma caixa de diálogo do Windows solicitando a senha de administrador e execute o comando se a senha apropriada for digitada.

Isso é facilmente script, contanto que ~/binesteja no seu caminho. Crie um arquivo ~/bin/sudocom o seguinte conteúdo:

#!/usr/bin/bash
cygstart --action=runas "$@"

Agora torne o arquivo executável:

$ chmod +x ~/bin/sudo

Agora você pode executar comandos com privilégios reais elevados :

$ sudo elevatedCommand

Pode ser necessário adicionar ~/binao seu caminho. Você pode executar o seguinte comando na Cygwin CLI ou adicioná-lo a ~/.bashrc:

$ PATH=$HOME/bin:$PATH

Testado no Windows 8 de 64 bits.

Você também pode, em vez das etapas acima, adicionar um alias para este comando ~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'

12
Excelente resposta. Com alguns ajustes no seu código do bash (abaixo), consegui executar um comando elevado na linha de comando. Aqui está a alteração que eu precisava para fazer seu código funcionar: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (não consigo descobrir como inserir novas linhas neste comentário, então adicionei '\ n's ao código). O restante do PATH = ... em diante é bom .
precisa saber é o seguinte

3
Ah eu vejo! Se não me engano, essa é a sua maneira de gravar o arquivo no disco, em vez de abrir um editor de texto. Bom obrigado! Eu não sabia como usar heredocs no Bash!
dotancohen

8
O problema disso é que ele cria uma nova janela de terminal (geralmente conhost). A saída não está embutida no terminal atual.
CMCDragonkai

1
A única maneira de executar coisas como lsé envolvê-lo em um processo de execução longa, como mintty ou bash ou zsh também. Mas tudo aparece em um terminal separado. Que neste momento, eu poderia apenas abri-lo via GUI usando o ConEMU.
precisa saber é o seguinte

1
Sem as aspas, até os argumentos citados são divididos em espaços novamente, @katriel. Com as aspas, "$@"expande para algo como "$1" "$2" "$3" ...e sem, $@expande para $1 $2 $3....
Palec 03/10/19

51

Você provavelmente precisará executar o cygwin shell como administrador. Você pode clicar com o botão direito do mouse no atalho e clicar em executar como administrador ou acessar as propriedades do atalho e verificar na seção de compatibilidade. Apenas tenha cuidado ... as permissões de root podem ser perigosas.


1
Nos três anos desde que essa pergunta foi feita sem uma boa resposta, em oposição a esta solução alternativa, eu encontrei a maneira correta de aumentar as permissões para um único comando na janela existente do Cygwin na resposta abaixo. Assim, funciona exatamente como sudono Linux.
dotancohen

Trabalhou para mim no Win10 64. Teve que mudar a propriedade dos arquivos baixados de um servidor com o rsync. chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*. Sem ele, não consegui acessar as pastas e arquivos rsynced.
Lowtechsun 17/09/19

25

Com base na resposta de dotancohen, estou usando um alias:

alias sudo="cygstart --action=runas"

Funciona como um encanto:

sudo chown User:Group <file>

E se você tiver o SysInternals instalado, poderá iniciar um shell de comando como usuário do sistema com muita facilidade

sudo psexec -i -s -d cmd

9

Encontrei sudo-for-cygwin , talvez isso funcione, é um aplicativo cliente / servidor que usa um script python para gerar um processo filho no Windows (pty) e fazer a ponte entre o tty do usuário e o processo de E / S.

Ele requer python no greenlet do Windows e dos módulos Python e eventlet no Cygwin.


Estou usando isso por um tempo agora e ele manipula coisas interativas como o nano sem problemas!
MemphiZ


4

Parece que cygstart/runasnão lida adequadamente"$@" e, portanto, comandos que possuem argumentos contendo espaços (e talvez outros meta-caracteres do shell - não verifiquei) não funcionarão corretamente.

Decidi escrever apenas um pequeno sudoscript que funciona escrevendo um script temporário que executa os parâmetros corretamente.

#! /bin/bash

# If already admin, just run the command in-line.
# This works on my Win10 machine; dunno about others.
if id -G | grep -q ' 544 '; then
   "$@"
   exit $?
fi

# cygstart/runas doesn't handle arguments with spaces correctly so create
# a script that will do so properly.
tmpfile=$(mktemp /tmp/sudo.XXXXXX)
echo "#! /bin/bash" >>$tmpfile
echo "export PATH=\"$PATH\"" >>$tmpfile
echo "$1 \\" >>$tmpfile
shift
for arg in "$@"; do
  qarg=`echo "$arg" | sed -e "s/'/'\\\\\''/g"`
  echo "  '$qarg' \\" >>$tmpfile
done
echo >>$tmpfile

# cygstart opens a new window which vanishes as soon as the command is complete.
# Give the user a chance to see the output.
echo "echo -ne '\n$0: press <enter> to close window... '" >>$tmpfile
echo "read enter" >>$tmpfile

# Clean up after ourselves.
echo "rm -f $tmpfile" >>$tmpfile

# Do it as Administrator.
cygstart --action=runas /bin/bash $tmpfile

1
a resposta aceita não funcionou para mim no Win7, mas essa resposta funcionou como um encanto. Consegui configurar o exim-config com privs elevados e depois vim-edite o arquivo /etc/exim.conf posteriormente. Liso.
Nanker

2

Esta resposta é baseada em outra resposta . Primeiro, verifique se sua conta está no grupo Administradores.

Em seguida, crie um arquivo genérico "runas-admin.bat" com o seguinte conteúdo:

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0" %*
    @goto :EOF
)
FOR %%A IN (%*) DO (
    "%%A"
)
@goto :EOF
@end @ELSE
args = WScript.Arguments;
newargs = "";
for (var i = 0; i < args.length; i++) {
    newargs += "\"" + args(i) + "\" ";
}
ShA=new ActiveXObject("Shell.Application");
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+" "+newargs+"\"","","runas",5);
@end

Em seguida, execute o arquivo em lotes assim:

./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

Por exemplo:

./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add"

Apenas certifique-se de colocar cada comando separado entre aspas duplas. Você receberá o prompt do UAC apenas uma vez usando esse método e esse procedimento foi generalizado para que você possa usar qualquer tipo de comando.


2

Uma nova proposta para aprimorar o SUDO para CygWin do GitHub neste segmento , chamado TOUACExt :

  • Abre automaticamente o sudoserver.py.
  • Fecha automaticamente sudoserver.py após o tempo limite (padrão de 15 minutos).
  • Solicitar prompt de elevação do UAC Sim / Não, para usuários administrativos.
  • Solicite usuário / senha de administrador para usuários não administradores.
  • Funciona remotamente (SSH) com contas de administrador.
  • Cria log.

Ainda na pré-beta , mas parece estar funcionando.


1

Cheguei aqui pelo google e, na verdade, acredito que encontrei uma maneira de obter um prompt de raiz totalmente funcional no cygwin.

Aqui estão os meus passos.

Primeiro você precisa renomear a conta de administrador do Windows para "root" Faça isso abrindo start manu e digitando "gpedit.msc"

Edite a entrada em Diretiva do computador local> Configuração do computador> Configurações do Windows> Configurações de segurança> Diretivas locais> Opções de segurança> Contas: renomear conta de administrador

Você precisará habilitar a conta se ela ainda não estiver ativada. Política do Computador Local> Configuração do Computador> Configurações do Windows> Configurações de Segurança> Diretivas Locais> Opções de Segurança> Contas: Status da conta do Administrador

Agora saia e entre na conta root.

Agora defina uma variável de ambiente para o cygwin. Para fazer isso da maneira mais fácil: Clique com o botão direito em Meu Computador> Propriedades

Clique (na barra lateral esquerda) "Configurações avançadas do sistema"

Perto da parte inferior, clique no botão "Variáveis ​​ambientais"

Em "Variáveis ​​do sistema", clique no botão "Novo ..."

Para o nome, coloque "cygwin" sem as aspas. Para o valor, digite seu diretório raiz cygwin. (O meu era C: \ cygwin)

Pressione OK e feche tudo isso para voltar à área de trabalho.

Abra um terminal Cygwin (cygwin.bat)

Edite o arquivo / etc / passwd e altere a linha

Administrador : não utilizado: 500: 503 : U- MACHINE \ Administrator , S-1-5-21-12345678-1234567890-1234567890- 500: / home / Administrador : / bin / bash

Para isso (seus números e nome da máquina serão diferentes, apenas altere os números destacados para 0!)

root : não utilizado: 0: 0 : U- MACHINE \ root , S-1-5-21-12345678-1234567890-1234567890- 0: / root : / bin / bash

Agora que tudo está terminado, este próximo bit fará o comando "su" funcionar. (Não perfeitamente, mas funcionará o suficiente para usar. Não acho que os scripts funcionem corretamente, mas ei, você chegou até aqui, talvez possa encontrar o caminho. E, por favor, compartilhe)

Execute este comando no cygwin para finalizar o negócio.

mv /bin/su.exe /bin/_su.exe_backup
cat > /bin/su.bat << "EOF"
@ECHO OFF
RUNAS /savecred /user:root %cygwin%\cygwin.bat
EOF
ln -s /bin/su.bat /bin/su
echo ''
echo 'All finished'

Faça logout da conta raiz e volte para a sua conta de usuário normal do Windows.

Depois de tudo isso, execute o novo "su.bat" manualmente clicando duas vezes no explorer. Digite sua senha e vá em frente e feche a janela.

Agora tente executar o comando su do cygwin e veja se tudo deu certo.


1

Insatisfeito com a solução disponível, adotei o script do nu774 para adicionar segurança e facilitar a instalação e o uso. O projeto está disponível no Github

Para usá-lo, basta fazer o download cygwin-sudo.pye executá-lo via python3 cygwin-sudo.py **yourcommand**.

Você pode configurar um alias por conveniência:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"

0

Use isso para obter uma janela de administrador com o bash ou o cmd em execução, a partir de qualquer menu de contexto de diretórios. Basta clicar com o botão direito do mouse no nome de um diretório e selecionar a entrada ou pressionar o botão direito do mouse.

Isso é baseado na ferramenta chere e, infelizmente, não está funcionando (para mim) no link_boy. Funciona bem para mim usando o Windows 8,

Um efeito colateral é a cor diferente na janela do cmd do administrador. Para usar isso no bash, você pode alterar o arquivo .bashrc do usuário administrador.

Eu não consegui obter a versão "background" (clique com o botão direito do mouse em um diretório aberto) para executar. Sinta-se livre para adicioná-lo.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="&Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="C:\\cygwin\\bin\\bash -c \"/bin/xhere /bin/bash.exe '%L'\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root]
@="&Root Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root\command]
@="runas /savecred /user:administrator \"C:\\cygwin\\bin\\bash -c \\\"/bin/xhere /bin/bash.exe '%L'\\\"\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd]
@="&Command Prompt Here"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd\command]
@="cmd.exe /k cd %L"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root]
@="Roo&t Command Prompt Here"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root\command]
@="runas /savecred /user:administrator \"cmd.exe /t:1E /k cd %L\""

0

Uma maneira muito simples de ter um shell cygwin e sub-shell correspondentes para operar com privilégios de administrador é alterar as propriedades do link que abre o shell inicial.

O seguinte é válido para o Windows 7 ou superior (talvez também para versões anteriores, mas não marquei)

Normalmente começo o shell cygwin a partir de um link cygwin no início botão (ou na área de trabalho). Então, mudei as propriedades do link cygwin nas abas

/ Compatibilidade / Nível de privilégio /

e marquei a caixa,

"Execute este programa como administrador"

Isso permite que o shell cygwin seja aberto com privilégios de administrador e os subshells correspondentes também.


O único pequeno problema é que você não pode dizer se ele foi aberto como administrador.
Edwin Pratt

0

Eu conheci essa discussão procurando alguns detalhes sobre a sudoimplementação em diferentes sistemas operacionais. Ao ler, descobri que a solução por @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) é útil, mas pode ser melhorada um pouco. Evitei criar o arquivo temporário e implementei para executar tudo pelo script único.

Também investiguei a próxima etapa da melhoria na saída na única janela / console. Infelizmente, sem sucesso. Tentei usar pipes nomeados para capturar STDOUT / STDERR e imprimir na janela principal. Mas o processo filho não gravou em pipes nomeados. No entanto, a gravação em um arquivo regular funciona bem.

Eu desisti de todas as tentativas de encontrar a causa raiz e deixei a solução atual como está. Espero que meu post possa ser útil também.

Melhorias:

  • nenhum arquivo temporário
  • sem analisar e reconstruir as opções da linha de comandos
  • aguarde o comando elevado
  • use minttyou bash, se o primeiro não for encontrado
  • retornar o código de saída do comando
    #! / bin / bash

    # Sendo Administradores, chame o comando diretamente
    id -G | grep -qw 544 && {
        "$ @"
        sair $?
    }

    # A variável CYG_SUDO é usada para controlar a chamada do comando
    [-z "$ CYG_SUDO"] && {
        mintty = "$ (que mintty 2> / dev / null)"
        exportar CYG_SUDO = "$$"
        cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
        sair $?
    }

    # Agora somos capazes de:
    # - inicia o comando
    # - exibe a mensagem
    # - retorna o código de saída
    "$ @"
    RETVAL = $?

    eco "$ 0: Pressione para fechar a janela ..."
    ler

    exit $ RETVAL


Como cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"não quebra se houver espaços em um argumento? Sempre fazia isso quando eu passava por cygstart / runas.
Brian White

0

Com base na resposta de @ mat-khor, peguei o syswin su.exe, salvei como manufacture-syswin-su.exee escrevi esse script de wrapper. Ele lida com o redirecionamento dos comandos stdout e stderr, para que possa ser usado em um canal, etc. Além disso, o script é encerrado com o status do comando fornecido.

Limitações:

  • As opções syswin-su estão atualmente codificadas para usar o usuário atual. A prefixação env USERNAME=...da chamada de script a substitui. Se outras opções fossem necessárias, o script teria que distinguir entre syswin-su e argumentos de comando, por exemplo, divisão no primeiro --.
  • Se o prompt do UAC for cancelado ou recusado, o script travará.

.

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 2>&1 | perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")

-1

Não posso testar completamente isso sozinho, não tenho um script adequado para testá-lo e não sou especialista em Linux, mas você pode ser capaz de hackear algo perto o suficiente.

Eu tentei essas etapas e elas parecem funcionar, mas não sei se será suficiente para suas necessidades.

Para contornar a falta de um usuário 'root':

  • Crie um usuário na máquina LOCAL do Windows chamada 'root', torne-o membro do grupo 'Administrators'
  • Marque o bin / bash.exe como 'Executar como administrador' para todos os usuários (obviamente, você precisará ativar / desativar isso quando necessário)
  • Mantenha pressionado o botão Shift esquerdo no Windows Explorer enquanto clica com o botão direito no arquivo Cygwin.bat
  • Selecione 'Executar como um usuário diferente'
  • Digite. \ Root como o nome de usuário e, em seguida, sua senha.

Em seguida, você é executado como um usuário chamado 'root' no cygwin, que, juntamente com o 'Executar como administrador' no arquivo bash.exe, pode ser suficiente.

No entanto, você ainda precisa de um sudo.

Eu fingi isso (e alguém com mais conhecimento de linux provavelmente pode fingir melhor) criando um arquivo chamado 'sudo' em / bin e usando esta linha de comando para enviar o comando para su:

su -c "$*"

A linha de comando 'sudo vim' e outras parecem funcionar bem para mim, então você pode tentar.

Fique interessado em saber se isso funciona ou não para suas necessidades.


-1

O que costumo fazer é ter um auxiliar de registro "Abrir aqui" para abrir um shell cygwin com privilégios administrativos bastante fáceis de qualquer lugar do meu computador.

Esteja ciente de que você precisa ter o pacote "chere" do cygwin instalado, use " chere -i -m" primeiro de um shell cygwin elevado.

Supondo que sua instalação do cygwin esteja em C: \ cygwin ...

Aqui está o código do registro:

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

Espero que isto ajude. Deixe-me saber se funciona para você. Obrigado.

PS: Você pode pegar esse código, copiar e colar e salvá-lo em um arquivo name.reg para executá-lo ... ou você pode adicionar manualmente os valores.


-5

Experimentar:

chmod -R ug+rwx <dir>

onde <dir>é o diretório no qual você deseja alterar as permissões.


5
Como isso o fará torcer, como ele pede?
Nikana Reklawyks
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.