40

Поскольку в Cygwin нет команды sudo, скрипты, с которыми я хочу работать, не работают

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

Какой стандартный способ обойти это? Редактирование скриптов для удаления sudo? Приобретаете какой-нибудь sudo подобный инструмент для Windows?

6 ответов6

34

Один из способов - создать поддельную команду "sudo" со следующим содержимым:

#!/usr/bin/bash

"$@"

Это позволит install.sh продолжать, потому что Судо найден.

Это не повышает привилегии, как это делает настоящий sudo. Если вам действительно нужны повышенные привилегии, запустите оболочку Cygwin с учетной записью с правами администратора (XP) или щелкните правой кнопкой мыши на cygwin.bat и "запустите от имени администратора" (Vista, Win7).

21

Я нашел ответ в списке рассылки cygwin. Чтобы запустить command с повышенными привилегиями в Cygwin, перед командой cygstart --action=runas например:

$ cygstart --action=runas command

Откроется диалоговое окно Windows, запрашивающее пароль администратора, и запустите команду, если введен правильный пароль.

Это легко написать в сценарии, если ~/bin находится на вашем пути:

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

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

Протестировано на 64-битной Windows 8.

8

Я написал (довольно простой) TOUACExt для SUDO для CygWin, автоматизацию сценариев до бета-версии оболочки, которая подходит к поведению классического sudo для Linux:

  • Открывается и закрывается автоматически sudoserver.py при необходимости.
  • Запрашивает UAC Elevation Prompt.

Для установки требуется скопировать четыре сценария .sh в какой-либо каталог пути, создать псевдоним и еще несколько шагов, подробно описанных в теме.

Результаты: вы набираете одну sudo YourCommand и получаете ее вывод, не беспокоясь об остальной части процесса.

5

Основываясь на ответе dotancohen, я использую псевдоним:

alias sudo="cygstart --action=runas"

Работает как брелок для внешних программ (но не встроенных в оболочку):

sudo chown User:Group <file>
3

Sudo (Elevate) для Windows ™

Я много работаю над командной строкой в Windows ™.

Я считаю, что в самом Cygwin вы можете запускать команду root с помощью su -c /the/cmd как и для самого sudo, в файловой системе Windows ™, повышая права пользователя из командной строки. Если вы являетесь администратором, это будет отлично работать для вас , В противном случае используйте runas и получите пароль администратора;).

Теперь я не могу вспомнить, откуда у нас этот код, но вот он. Я надеюсь, что это помогает.

Кстати, пакет, который мы используем для компиляции, был 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;
}
2

Небольшое улучшение псевдо-сценария Пеона :

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

"$@"

Этот скрипт молча отбрасывает все параметры, переданные в sudo, и выполняет команду (фактически не повышая привилегии). Отбрасывание параметров несколько улучшает совместимость. Более полный скрипт-обертка должен фактически анализировать параметры так же, как это делает sudo.

Вместо того, чтобы пытаться заменить sudo на оболочку, которая выполняет cygstart --action=runas "$@" , просто используйте эту простую поддельную оболочку sudo и запустите сам скрипт установки (или все, что вы пытаетесь запустить с использованием sudo) с повышенными правами. привилегии.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .