44 votes

Il n'y a pas de commande 'sudo' dans Cygwin

Parce qu'il n'y a pas de commande sudo dans Cygwin, les scripts que je veux exécuter échouent avec

./install.sh: ligne N: sudo: commande introuvable

Quelle est la méthode standard pour contourner cela ? Modifier les scripts pour supprimer sudo ? Obtenir un outil similaire à sudo pour Windows ?

35voto

Johan Nilsson Points 1224

Une façon est de créer une fausse commande "sudo" avec le contenu suivant:

#!/usr/bin/bash

"$@"

Cela permettra à install.sh de continuer, car sudo est trouvé.

Cela n'élève pas les privilèges comme le vrai sudo le fait. Si vous avez vraiment besoin de privilèges élevés, lancez le shell cygwin à partir d'un compte avec des privilèges administratifs (XP) ou cliquez-droit sur cygwin.bat et "exécuter en tant qu'administrateur" (Vista, Win7)

26voto

dotancohen Points 10796

J'ai trouvé la réponse sur la liste de diffusion cygwin. Pour exécuter command avec des privilèges élevés dans Cygwin, précédez la commande de cygstart --action=runas comme ceci :

$ cygstart --action=runas command

Cela ouvrira une boîte de dialogue Windows demandant le mot de passe Admin et exécutera la commande si le mot de passe approprié est saisi.

Ceci peut être facilement scripté, tant que ~/bin est dans votre chemin d'accès :

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

$ PATH=$HOME/bin:$PATH
$ chmod +x ~/bin/sudo
$ sudo commandeÉlevée

Testé sur Windows 8 64 bits.

10voto

Sopalajo de Arrierez Points 6265

J'ai écrit le TOUACExt (plutôt simple) pour SUDO pour CygWin, un script shell pré-bêta d'automatisation qui approche du comportement classique de sudo pour Linux:

  • Ouvre et ferme automatiquement sudoserver.py au besoin.
  • Demande une élévation UAC.

L'installation nécessite de copier les quatre scripts .sh dans un répertoire, de créer un alias et quelques étapes supplémentaires détaillées dans le fil de discussion.

Les résultats: vous tapez une seule commande sudo VotreCommande et vous en obtenez la sortie, sans avoir à vous soucier du reste du processus.

5voto

yairchu Points 9694

S'appuyant sur la réponse de dotancohen, j'utilise un alias:

alias sudo="cygstart --action=runas"

Fonctionne à merveille pour les programmes externes (mais pas pour les commandes intégrées du shell):

sudo chown Utilisateur:Groupe

3voto

BO VESTERGAARD Points 1

Sudo (Élever) pour Windows™

Je travaille beaucoup en ligne de commande sur Windows™.

Dans Cygwin lui-même, je crois que vous pouvez exécuter une commande root avec su -c /le/cmd comme pour sudo lui-même dans le système de fichiers Windows™ en élevant les permissions de l'utilisateur depuis la ligne de commande. Si vous êtes administrateur, cela fonctionnera très bien pour vous. Sinon, utilisez runas et obtenez le mot de passe de l'administrateur ;).

Maintenant, je ne me rappelle plus où nous avons obtenu ce code, mais le voici. J'espère que cela vous aidera.

Par ailleurs, le package que nous utilisons pour compiler cela était gcc-mingw32.

$ i586-mingw32msvc-gcc sudo.c -o sudo.exe
# Mettez sudo.exe dans /usr/bin ou dans votre chemin Windows (%homedrive%\windows)
#exemple:
$ sudo vi /cygdrive/c/windows/system32/drivers/etc/hosts

/**
* (sudo pour Windows™)
* @filename sudo.c
*/
#ifndef UNICODE
#define UNICODE
#endif
#include 
#include 
#include 

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("  [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;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X