programing

Cygwin에서 루트 사용자/sudo와 동등합니까?

bestprogram 2023. 5. 2. 23:04

Cygwin에서 루트 사용자/sudo와 동등합니까?

Cygwin에서 bash 스크립트를 실행하려고 합니다.

알겠습니다Must run as root, i.e. sudo ./scriptname오류

chmod 777 scriptname도움이 되지 않습니다.

"su"를 부르면 오류가 발생하기 때문에 Cygwin에서 sudo를 모방하고 루트 사용자를 추가하는 방법을 찾았습니다.su: user root does not exist유용한 것은 무엇이든 찾았지만 아무것도 찾지 못했습니다.

제안할 사람?

저는 슈퍼유저에서 이 질문에 답했지만 OP가 도움이 되지 않는 답변을 무시한 후에야 질문에 대한 유일한 답이 되었습니다.

SuperUser에 대한 제 답변에서 복사한 Cygwin의 권한을 높이는 적절한 방법은 다음과 같습니다.

저는 Cygwin 메일링 리스트에서 답을 찾았습니다.실행하기command에 Cygwin 서상승사용하명령여앞에다실명령행다을합니음을 .cygstart --action=runas다음과 같이:

$ cygstart --action=runas command

그러면 관리자 암호를 묻는 Windows 대화 상자가 열리고 적절한 암호가 입력된 경우 명령을 실행합니다.

이것은 쉬운 대본입니다, 만약 당신이~/bin당신의 길에 있습니다.~/bin/sudo다음 내용을 포함합니다.

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

이제 파일을 실행 파일로 만듭니다.

$ chmod +x ~/bin/sudo

이제 실제 상승된 권한으로 명령을 실행할 수 있습니다.

$ sudo elevatedCommand

추가해야 할 수도 있습니다.~/bin하거나 Cygwin CLI할 수 있습니다.~/.bashrc:

$ PATH=$HOME/bin:$PATH

64비트 윈도우즈 8에서 테스트되었습니다.

이 별칭을 위단 대이 명의별다추수있도다습니할가에음에 .~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'

아마도 관리자로 cygwin 셸을 실행해야 할 것입니다.바로 가기를 마우스 오른쪽 단추로 클릭하고 관리자 권한으로 실행을 클릭하거나 바로 가기의 속성으로 들어가 호환성 섹션에서 확인할 수 있습니다.조심해요...루트 권한은 위험할 수 있습니다.

도탄코헨의 답변을 바탕으로 가명을 사용하고 있습니다.

alias sudo="cygstart --action=runas"

매력적인 기능:

sudo chown User:Group <file>

또한 SysInternals가 설치되어 있으면 시스템 사용자로서 명령 셸을 매우 쉽게 시작할 수 있습니다.

sudo psexec -i -s -d cmd

는 sudo-for-cygwin을 찾았습니다. 아마도 이것은 효과적일 것입니다. 이것은 파이썬 스크립트를 사용하여 창(pty)에 하위 프로세스를 생성하고 사용자의 tty와 프로세스 I/O를 연결하는 클라이언트/서버 애플리케이션입니다.

윈도우 및 파이썬 모듈의 경우 python, Cygwin의 경우 eventlet이 필요합니다.

는 것 같습니다.cygstart/runas를 처리하지 ."$@"따라서 공백이 포함된 인수(및 다른 셸 메타 문자 - 확인하지 않음)가 있는 명령은 올바르게 작동하지 않습니다.

나는 그냥 작게 쓰기로 결심했습니다.sudo매개 변수를 올바르게 수행하는 임시 스크립트를 작성하여 작동하는 스크립트입니다.

#! /bin/bash

# If already admin, just run the command in-line.
# This works on my Win10 machine; dunno about others.
if id -G | grep -q ' 544 '; then
   "$@"
   exit $?
fi

# cygstart/runas doesn't handle arguments with spaces correctly so create
# a script that will do so properly.
tmpfile=$(mktemp /tmp/sudo.XXXXXX)
echo "#! /bin/bash" >>$tmpfile
echo "export PATH=\"$PATH\"" >>$tmpfile
echo "$1 \\" >>$tmpfile
shift
for arg in "$@"; do
  qarg=`echo "$arg" | sed -e "s/'/'\\\\\''/g"`
  echo "  '$qarg' \\" >>$tmpfile
done
echo >>$tmpfile

# cygstart opens a new window which vanishes as soon as the command is complete.
# Give the user a chance to see the output.
echo "echo -ne '\n$0: press <enter> to close window... '" >>$tmpfile
echo "read enter" >>$tmpfile

# Clean up after ourselves.
echo "rm -f $tmpfile" >>$tmpfile

# Do it as Administrator.
cygstart --action=runas /bin/bash $tmpfile

또는 su 포트가 포함된 syswin 패키지를 설치합니다. http://sourceforge.net/p/manufacture/wiki/syswin-su/

이 답변은 다른 답변을 기반으로 합니다.먼저 계정이 Administrators 그룹에 속해 있는지 확인합니다.

그런 다음 다음 내용이 포함된 일반 "runas-admin.bat" 파일을 만듭니다.

@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
    cscript //E:JScript //nologo "%~f0" %*
    @goto :EOF
)
FOR %%A IN (%*) DO (
    "%%A"
)
@goto :EOF
@end @ELSE
args = WScript.Arguments;
newargs = "";
for (var i = 0; i < args.length; i++) {
    newargs += "\"" + args(i) + "\" ";
}
ShA=new ActiveXObject("Shell.Application");
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+" "+newargs+"\"","","runas",5);
@end

그런 다음 다음과 같이 배치 파일을 실행합니다.

./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

예를 들어, 다음과 같습니다.

./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add"

각각의 개별 명령어를 큰따옴표로 묶어야 합니다.이 방법을 사용하면 UAC 프롬프트가 한 번만 표시되며 이 절차는 일반화되어 모든 종류의 명령을 사용할 수 있습니다.

GitHub의 CygWin에 대한 SUDO를 개선하기 위한 새로운 제안으로 TOUACExt라는 이름이 붙었습니다.

  • 자동으로 sudoserver.py 을 엽니다.
  • 시간 초과 후 자동으로 sudoserver.py 을 닫습니다(기본값 15분).
  • 관리 사용자에 대한 UAC 권한 상승 프롬프트 예/아니오 스타일 요청
  • 관리자가 아닌 사용자에 대한 관리자 사용자/암호를 요청합니다.
  • 관리자 계정으로 원격(SSH)으로 작동합니다.
  • 로그를 만듭니다.

아직 프리 베타에 있지만 효과가 있는 것 같습니다.

저는 구글을 통해 이곳에 도착했습니다. 그리고 저는 제가 사이버윈에서 완전히 기능하는 루트 프롬을 얻는 방법을 찾았다고 믿습니다.

여기 제 단계가 있습니다.

먼저 Windows 관리자 계정의 이름을 "root"(루트)로 변경해야 합니다. 시작 메뉴를 열고 "gpedit.msc"(gpedit.msc)를 입력하여 이 작업을 수행하십시오.

[로컬 컴퓨터 정책] > [컴퓨터 구성] > [Windows 설정] > [보안 설정] > [로컬 정책] > [보안 옵션] > [계정]에서 항목을 편집합니다.관리자 계정 이름 변경

그런 다음 계정이 아직 활성화되지 않은 경우 활성화해야 합니다.로컬 컴퓨터 정책 > 컴퓨터 구성 > Windows 설정 > 보안 설정 > 로컬 정책 > 보안 옵션 > 계정:관리자 계정 상태

이제 로그아웃하고 루트 계정에 로그인합니다.

이제 cygwin에 대한 환경 변수를 설정합니다.쉬운 방법: 내 컴퓨터를 마우스 오른쪽 단추로 클릭 > 속성

(왼쪽 사이드바에서) "고급 시스템 설정"을 클릭합니다.

아래쪽에서 "환경 변수" 버튼을 클릭합니다.

"시스템 변수"에서 "새로 만들기..." 버튼을 클릭합니다.

이름에는 "cygwin"을 따옴표 없이 입력합니다.값은 cygwin 루트 디렉토리에 입력합니다. (내 이름은 C:\cygwin)

확인을 누르고 모든 항목을 닫으면 바탕 화면으로 돌아갑니다.

Cygwin 터미널 열기(cygwin.bat)

/etc/passwd 파일을 편집하고 줄을 변경합니다.

관리자:사용되지 않음:500:503:U-MACHINE\관리자, S-1-5-21-12345678-1234567890-500:/home/관리자:/bin/bash

이를 위해 (당신의 번호와 기계 이름은 다를 것입니다. 강조 표시된 숫자를 0으로 변경하십시오!)

루트:사용되지 않음:0:0:U-MACHINE\root, S-1-5-21-1234567890-1234567890-0:/root:/bin/bash

이제 모든 것이 끝났으니, 이 다음 비트는 "su" 명령이 작동하도록 만들 것입니다. (완벽하지는 않지만 사용하기에 충분히 기능할 것입니다.)스크립트가 제대로 작동하지 않을 거라고 생각합니다만, 여기까지 오셨으니 방법을 찾을 수 있을 겁니다.그리고 공유해주세요)

이 명령을 cygwin에서 실행하여 거래를 완료합니다.

mv /bin/su.exe /bin/_su.exe_backup
cat > /bin/su.bat << "EOF"
@ECHO OFF
RUNAS /savecred /user:root %cygwin%\cygwin.bat
EOF
ln -s /bin/su.bat /bin/su
echo ''
echo 'All finished'

루트 계정에서 로그아웃하고 일반 Windows 사용자 계정으로 다시 로그인합니다.

그런 다음 탐색기에서 새 "su.bat"을 두 번 클릭하여 수동으로 실행합니다.암호를 입력하고 창을 닫습니다.

이제 Cygwin에서 su 명령을 실행하여 모든 것이 잘 해결되었는지 확인합니다.

사용 가능한 솔루션에 만족하지 못한 저는 nu774의 스크립트를 채택하여 보안을 추가하고 설정 및 사용을 쉽게 했습니다.이 프로젝트는 Github에서 사용할 수 있습니다.

사용하려면 다운로드하여 실행하기만 하면 됩니다.python3 cygwin-sudo.py **yourcommand**.

편의를 위해 별칭을 설정할 수 있습니다.

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"

이를 통해 모든 디렉토리의 상황에 맞는 메뉴에서 bash 또는 cmd가 실행 중인 관리 창을 가져올 수 있습니다.디렉토리 이름을 마우스 오른쪽 단추로 클릭하고 항목을 선택하거나 강조 표시된 단추를 누릅니다.

이것은 cheer 도구와 link_boy의 유감스럽게도 작동하지 않는 답변을 기반으로 합니다.Windows 8을 사용하는 경우에는 문제가 없습니다.

부작용으로는 admin cmd 창의 다른 색상이 있습니다.이 파일을 bash에서 사용하려면 admin 사용자의 .bashrc 파일을 변경합니다.

실행할 "백그라운드" 버전(열린 디렉토리에서 마우스 오른쪽 단추 클릭)을 가져오지 못했습니다.자유롭게 추가하세요.

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="&Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="C:\\cygwin\\bin\\bash -c \"/bin/xhere /bin/bash.exe '%L'\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root]
@="&Root Bash Prompt Here"
"Icon"="C:\\cygwin\\Cygwin.ico"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root\command]
@="runas /savecred /user:administrator \"C:\\cygwin\\bin\\bash -c \\\"/bin/xhere /bin/bash.exe '%L'\\\"\""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd]
@="&Command Prompt Here"

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd\command]
@="cmd.exe /k cd %L"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root]
@="Roo&t Command Prompt Here"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root\command]
@="runas /savecred /user:administrator \"cmd.exe /t:1E /k cd %L\""

관리자 권한으로 작동하는 Cygwin 셸 및 해당 하위 셸을 갖는 매우 간단한 방법은 초기 셸을 여는 링크의 속성을 변경하는 것입니다.

다음은 Windows 7+에 유효합니다(이전 버전에도 유효할 수 있지만 확인하지 않았습니다).

저는 보통 시작 버튼(또는 바탕 화면)의 cygwin-link에서 cygwin 쉘을 시작합니다.그런 다음 탭에서 cygwin-link의 속성을 변경했습니다.

/호환성/권한 수준/

그리고 상자를 확인했습니다.

"관리자로 이 프로그램 실행"

이를 통해 관리자 권한으로 Cygwin 셸을 열 수 있으며 해당 하위 셸도 열 수 있습니다.

나는 이 토론을 만나서 몇 가지 세부 사항을 찾았습니다.sudo다양한 운영 체제에서 구현할 수 있습니다.읽어보니 @http-white(https://stackoverflow.com/a/42956057/3627676) 의 솔루션은 유용하지만 약간 개선될 수 있습니다.저는 임시 파일 생성을 피하고 단일 스크립트로 모든 것을 실행하도록 구현했습니다.

또한 단일 창/콘솔 내에서 출력하기 위한 개선의 다음 단계를 조사했습니다.불행하게도, 아무 성과도 없었습니다.명명된 파이프를 사용하여 STDOUT/STDERR을 캡처하여 메인 창에 인쇄하려고 했습니다.하지만 하위 프로세스가 명명된 파이프에 기록되지 않았습니다.그러나 일반 파일에 쓰는 것은 잘 작동합니다.

근본 원인을 찾으려는 모든 시도를 포기하고 현재 솔루션을 그대로 둡니다.제 게시물도 유용하게 쓰였으면 좋겠습니다.

향상된 기능:

  • 임시 파일 없음
  • 구문 분석 및 재구성 안 함명령줄 옵션
  • 높은 명령을 기다리다.
  • 사용하다mintty또는bash 번째 을 찾을 수 ▁if.
  • 명령 종료 코드를 반환합니다.

#!/빈/빈
관리자가 되면 명령을 직접 실행합니다.id -G | grep -qw 544 & & {"$@"$ 종료?
}
CYG_SUDO 변수는 명령 호출을 제어하는 데 사용됩니다.[ -z "$CYG_SUDO"] & & {mintty="$(mintty 2>/dev/dev)"CYG_SUDO="$$" 내보내기cygstart --wait --action= $delty /bin/delta "$0" "$@"로 실행됩니다.$ 종료?
}
이제 다음을 수행할 수 있습니다.-- 명령 실행-- 메시지 표시-- 종료 코드를 반환합니다."$@"RETVAL=$?
echo "$0: 창을 닫으려면 누르십시오..."읽어주세요
$RETVAL 종료

@mat-khor의 대답을 바탕으로, 나는 syswin을 가져갔고, 그것을 저장했습니다.manufacture-syswin-su.exe그리고 이 포장지 대본을 썼습니다.명령어의 stdout과 stderr의 리디렉션을 처리하여 파이프 등에서 사용할 수 있습니다.또한 스크립트는 지정된 명령의 상태로 종료됩니다.

제한 사항:

  • syswin-su 옵션은 현재 사용자를 사용하도록 하드 코딩되어 있습니다.프리펜딩env USERNAME=...스크립트 호출은 이를 재정의합니다.다른 옵션이 필요한 경우 스크립트는 syswin-su와 명령 인수를 구별해야 합니다(예: 처음에 분할).--.
  • UAC 프롬프트가 취소되거나 거부되면 스크립트가 중단됩니다.

.

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 2>&1 | perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")

제가 직접 테스트할 수는 없습니다. 테스트할 수 있는 적절한 스크립트가 없습니다. 리눅스 전문가는 아니지만 충분히 가까운 것을 해킹할 수 있을 것입니다.

저는 이 단계들을 시도해 보았는데, 효과가 있는 것처럼 보이지만, 그것이 여러분의 필요에 충분할지는 모르겠습니다.

'root' 사용자의 부족 문제를 해결하려면:

  • 로컬 윈도우즈 시스템에 'root'이라는 사용자를 생성하여 'Administrators' 그룹의 멤버로 만듭니다.
  • bin/bash.exe를 모든 사용자에 대해 '관리자 권한으로 실행'으로 표시합니다. 필요할 때 이 기능을 설정/해제해야 합니다.
  • Cygwin.bat 파일을 마우스 오른쪽 버튼으로 클릭하는 동안 Windows 탐색기에서 왼쪽 시프트 버튼을 누릅니다.
  • '다른 사용자로 실행'을 선택합니다.
  • 사용자 이름으로 .\root를 입력한 다음 암호를 입력합니다.

그런 다음 cygwin의 'root'이라는 사용자로 실행되며, bash.exe 파일의 'Run as administrator'와 결합하면 충분할 수 있습니다.

하지만 당신은 여전히 스도가 필요합니다.

/bin에 'sudo'라는 파일을 만들고 이 명령줄을 사용하여 대신 su로 명령을 전송함으로써 이것을 위조했습니다.

su -c "$*"

저는 sudovim 등의 명령줄이 잘 맞는 것 같으니 한번 사용해보시는 것이 좋을 것 같습니다.

이것이 여러분의 필요에 적합한지 아닌지를 알고 싶습니다.

제가 주로 하는 일은 레지스트리 "Open Here" 도우미를 사용하여 관리자 권한으로 컴퓨터의 어느 곳에서나 매우 쉽게 cygwin 셸을 열 수 있도록 하는 것입니다.

cygwin "chere" 패키지를 설치해야 합니다. "chere -i -m먼저 높은 사이그윈 껍질에서.

Cygwin 설치가 C:\cygwin에 있다고 가정합니다.

다음은 레지스트리 코드입니다.

Windows Registry Editor Version 5.00

[-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

[-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash]
@="Open Cygwin Here as Root"
"HasLUAShield"=""

[HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command]
@="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe"

이게 도움이 되길 바랍니다.그것이 당신에게 효과가 있다면 제게 알려주세요.감사해요.

PS: 이 코드를 가져와서 복사하여 붙여넣은 다음 name.reg 파일에 저장하여 실행할 수 있습니다.또는 수동으로 값을 추가할 수 있습니다.

승인된 답변을 단순화하기만 하면 Cygwin 터미널에서 아래를 복사하면 다음 작업이 완료됩니다.

cat <<EOF >> /bin/sudo
#!/usr/bin/bash
cygstart --action=runas "\$@"
EOF
chmod +x /bin/sudo

시도:

chmod -R ug+rwx <dir>

<dir>사용 권한을 변경할 디렉터리입니다.

언급URL : https://stackoverflow.com/questions/4090301/root-user-sudo-equivalent-in-cygwin