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


15

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

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

몇 가지 빠른 솔루션 :

  1. 일부 환경 변수의 값을 비교할 수 있습니다. 결과를 빨리 보면 env상당히 많은 차이점이 있습니다. 그러나 다른 Windows 시스템 (아마도 다른 버전의 Windows를 실행하는 경우)으로의 이식성 측면에서 어느 것이 가장 안정적인지 말하기는 어렵습니다.
  2. id보다 구체적 id -Gn으로 관리자로 실행되는 경우 다른 그룹을 표시합니다. 내 Windows 7 컴퓨터에서 Administratorsroot그룹이 목록에 추가되었습니다. 다시 말하지만, 이것이 휴대용인지 확실하지 않습니다.
  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.