Cygwin 에는 sudo 명령 이 없으므로 실행하려는 스크립트가 실패합니다.
./install.sh: line N: sudo: command not found
이 문제를 해결하는 표준 방법은 무엇입니까? 스크립트를 편집 제거하려면 sudo
? 일부 얻기 sudo
Windows 용 -like 도구를?
답변
필자는 Linux 의 고전적인 동작에 접근하는 사전 베타 쉘 스크립트 자동화 인 CygWin 용 SUDO 용 TOUACExt를 작성했다 . sudo
- 필요할 때 자동으로 sudoserver.py를 열고 닫습니다 .
- UAC 고도 프롬프트를 요청합니다 .
설치 하려면 4 개의 .sh
스크립트를 일부 경로 디렉토리에 복사하여 별명을 작성하고 스레드에 대해 몇 단계 만 더 수행하면됩니다.
결과 : 단일 sudo YourCommand
프로세스를 입력하고 나머지 프로세스에 대해 걱정할 필요없이 결과를 얻습니다.
답변
한 가지 방법은 다음 내용으로 가짜 “sudo”명령을 작성하는 것입니다.
#!/usr/bin/bash
"$@"
이것은 허용 할 install.sh
sudo를 찾을 수 있기 때문에, 계속.
이것은 실제 sudo처럼 권한을 높이 지 않습니다. 관리자 권한이 필요한 경우 관리자 권한 (XP) 계정으로 cygwin 셸을 시작하거나 cygwin.bat를 r- 클릭하고 “ 관리자 권한으로 실행” (Vista, Win7)
답변
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에서 테스트되었습니다.
답변
dotancohen의 답변 을 바탕 으로 별칭을 사용하고 있습니다.
alias sudo="cygstart --action=runas"
셸 내장이 아닌 외부 프로그램의 매력으로 작동합니다.
sudo chown User:Group <file>
답변
Windows ™ 용 Sudo (Elevate)
Windows ™의 명령 행에서 많은 작업을 수행합니다.
Cygwin 자체에서는 su -c /the/cmd
Windows ™ 파일 시스템 내에서 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를 사용하여 실행하려는 모든 작업)를 높은 권한으로 실행하십시오.