cygwin mintty / bash가 관리자로 실행되는지 확인하는 방법은 무엇입니까?


15

문제 설명 : Cygwin mintty bash세션이 "관리자 권한으로 실행" 인지 테스트하는 가장 우아하고 강력한 방법은 무엇입니까 ?

왜 구체적으로? minttyWindows를 사용할 때 일반적으로 여러 터미널이 열려 mintty있습니다 (탭이 없음). 가장 어색한 것은 예를 들어 실행 ping또는 다른 일회성 절차를 원할 때 "관리자 권한으로 실행"을 마우스 오른쪽 단추로 클릭하여 시작한 터미널 창을 찾아야하는 경우입니다 . 터미널 세션의 "관리자 권한으로 실행"을 시각적으로 나타냅니다 ( 시작 파일 의 bash쉘 프롬프트 변수 PS1를 변경하여 ~/.bashrc).

몇 가지 빠른 솔루션 :

  1. 일부 환경 변수의 값을 비교할 수 있습니다. 결과를 빨리 보면 env상당히 많은 차이점이 있습니다. 그러나 다른 Windows 시스템 (아마도 다른 버전의 Windows를 실행하는 경우)으로의 이식성 측면에서 어느 것이 가장 안정적인지 말하기는 어렵습니다.
  2. id보다 구체적 id -Gn으로 관리자로 실행되는 경우 다른 그룹을 표시합니다. 내 Windows 7 컴퓨터에서 Administrators및 root그룹이 목록에 추가되었습니다. 다시 말하지만, 이것이 휴대용인지 확실하지 않습니다.
  3. 일반 사용자로서 실패한 위치에 파일을 쓰려고 시도 할 수 있습니다. 그러나 나는 이상한 장소에 파일을 쓰고 싶지 않습니다. 이것은 상상할 수없는 시나리오에서 잠재적으로 파괴적 일 수 있습니다 (예 : 저장 매체 고장). 그리고 이것은 내 취향과 전혀 관련이없는 것처럼 보입니다.
  4. 명령이 "관리자"로 실행되는 경우 리턴 상태 또는 출력으로 표시되는 일부 Windows 프로그램을 실행합니다. 가장 좋은 것은 UNIX id(1)명령 과 비슷한 목적을 가진 것입니다 (그러나 Windows 또는 Cygwin에 기본적으로 존재하지만 Windows 시스템 개념을 POSIX 에뮬레이트 개념으로 너무 많이 가져 오지 않은).

더 나은 또는 더 우아한 제안? 아마도 cygwin은이 목적을 위해 전용 명령 유틸리티를 제공합니까?

업데이트 : https : //.com/questions/4051883/batch-script-how-to-check-for-admin-rights/ 97 % 복제 -차이점은 bash(IMHO 이상하고 고풍스러운) Windows 대신에 여기에 있습니다. cmd.exe. 답변과 해설을 확인하십시오.


"관리자 권한으로 실행"을 사용하지 않으면 관리자 계정이 프로세스를 시작하더라도 프로세스가 관리자 권한으로 올라가지 않습니다. 이 작업이 항상 수행되도록 바로 가기를 만드십시오.
— Ramhound

1
ConEmu 시도해 보는 것이 좋습니다 . 탭이 있으며 탭 표시 줄에 다른 아이콘으로 표시된 관리자로 탭을 실행할 수 있으며 가장 중요한 것은 콘솔을 장면 뒤에서 사용하므로 기본 Windows 응용 프로그램은 민트와 달리 올바르게 작동합니다.
— Jan Hudec

2
@Ramhound 당신은 이미이 질문으로 좁혀진 내 원래 문제 (관리자 터미널 창 구별)가 바로 가기로 해결 될 수 있습니다 mintty. 설정 및 3. 다른 아이콘을 사용합니다. 일반 대중에게 이것을 만드는 방법을 설명한다면, 나는 당신에게 공감대를 줄 것입니다.
— FooF

1
@FooF-관리자 수준의 사용자로 프로세스를 실행한다고해서 프로세스 자체가 에스컬레이션 된 것은 아닙니다. 기본적으로 Windows는 사용자가 이러한 작업을 승인하여 Windows에서 "관리자 권한으로 실행"기능을 승인 한 경우에만 프로세스를 에스컬레이션합니다. 원하는 경우 Foo사용자 그룹 을 원하는 모든 그룹에 대한 모든 권한을 제공 할 수도 있습니다 .
— Ramhound

1
@FooF- sudo루트 사용자로 실행하더라도 필요한 것으로 생각하십시오 .
— Ramhound

답변:


9

방금 같은 이유로이 기능을 작성했습니다. 어떤 셸에 관리자 권한이 있는지 알 수 없습니다.

function isadmin()
{
    net session > /dev/null 2>&1
    if [ $? -eq 0 ]; then echo "admin"
    else echo "user"; fi
}

Windows cmd shell에 대한 이 답변 /programming//a/11995662/307968 에서 수정되었습니다 . 관리자 인 경우 Net Session은 0 상태를 반환합니다.

이제 프롬프트 나 제목 표시 줄 색을 변경해야합니다 ....


좋은 발견. 스택 오버플로 주석을 확인하면 이것이 실패하는 경우가있는 것처럼 보이지만.
— FooF

그럼에도 불구하고 나는이 답변이 훨씬 포괄적 인 토론 (스택 오버 플로우 질문과 거기에 허용 된 답변 각각 현재 147과 255의 점수를 가짐)을 가리 키기 때문에 수락했습니다.
— FooF

감사! 이 메시지를 사용하여 프롬프트에서 사용자 이름을 선택적으로 채색합니다. 판매가 상승하면 빨간색으로 표시되고 그렇지 않으면 녹색으로 표시됩니다. 터미널 창이 많이 열려있는 경우 어떤 쉘이 올라 갔는지 추적하는 데 유용합니다.
— HelloGoodbye

16

이 질문에 대한 결정적인 대답은 Cygwin 메일 링리스트에서 온 것 입니다. 프로세스를 시작한 사용자가 그룹 544 (관리자)의 일부인 경우 프로세스가 관리자 권한으로 실행 중입니다. 또한 Cromax의 아래 의견에서 그룹 114 (로컬 계정 및 관리자 그룹의 구성원)도있는 것 같습니다. 이 두 그룹에 대한 테스트는

id -G | grep -qE '\<(114|544)\>'

예를 들어

id -G | grep -qE '\<(114|544)\>' && echo admin || echo user

과거에는 / etc / group의 루트 그룹 인 그룹 0도 확인해야했습니다. 그러나 / etc / group은 더 이상 Cygwin에 설치되지 않으며, 존재하는 경우 제거해야하므로 더 이상 그룹 0도 확인 하지 않는 것이 좋습니다 . 그냥 그룹 544.


1
Cygwin 메일 링리스트에 문의 해 주셔서 감사합니다. :-) (에뮬레이트 / 번역 된) 그룹 ID는 시스템간에 일정하게 유지됩니다.
— FooF

물론 ... 나는 나 자신을 알고 싶었고 사람들 은 알고 있었다 .
— 앤드류 슐만

1
불행히도 이것은 Mingw / Msys에서는 작동하지 않습니다. 스티븐의 대답은하지만 단지 윈도우 7에서 수행
— sparrowt

1
방금 (W7에서) 시도했지만 작동하지 않았지만 Window의 사용자 중 하나가 관리자로 기록 된 경우 Cygwin이 관리자로 실행되면 다른 그룹이 있음을 알았습니다. id의 출력에서 ​​114 (로컬 계정 및 관리자 그룹의 구성원) 가 나타납니다 . 따라서 정규 표현식을 다음과 같이 업데이트해야합니다.id -G | grep -qE '\<(114|544)\>' && echo admin || echo user
— Cromax

감사. 나는 그것을 직접 보지 못했지만 그룹 114는 관리자 그룹 인 것처럼 보이므로 확인하는 것도 합리적입니다. 나는 대답을 수정했다.
— 앤드류 Schulman

7

Windows 프로그램의 반환 값을 사용합니다 at. 또한 PROMPTING 특수 문자의 기능을 다시 만들었습니다 \$.

# Set a white $ initially
eStyle='\[\e[0m\]$'

# If 'at' succeeds, use a red # instead
at &> /dev/null && eStyle='\[\e[0;31m\]#\[\e[0m\]'  # Use # in red

PS1='\n\[\e[0;32m\]\u@\h \[\e[0;33m\]\w\[\e[0m\]\n'"$eStyle "

예


idWindows 에 UNIX 명령 과 동등한 것이 없다고 가정하면 , 정답으로 받아들입니다. 적어도 at인수없이 명령을 실행 하면 부작용이없는 것으로 보입니다. 나는 .bashrc지금부터 내 파일 에서이 방법을 사용할 것 입니다! 해킹 주셔서 감사합니다.
— FooF

1
windows8.1에서 작동하지 않는 것 같습니다
— zzapper

1
@zzapper 좀 더 구체적으로 설명하십시오. 무슨 일이 / 일어나지 않습니까? 오류 메시지?
— Steven

4
id는 동일한 값을 반환합니다. at는 사용되지 않습니다. 대신 schtasks.exe를 사용하십시오. 그러나 관리자인지 여부에 관계없이 작동합니다.
— zzapper

2

id -G | grep -qE '\<(544|0)\>'내 출력이 높아져도 <> 또는 544가 아니기 때문에 나에게는 효과가 없었습니다. 그러나에 쓰는 데 고도가 필요 %WINDIR%\system32하므로 쉘 함수를 사용하여 고도를 테스트하는 데 사용했습니다.

is_elevated() { 
   [[ $(uname -o) -eq "Cygwin" ]] || return 1
   touch $WINDIR/system32/.cyg_elevated &> /dev/null
}

빨간 해시 문자에 대한 Steven의 훌륭한 아이디어에 적용될 때 :

is_elevated && PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\[\e[0;31m\]#\[\e[0m\] '

1

관리자 만 수행 할 수있는 작업을 수행하고 성공 또는 실패를 테스트하십시오.

if touch c:/Users/.x ; then  echo 'ok'  ; fi

또는

touch c:/Users/.x && echo ok

또는

touch c:/Users/.x && \rm c:/Users/.x && echo ok

또는

touch c:/Users/.x  &> /dev/null && \rm c:/Users/.x && echo you are admin

1

Windows의 Msys에서 이것을 시도하십시오 (Msys에서는 허용되는 답변이 작동하지 않음을 발견했습니다)

at &> /dev/null && echo "Running as admin" || echo "NOT running as admin"

이것은 atadmin으로 실행될 때만 리턴 코드 0 에 의존합니다 .


1
이것은 @Steven이 이전 답변에서 제공 한 것과 같은 방법으로 보입니다 (MSYS "at"가 어쨌든 그렇지 않으면 주석에 따라 Windows 8.1에서 작동하지 않는 것 같습니다). Cygwin에 관한 질문 이었지만 유사한 MSYS와 비교하는 것은 흥미 롭습니다. 기여해 주셔서 감사합니다.
— FooF

매우 비슷합니다. 나는이 사람이 다른 일에 사용 될 줄 알았는데, 그래서 그러나 나는, 스크립트 (Win7에, MSYS) 대신 배쉬 프롬프트 스타일을 설정하는 확인하기 위해 그것을 사용하려고이 질문에 결국 같은
— sparrowt

유용함에 동의합니다.
— FooF
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.