CygWin에 SUDO를 사용 (자동화)하는 방법


11

CygWinsudo 에서 명령 을 사용할 수있는 것은 상승 된 쉘을 여는 보다 유용하고 빠릅니다 .

Luis@Kenobi /cygdrive/c/Users/Luis
$ net user /add TestUser
System error 5.
Access denied.

Luis@Kenobi /cygdrive/c/Users/Luis
$ sudo net user /add TestUser
Command completed successfully.

위에 표시된 것처럼 Linux와 마찬가지로 Windows 명령 / 스크립트도 실행할 수 있습니다. 나를 위해 깔끔하다; 원격 (SSH) 콘솔 에서 작동하며 Windows / Linux 명령 을 결합 할 수 있습니다 . 따라서 관리 작업을 실행할 수 있어야합니다.

그러나 SUDO for CygWin 프로젝트는 위험 할 수있는 동작을 가지고 있습니다 . 실제로 서버 / 클라이언트 아키텍처 로 작동 합니다 . 실제로 클라이언트 (sudo)는 명령 요청을 서버 내부 (sudoserver.py)로 전송합니다. 로컬 컴퓨터) 포트 7070TCP, 사용자 또는 권한 검사 가 없으므로 컴퓨터에 로그인 한 모든 사람 (권한이없는 사용자도) 은 관리자 (CygWin 또는 Windows) 셸 명령 또는 스크립트 (CygWin 또는 Windows도)를 실행할 수 있습니다. 저자의 제안 된 방법 인 "sudoserver.py"를 서비스로 등록하면
문제 가 더 악화 되어 영구적으로 계속 실행됩니다.

그래서, 좀 더 안전하게 (완전히 아님) 유지하기 위해 다음과 같이
합니다 : 1.- 관리 셸에서 "sudoserver.py"를 실행합니다.
다른 CygWin 쉘에서 "sudo"명령을 실행합니다.
3.- "sudoserver.py"및 관리 셸을 닫습니다 (Ctrl + C).

조금 성가신 . "sudoserver.py"를 실행 .cmd하는 할당 된 핫키 가 있는 파일을 사용 하여이 문제를 해결하고 있으며 관리 작업 후에 수동으로 파일을 닫고 있지만 여전히 Linux의 "sudo" 사용 가능성 과는 거리가 멀습니다 .

위대하고 실용적인 방법은 다음과 같은 방법입니다.

  1. ** UAC 고도 프롬프트 (또는 사용자 / 암호)를 요청하는 "sudoserver.py"를 자동으로 엽니 다.
  2. 잠시 후에 닫으 므로 UAC 요청은 여러 sudo명령이 순차적으로 실행되는 경우 계속 방해하지 않습니다 .

적어도 부분적으로 이것을 자동화 하는 방법 있습니까?

답변:


10

참고 : 이것은 주로 내가 만든 프로그램 (쉘 스크립트) 이며이 포럼은 프로그램 소개 사이트보다 질문 답변 사이트라는 것을 알고 있습니다. 그러나 나는 GitHub (또는 유사한) 계정이 없으며 오픈 소스 프로그램을 커뮤니티에 게시하는 방법에 대해 조사 할 시간이 없었습니다. 따라서, 유용하고 유용한 프로그램이 그것을 즐길 수있는 사람들에게 눈에 띄지 않게하는 위험이있는 한, 이미 작성된 프로그램을 공유하지 않는 것이 슬프다면, 여기게시 할 것 입니다. 지금. 관리자 가이 스레드를 제거하기로 결정하면 아무런 문제가 없습니다. 나는에 문제를 모호하게 한 희망 질문 - 답변 이 포럼에 유용하게 방법 충분히. 충분하다면관심있는 사용자 , 나는 프로젝트계속 하기 위해 시간을 할애하기 위해 최선을 다할 것입니다 (모든 연구 후에 인터넷에서 가장 가까운 것을 찾지 못했지만 글쎄 ... 스크립트가 가치가 있는지 또는 잘 모르겠습니다. 시간 낭비였습니다).

CygWin에서 작동 하고 간단한 CygWin 시간 공격 간격에 대한 SUDO를 줄이는 데 도움이 되는 간단한 Linux 셸 스크립트 를 프로그래밍했습니다 . 이 프로그램의 이름은 TOUACExt ( " TimeOut 및 UAC Extension "의 약자 )이며 CygWin 용 SUDO (설치해야 함) 의 래퍼 역할을하며 실제로 4 개의 .sh프로그램 으로 구성됩니다 .

TOUACExt 실행 예

특징 :

  • 편안한 사용법 : Linux 동작에서 원래 sudo를 시뮬레이션하면 UAC 확인 요청 프롬프트가 한 번만 나타납니다 (여러 개의 연속 된 sudo명령은 하나의 UAC 요청 만 생성 함). sudoserver.py가 계속 실행되는 동안 (기본값 15 분) 더 이상 UAC 요청 이 없습니다 .
  • 권한있는 (관리자) 사용자 는 화면에서 UAC 확인 요청 ( 예 / 아니요 ) 만 받습니다 .
  • 권한이없는 (관리자가 아닌) 사용자 에게는 관리자 계정 / 암호 입력 화면이 나타납니다.
  • sudoserver.py는 계속 실행되고 마지막 sudo 명령 실행에서 사전 정의 된 시간 (15 분) 후에 자동으로 닫힙니다 .
  • sudo가 실행중인 경우 sudoserver.py가 닫히지 않습니다 (실행을 유지하고 5 분 후에 다시 확인) .
  • 원격으로 작동 (SSH를 통해 테스트) :
    • 권한이없는 사용자 는 sudoserver.py를 원격으로 시작할 수 없습니다.
  • 에 (단순하고 읽기 어려운) 로그 를 작성 /var/log/SUDOForCygWin/합니다.

요구 사항 (CygWin) :

  • CygWin을위한 SUDO .
  • pgrep ( procps패키지).
  • 무리 ( util-linux패키지).
  • nohup ( CygWin 에 기본적 으로 설치되어 있다고 생각 하지만 확실하지는 않습니다).

가정 :-저자가 제안한 경로에 대한 SUDO for CygWin 프로젝트의 두 프로그램 :

/usr/local/bin/sudoserver.py
/usr/local/bin/sudo

TOUACExt는 Windows 7 SP1 및 Windows XP SP3에서 작동 하는 것으로 테스트 되었지만이 마지막 버전에서 사용하는 것이 적합한 지 모르겠습니다.

설치 방법 :

  • (제안 된 이름을이 스크립트를 넣어 SUDOServer.cmd(당신이 원하는 경우에 당신이 아이콘을 맞춤화 할 수 있습니다)이 이름에 및 바로 가기를 만들) SUDOServer.lnk(이 단축키를 사용하도록 설정해야합니다 Advanced Options --> Execute as Administrator) 어디서나 Windows 경로에 있으므로, sudoserver.py직접 윈도우에서 요청할 수 있습니다 :

    c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py

  • TOUACExt 의 네 개의 .sh 스크립트를 경로에 넣으십시오. 예를 들면 다음과 같습니다.

    /usr/local/bin/SUDO.sh /usr/local/bin/SUDOServer.sh /usr/local/bin/SUDOServerWatchDog.sh /usr/local/bin/SUDOServerWatchDogScheduler.sh

  • 원래 이름 바꾸기 에서 파이썬 스크립트 sudosudo.py:

    mv /usr/local/bin/sudo /usr/local/bin/sudo.py
    경고 : 원래 "sudo"Python 스크립트는 경로의 어느 곳에도 남아 있지 않아야합니다. 그렇지 않으면 대신 실행될 수 있습니다.

  • 이 별명을 작성하십시오 (예 : 수동 또는을 편집하여 ~/.bashrc).

    alias sudo='SUDO.sh'

SUDO.sh 코드 :

#!/bin/bash

# ********** SUDO.sh v0.04a **********

# Variables:
# LockFile (will use a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck

# Creating LogFile (if it does not exist):
mkdir /var/log/SUDOForCygWin 2>/dev/null
chmod 777 /var/log/SUDOForCygWin 2>/dev/null
LogFile=/var/log/SUDOForCygWin/$(date +%Y%m%d).log
exec 5>>$LogFile    # Redirector 5 will be the log file.
chmod 777 $LogFile >&5 2>&5 # Writable to anyone (for now).

# Start of the program
echo "========== Starting SUDO Server for CygWin ==========" >&5
echo $(date) >&5

# does the lock file exists as locked?
if [ $(flock -n $TMP/$LockFile echo>/dev/null;echo $?) -eq 0 ]
   then
    # The lock file is not locked.
    echo "LockFile not locked. Testing sudo access..." >&5
    if [ $(sudo.py vartemp=0>/dev/null 2>/dev/null;printf $?) -eq 0 ]
       then
        # Wooops. sudoserver.py is running without the lockfile. Better to correct this.
        echo "LockFile not locked, but sudoserver.py seems to be running." >&5
        printf "Killing sudoserver.py...\n" >&5
        sudo.py kill $(sudo.py pgrep.exe -f -l sudoserver.p[y] | grep "pgrep" -v | awk '{print $1}') >&5 2>&5
    fi
    # Starting SUDOServer.sh
    printf "Requesting SUDOServer start...\n" >&5
    nohup SUDOServer.sh >&5 2>&1&
    # Wait some time delay for UAC Prompt to start
    sleep 2
    timeout=$((SECONDS+10))
    # Has sudoserver.py already started?
    while [ $(flock -w 1 $TMP/$LockFile echo>/dev/null;printf $?) -eq 0 ] || [ $(tasklist | grep "consent.exe" -i>/dev/null;printf $?) -eq 0 ]
    do
        # No. We have to wait.
        # Waiting for SUDOServer.py to be running.
        printf "."
        if [ $SECONDS -ge $timeout ]
           then
            # sudoserver.py not responding. Aborting with errorlevel=3.
            printf "sudoserver.py not responding. Aborting.\n"
            exit 3
        fi
    done
    # Yes. sudoserver.py is up and running.
fi

printf "\n"
# Schedule (add) SUDOServer Watch Dog to Task Scheduler:
SUDOServerWatchDogScheduler.sh

# Invoke requested sudo command
sudo.py $@

#printf "ErrorLevel was: "$?


# ErrorLevel Codes:
# 3 --> timeout waiting for sudoserver.py to respond.

SUDOServer.sh의 코드 :

#!/bin/bash

# ********** SUDOServer.sh v0.04a **********

# Variables:
# LockFile (a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck

# Check for other instances of sudoserver.py running
if [ $(flock -n $TMP/$LockFile echo>/dev/null;printf $?) -eq 0 ]
   then
    printf "Creating lockfile: "$TMP/$LockFile"\n"
    flock $TMP/$LockFile -c 'cmd /c SUDOServer'
    # The file has been unlocked. Send error level=2.
    exit 2
   else
    printf "The lockfile: "$TMP/$LockFile" is locked by another process.\n"
    printf "Exiting SUDOServer.sh"
fi

printf "SUDOServer.sh execution finished. Exiting."

# Exiting with no problems.
exit 0

# ErrorLevel Codes:
# 2 --> SUDOServer.lnk (maybe denial of UAC). 

SUDOServerWatchDog.sh의 코드 :

#!/bin/bash

# ********** SUDOServerWatchDog.sh v0.04a **********

# Variables:
# LockFile (a temporal one for now):
#lockfile=sudoserver-running.lck
LockFile=lockfile.lck

# Redirecting to LogFile:
LogFile=/var/log/SUDOForCygWin/$(date +%Y%m%d).log
exec 5>>$LogFile
if [ $(stat $LogFile -c %a) -ne 777 ]
   then
    echo "Logfile "$LogFile" has incorrect permissions." >&5
    echo "Attemping to change permissions of "$LogFile >&5
    chmod 777 $LogFile >&5 2>&5
fi

# Remove Task Scheduler entry, if exists.
if [ $(schtasks.exe /query | grep "SUDOServerWatchDog" -i>/dev/null 2>&5;printf $?) -eq 0 ]
   then
    sudo.py schtasks.exe /delete /tn "SUDOServerWatchDog" /f >&5 2>&5
fi

# Is sudoserver.py running?
if [ $(flock -n $TMP/$LockFile echo>/dev/null;printf $?) -eq 1 ] || [ $(sudo.py vartemp=0>/dev/null 2>/dev/null;printf $?) -eq 0 ]
   then
    # Yes. sudoserver.py is running. So...
    printf "sudoserver.py detected running...\n" >&5
    # Is any instance of sudo running right now?
    if [ $(sudo.py pgrep -f -l "/usr/local/bin/sudo.py " | grep -v grep>/dev/null 2>&5;printf $?) -eq 0 ]
       then
        # Yes. sudo is running right now. So...
        printf "There are instances of sudo running.\n" >&5
        sudo.py schtasks /create /tn "SUDOServerWatchDog" /tr "SUDOServerWatchDog" /sc minute /mo 5 /sd 10/10/2010 /ru "SYSTEM" >&5 2>&5
        printf "Will check again in 5 minutes. Adding Task.\n" >&5
       else
        # No. sudo is not running right now. So...
        # Kill sudoserver.py.
        printf "Closing sudoserver.py\n" >&5
        sudo.py kill $(sudo.py pgrep.exe -f -l sudoserver.p[y] | grep "pgrep" -v | awk '{print $1}')
    fi
   else
    printf "sudoserver.py not running. Nothing to be done.\n" >&5
fi 

SUDOServerWatchDogScheduler.sh의 코드 :

#!/bin/bash

# ********** SUDOWatchDogScheduler.sh v0.04a **********

# Check if WatchDog is already scheduled
if [ $(schtasks.exe /query | grep "SUDOServerWatchDog">/dev/null 2>&5;printf $?) -eq 0 ]
   then
    # Yes. Remove it in order to create a new one.
        echo "Task SUDOServerWatchDog already existing." >&5
    echo "Removing task SUDOServerWatchDog..." >&5
    sudo.py schtasks.exe /delete /tn "SUDOServerWatchDog" /f >&5 2>&5
    if [ $? -eq 0 ]
       then
        # Task correctly deleted.
        echo "Task correctly removed." >&5
       else
        # Something failed in task creation. Report.
        echo "ERROR on deleting the SUDOServerWatchDog programmed task." >&5
    fi
fi
# Schedule new task for deletion.
echo "Adding new SUDOServerWatchDog task to trigger in 15 minutes." >&5
sudo.py schtasks /create /tn "SUDOServerWatchDog" /tr "SUDOServerWatchDog" /sc minute /mo 15 /sd 10/10/2010 /ru "SYSTEM" >&5 2>&5
if [ $? -eq 0 ]
   then
    # Task correctly scheduled.
    echo "Task SUDOServerWatchDog correctly scheduled." >&5
   else
    # Something failed in task scheduling. Report.
    echo "ERROR on scheduling programmed task SUDOServerWatchDog." >&5
fi 

CygWin Bash 쉘에서 프로그램을 테스트하십시오.

Luis@Kenobi ~
$ sudo ls -la
<UAC ELEVATION PROMPT APPEARS>
total 49
drwxr-xr-x+ 1 Luis  None     0 abr  7 02:23 .
drwxrwxrwt+ 1 Luis- None     0 abr  4 03:27 ..
-rw-------  1 Luis  None 13798 abr 14 00:31 .bash_history
-rwxr-xr-x  1 Luis  None  1494 mar  3 11:36 .bash_profile
-rwxr-xr-x  1 Luis  None  6260 abr  6 05:19 .bashrc
-rwxr-xr-x  1 Luis  None  1919 mar  3 11:36 .inputrc
-rw-------  1 Luis  None    35 abr  2 01:43 .lesshst
-rwxr-xr-x  1 Luis  None  1236 mar  3 11:36 .profile
drwx------+ 1 Luis  None     0 mar  8 01:49 .ssh
-rw-r--r--  1 Luis  None     7 mar  4 18:01 d:ppp.txt
-rw-r--r--  1 Luis  None    37 abr  7 02:23 my.log

NOTE2 :이 스크립트는 베타 버전으로 출시되었으므로 여전히 버그가 있으며 코드가 깨끗하지 않습니다. 어쨌든, 세 가지 다른 Windows 7 컴퓨터를 사용한 테스트에서 작동하는 것처럼 보입니다 (대부분).

프로그램에 대한 간단한 설명 :

  1. 별명으로 인해 sudo 명령을 수행 할 때 SUDO.sh 스크립트 가 호출됩니다.
  2. SUDO.sh SUDOServer.lnk 필요한 경우 "sudoserver.py" 를 열어 SUDOServer.sh를 호출 합니다.
  3. 원래 Sudo 명령 사용자가 호출이 실행됩니다.
  4. 그런 다음 SUDO.sh SUDOServerWatchDogScheduler.sh를 호출 하여 지정된 시간 (기본값 15 분) 이후에 SUDOServerWatchDog.sh가 실행되도록 예약 sudoserver.py합니다.
  5. 미리 정의 된 시간 후에 SUDOServerWatchDog.sh는 sudoserver.py를 닫습니다 . 실행중인 sudo 인스턴스 가 있으면 5 분 후에 새로 실행되도록 자체 프로그램됩니다.

해야 할 일 :

  • 모든 .sh, .cmd 및 .lnk 파일을 자동으로 작성하는 자체 설치 프로그램 .
  • 다른 잠금 파일 을 설정 하십시오 ($ TMP / lockfile.lck에 있음).
  • 구성 스크립트 또는 .config 파일을 추가 하십시오 (기본값은 시간 초과, 파일 위치 등).
  • 시스템 계정 동작 추가 (@ Wyatt8740 덕분에).
  • ¿ 적절한 경우 "fuser"로 "flock"(내부 잠금 SUDO 모드)을 변경 하시겠습니까?
  • 제안이 수락되었습니다.

보고 된 버그 :

  • bash 쉘 은 닫힐 때까지 실행중인 exit경우 입력 한 후에도 계속 열려 sudoserver.py있습니다. 임시 해결 방법을 환영합니다.

나는 희망을 누군가가 사용 나는 TOUACExt에 전념 한 프로그램 긴 시간.
개선 및 수정이 허용됩니다. 이 포럼의 잔소리를 멈추기 위해 코드를 게시 해야하는 위치
에 대한 제안 도 허용됩니다 ;-).

긴 글에 대해 죄송합니다. 나는 자유 시간이 많지 않으며이 프로젝트는 옷장에서 사라질 것입니다.


2
코드에 대한 피드백을 원하면 codereview.stackexchange.com에 게시하십시오. (사용 메모와 예제는 여기에있는 것이 좋습니다)
Ben Voigt

감사합니다, @ BenVoigt, 몰랐어요. 질문하십시오 : 내가하면 대부분의 게시물 이이 답변과 중복되어야한다고 생각합니다. 교차 게시로 간주됩니까?
Sopalajo de Arrierez

1
그것들을 서로 연결하십시오. 교차 게시의 피해는 사람들이 노력을 복제한다는 것입니다. 연결되어 있다면 문제가되지 않습니다
Ben Voigt

이것은 매우 좋은 해결책입니다. 파이썬이 필요하지 않은 경우 사용합니다. 파이썬에 대한 개인적이고 깊은 혐오가 있습니다. 좋은 언어이지만 개인적인 이유 때문에 나는 그것을 싫어합니다. 그럼에도 불구하고 다른 어느 누구도 파이썬을 싫어하지 않기 때문에 내 증오는 비이성적입니다. 솔루션은 내 것보다 실제에 더 가깝기 때문에 귀하의 솔루션을 찬성했습니다.
Wyatt8740

1
감사합니다, @CharlesRobertoCanato. 채팅에서 문제를 해결하기 위해 세부 정보를 알려주시겠습니까? 대화방 "TOUACExt-Windows 용 SuDo": chat.stackexchange.com/rooms/56716/touacext-sudo-for-windows
Sopalajo de Arrierez

1

간단한 sudo.bat (nircmd 사용)

Nircmd는 여기에서 다운로드 할 수 있습니다.
http://www.nirsoft.net/utils/nircmd.html

nircmd를 다운로드하고 이름 nircmdc.exenircmd.exe바꾸고 원본을 바 꾸었 습니다 nircmd.exe. 그런 다음로 옮겼습니다 C:\windows\system32.

또한 인수를 스크립트에 전달할 수 있도록 다음 배치 파일을 만들었습니다.

내 컴퓨터에서 UAC를 비활성화했다고 말하면 더 이상이 스크립트가 필요하지 않지만 Windows 8에서 작동합니다. cygwin에서도 작동합니다.

@echo off
if "%*" == "" goto error
nircmd elevate %*
goto thisiseof
:error
echo No arguments were given. Exiting.
:thisiseof

멋진 솔루션. 짧고 쉽습니다. 하지만 왜 간단하게 실패 sudo.bat dir합니까? "Windows에서 dir 파일을 찾을 수 없습니다"라는 오류 창이 나타납니다. 와 함께 작동하는 것 같지만 sudo echo Hello콘솔 출력이 없습니다.
Sopalajo de Arrierez

이 방법 의 작은 불편 은 연속 명령에서 UAC 프롬프트를 지속적으로 요청한다는 것입니다. TOUACExt는 기존 Linux sudo 실행과 매우 유사 하게이 문제를 해결 합니다. 기능 목록을 편집하여 표시했습니다.
Sopalajo de Arrierez

dirdir기술적으로 프로그램이 아니라 내장 DOS 명령 이기 때문에 작동 하지 않습니다. 리눅스 ls에서 DOS / 윈도우의 바이너리 프로그램 dir은 인터프리터 자체 (COMMAND.COM 또는 cmd.exe)에 의해 처리됩니다. dir.exe내 프로그램을 실행할 수 있는 곳 이 없습니다 . 그러나 cygwin의 경우 sudo ls충분합니다. 당신은 일을하지 않더라도 sudo cmdsudo bash또는 무엇이든 당신에게 프롬프트에 '관리자'수준을 얻어야한다. '관리자'도 'SYSTEM'아래에 있지만 'SYSTEM'에는을 사용하십시오 nircmd.exe elevatecmd runassystem <program.exe>. 또한, 나는 :) 내 컴퓨터에서 UAC를 해제
Wyatt8740

또한, 나는 echo창문에있는 프로그램 이라고 생각하지 않습니다 . COMMAND.COM/cmd.exe의 일부입니다. 나를 위해, 비록 Cygwin에서 사용하여 사용자 ls.exeecho.exe그것을 잘 작동합니다. 그리고 나는 실제로 오늘 몇 달 동안 처음으로 형제 계정에 파일을 관리하기 위해 그것을 사용했습니다. sudo.bat cmd다른 사용자에게 로그인하여 다른 사용자의 파일을 관리 할 수있는 관리자 수준 프롬프트를 표시하는 데 사용 했습니다.
Wyatt8740

시스템 계정에 대한 아이디어가 좋습니다. 옵션으로 TOUCExt에 추가하겠습니다.
Sopalajo de Arrierez

0

사용 가능한 솔루션에 만족하지 않아서 nu774의 스크립트 를 채택 하여 보안을 추가하고 설정 및 사용하기가 더 쉬워졌습니다. 이 프로젝트는 Github에서 가능 합니다

사용하려면 cygwin-sudo.py을 통해 다운로드 하여 실행하십시오 python3 cygwin-sudo.py **yourcommand**.

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

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.