Cygwin에는 ‘sudo’명령이 없습니다. 실행하려는 스크립트가 실패합니다. ./install.sh: line

Cygwin 에는 sudo 명령 이 없으므로 실행하려는 스크립트가 실패합니다.

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

이 문제를 해결하는 표준 방법은 무엇입니까? 스크립트를 편집 제거하려면 sudo? 일부 얻기 sudoWindows 용 -like 도구를?



답변

필자는 Linux 의 고전적인 동작에 접근하는 사전 베타 쉘 스크립트 자동화 인 CygWinSUDO 용 TOUACExt를 작성했다 . sudo

  • 필요할 때 자동으로 sudoserver.py를 열고 닫습니다 .
  • UAC 고도 프롬프트를 요청합니다 .

설치 하려면 4 개의 .sh스크립트를 일부 경로 디렉토리에 복사하여 별명을 작성하고 스레드에 대해 몇 단계 만 더 수행하면됩니다.

결과 : 단일 sudo YourCommand프로세스를 입력하고 나머지 프로세스에 대해 걱정할 필요없이 결과를 얻습니다.


답변

한 가지 방법은 다음 내용으로 가짜 “sudo”명령을 작성하는 것입니다.

#!/usr/bin/bash

"$@"

이것은 허용 할 install.shsudo를 찾을 수 있기 때문에, 계속.

이것은 실제 sudo처럼 권한을 높이 지 않습니다. 관리자 권한이 필요한 경우 관리자 권한 (XP) 계정으로 cygwin 셸을 시작하거나 cygwin.bat를 r- 클릭하고 관리자 권한으로 실행” (Vista, Win7)


답변

cygwin 메일 링리스트 에서 답을 찾았습니다 . commandCygwin에서 높은 권한으로 실행하려면 다음 과 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에서 테스트되었습니다.


답변

dotancohen의 답변바탕 으로 별칭을 사용하고 있습니다.

alias sudo="cygstart --action=runas"

셸 내장이 아닌 외부 프로그램의 매력으로 작동합니다.

sudo chown User:Group <file>


답변

Windows ™ 용 Sudo (Elevate)

Windows ™의 명령 행에서 많은 작업을 수행합니다.

Cygwin 자체에서는 su -c /the/cmdWindows ™ 파일 시스템 내에서 sudo 자체에 대해 루트 명령을 실행 하여 명령 행에서 사용자의 권한 을 높일 수 있다고 생각합니다 . 관리자 인 경우이 방법이 효과적입니다. 그렇지 않으면 runas를 사용하고 관리자의 패스를 가져옵니다.;).

이제 우리 가이 코드를 어디서 얻었는지 기억할 수 없지만 여기에 있습니다. 도움이 되길 바랍니다.

BTW, 이것을 컴파일하는 데 사용하는 패키지는 다음과 같습니다 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;
}


답변

Peon의 가짜 sudo 스크립트가 약간 개선되었습니다 .

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

"$@"

이 스크립트는 sudo로 전달 된 모든 옵션을 자동으로 삭제하고 실제로 권한을 높이 지 않고 명령을 실행합니다. 옵션을 삭제하면 호환성이 다소 향상됩니다. 보다 완전한 래퍼 스크립트는 실제로 sudo와 같은 방식으로 옵션을 구문 분석해야합니다.

sudo를 수행하는 래퍼로 바꾸는 대신 cygstart --action=runas "$@"이 간단한 가짜 sudo 래퍼를 사용하고 설치 스크립트 자체 (또는 sudo를 사용하여 실행하려는 모든 작업)를 높은 권한으로 실행하십시오.


답변