Não há comando 'sudo' no Cygwin

40

Porque não há comando sudo em Cygwin , os scripts que quero executar falham com

./install.sh: line N: sudo: command not found

Qual é o caminho padrão para contornar isso? Editando os scripts para remover sudo ? Obtendo uma ferramenta parecida com sudo para o Windows?

    
por Jason Sundram 21.03.2010 / 18:45

6 respostas

8

Eu escrevi o (bastante simples) TOUACExt para SUDO para CygWin , uma automação de script de shell pré-beta que abordagens para o comportamento do clássico sudo para o Linux:

  • Abre e fecha automaticamente sudoserver.py quando necessário.
  • Solicita o prompt de elevação UAC .
A

Instalação requer a cópia dos quatro scripts .sh para algum diretório de caminho, criando um alias e apenas mais alguns passos detalhados no encadeamento.

Os resultados : você digita um único sudo YourCommand e obtém a saída dele, sem precisar se preocupar com o restante do processo.

    
por 14.04.2014 / 02:41
34

Uma maneira é criar um comando falso "sudo" com o seguinte conteúdo:

#!/usr/bin/bash

"$@"

Isso permitirá que o install.sh continue, porque o sudo é encontrado.

Isso não eleva privilégios como o verdadeiro sudo. Se você realmente precisa de privilégios elevados, inicie o cygwin shell a partir de uma conta com privilégios administrativos (XP) ou clique em cygwin.bat e "executar como administrador" (Vista, Win7)

    
por 21.03.2010 / 19:17
21

Encontrei a resposta na lista de discussão do cygwin . Para executar command com privilégios elevados no Cygwin, preceda o comando com cygstart --action=runas da seguinte forma:

$ cygstart --action=runas command

Isso abrirá uma caixa de diálogo do Windows solicitando a senha do Admin e executará o comando se a senha correta for digitada.

Isso é facilmente roteirizado, desde que ~/bin esteja em seu caminho:

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

$ PATH=$HOME/bin:$PATH
$ chmod +x ~/bin/sudo
$ sudo elevatedCommand

Testado no Windows 8 de 64 bits.

    
por 09.01.2014 / 16:25
5

Aproveitando a resposta do dotancohen Estou usando um alias:

alias sudo="cygstart --action=runas"

Funciona como um charme para programas externos (não embutidos no shell, no entanto):

sudo chown User:Group <file>
    
por 16.01.2016 / 13:58
3

Sudo (Elevate) para Windows ™

Eu faço muito trabalho na linha de comando no Windows ™.

No próprio Cygwin, acredito que você pode executar um comando root com su -c /the/cmd para o próprio sudo no sistema de arquivos do Windows ™ elevando as permissões do usuário na linha de comando. Se você for um administrador, isso funcionará muito bem para você. Caso contrário, use runas e obtenha o passe do admin;).

Agora não consigo me lembrar de onde pegamos esse código, mas aqui está. Espero que ajude.

BTW, o pacote que usamos para compilar isso foi gcc-mingw32 .

$ i586-mingw32msvc-gcc sudo.c -o sudo.exe
# Put sudo.exe in /usr/bin or in your windows path (%homedrive%\windows)
#example:
$ sudo vi /cygdrive/c/windows/system32/drivers/etc/hosts

/**
* (sudo for Windows™)
* @filename sudo.c
*/
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <shellapi.h>
#include <wchar.h>


LPWSTR *mergestrings(LPWSTR *left, LPCWSTR right)
{
    size_t size = ( 1 + lstrlen(*left) + lstrlen(right) ) * sizeof(LPWSTR*);
    if ( *left ) {
        LPWSTR leftcopy = _wcsdup(*left);
        *left = (LPWSTR)realloc(*left, size);
        *left = lstrcpy(*left, leftcopy);
        *left = lstrcat(*left, right);
        free( leftcopy );
    }
    else
        *left = _wcsdup(right);
    return left;
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE prevInstance, LPSTR lpcommand, int nShowCmd)
{
    DWORD result = 0x2a;
    LPWSTR *argv = NULL;
    int argc = 0;
    if ( argv = CommandLineToArgvW(GetCommandLineW(), &argc) ) {
        if ( argc < 2 ) {
            LPWSTR usagemsg = NULL;
            usagemsg = *mergestrings(&usagemsg, argv[0]);
            usagemsg = *mergestrings(&usagemsg, TEXT(" <command_to_run> [arguments]"));
            MessageBox(NULL, usagemsg, TEXT("Usage:"), MB_OK | MB_ICONEXCLAMATION );
            LocalFree( argv );
            free( usagemsg );
            return ERROR_BAD_ARGUMENTS;
        }
        else {
            LPWSTR command = argv[1];
            LPWSTR arguments = NULL;
            int c;
            for ( c = 2; c < argc; c++ ) {
                arguments = *mergestrings(&arguments, argv[c]);
                arguments = *mergestrings(&arguments, TEXT(" "));
            }
            result = (DWORD)ShellExecute(NULL, TEXT("runas"), command, arguments, NULL, SW_SHOWNORMAL);
            LocalFree( argv );
            if ( arguments )
                free( arguments );
            switch ( result )
            {
                case 0:
                    result = ERROR_OUTOFMEMORY;
                    break;

                case 27:
                case 31:
                    result = ERROR_NO_ASSOCIATION;
                    break;

                case 28:
                case 29:
                case 30:
                    result = ERROR_DDE_FAIL;
                    break;
                case 32:
                    result = ERROR_DLL_NOT_FOUND;
                    break;
                default:
                    if ( result > 32 )
                        result = 0x2a;
            }
        }
    }
    else
        result = GetLastError();

    if (result != 0x2a) {
        LPWSTR errormsg = NULL;
        FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
                      NULL, result, 0, (LPWSTR)&errormsg, 0, NULL);
        MessageBox(NULL, errormsg, TEXT("Error:"), MB_OK | MB_ICONERROR);
        LocalFree( errormsg );
        return result;
    }
    else
        return NO_ERROR;
}
    
por 13.02.2012 / 17:16
2

Uma ligeira melhoria no script fake sudo de Peon:

#!/bin/sh
# Drop any option arguments.
while [[ $# -ge 0 && $1 = -* ]]; do
  shift
done

"$@"

Esse script silenciosamente elimina quaisquer opções passadas para o sudo e executa o comando (sem realmente elevar os privilégios). Eliminar as opções melhora um pouco a compatibilidade. Um script wrapper mais completo deve realmente analisar as opções da mesma maneira que o sudo faz.

Em vez de tentar substituir sudo por um wrapper que use cygstart --action=runas "$@" , use este invólucro fake sudo simples e execute o próprio script de instalação (ou o que estiver tentando executar usando o sudo ) com privilégios elevados.

    
por 20.04.2016 / 17:18