Cygwin 에는 sudo 명령 이 없으므로 실행하려는 스크립트가 실패합니다.
./install.sh: line N: sudo: command not found
이 문제를 해결하는 표준 방법은 무엇입니까? 스크립트를 편집 제거하려면 sudo
? 일부 얻기 sudo
Windows 용 -like 도구를?
Cygwin 에는 sudo 명령 이 없으므로 실행하려는 스크립트가 실패합니다.
./install.sh: line N: sudo: command not found
이 문제를 해결하는 표준 방법은 무엇입니까? 스크립트를 편집 제거하려면 sudo
? 일부 얻기 sudo
Windows 용 -like 도구를?
답변:
필자는 Linux 의 고전적인 동작에 접근하는 사전 베타 쉘 스크립트 자동화 인 CygWin 용 SUDO 용 TOUACExt를 작성했다 . sudo
설치 하려면 4 개의 .sh
스크립트를 일부 경로 디렉토리에 복사하여 별명을 작성하고 스레드에 대해 몇 단계 만 더 수행하면됩니다.
결과 : 단일 sudo YourCommand
프로세스를 입력하고 나머지 프로세스에 대해 걱정할 필요없이 결과를 얻습니다.
한 가지 방법은 다음 내용으로 가짜 "sudo"명령을 작성하는 것입니다.
#!/usr/bin/bash
"$@"
이것은 허용 할 install.sh
sudo를 찾을 수 있기 때문에, 계속.
이것은 실제 sudo처럼 권한을 높이 지 않습니다. 관리자 권한이 필요한 경우 관리자 권한 (XP) 계정으로 cygwin 셸을 시작하거나 cygwin.bat를 r- 클릭하고 " 관리자 권한으로 실행" (Vista, Win7)
bash
: 왜 이것이 효과가 있습니까? 맨 페이지는 비슷한 $@
작업 에 대해 아무 말도하지 않습니다 sudo
. 대신 스크립트에 대한 모든 주장입니다. 그리고 그 경우에 따옴표가 불필요하지 않습니까? 그렇지 않으면 UNIX와 같은 시스템의 공간에 대한 비합리적인 두려움 때문에 존재하지 않는 단일 명령으로 sudo foo bar
실행하려고 시도 "foo bar"
합니다.
"$@"
(큰 따옴표로 묶인 경우)와 다르게 작동 합니다. 모든 위치 변수에 대해 별도의 단어로 "$*"
확장됩니다 . 예 : 경우 와 다음 인 - (달리 각 파라미터에 대한 하나 개의 단어 , 결과 하나 단어). 수동 참조 섹션의 매개 변수 , 하위 특수 매개 변수 . Peon의 스크립트의 최종 결과는 전달 된대로 정확하게 인수를 실행한다는 것입니다. $1 == "foo bar"
$2 == "baz"
"$@"
"foo bar" baz
"$*"
"foo bar baz"
bash
sudo
부분은 어디에서 나오는가? 위의 스 니펫은 해당 방향으로 원격으로 아무것도하지 않습니다.
sudo
는 root
명령을 실행 하기 전에 필사자에서 특권을 올릴 것 입니다. Cygwin에는 그러한 것이 없으므로 Peon의 가짜 스크립트 (이름을 지정해야 함 sudo
)는 권한을 변경하지 않고 명령을 직접 실행합니다. (이것은 ./install.sh
관리자 로 실행해야 할 수도 있음을 의미합니다 .)
runas
작동해야하며 UAC에 의존하지 않고 자체적으로 암호를 묻습니다. 나는 대답의 스크립트가 내가 목표라고 생각한 이름이 암시하는 것을하지 않은 이유를 혼란스럽게했습니다. 내 바보에 대해 죄송합니다 ;-)
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에서 테스트되었습니다.
cygstart
방법 의 문제점 은 Windows 명령 / 프로그램에서만 작동한다는 것입니다. 당신은 할 수 없습니다 sudo ls
. CygWin 용 SUDO는 깔끔하지만 여전히 좋은 sudo
명령이 없습니다.
sudo ls
Cygwin에서 어떤 상황에서 사용해야 했습니까?
sudo
CygWin에서 Windows 또는 CygWin 명령을 실행할 수 있습니다 . 그것은 나에게 매우 유용합니다. 그러나 내가 발견 한 더 실용적인 방법은 Cygwin에서 I에 대한 SUDO이 스크립트 래퍼 개발 : superuser.com/questions/741345/...을 (아직 베타지만 작동하는 것 같다). 그것으로 당신은 편안하게 같은 것들을 주문할 수 있습니다 sudo net start vncserver
.
/bin
과 /usr/bin
로부터 PATH
. 성공적으로 emacs를 호출 ShellExecute(NULL, "runas", "C:\cygwin64\bin\emacs-w32.exe", "(null)", "(null)", 1)
하지만 emacs 는를 사용하여 PATH를 대화식으로 복원 한 후에도 ls
예를 들어 찾을 수 없습니다 . 여기에 신뢰할 수있는 경로 문제가 있습니까? M-x dired
(setenv ...)
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를 사용하여 실행하려는 모든 작업)를 높은 권한으로 실행하십시오.