web-dev-qa-db-ja.com

CygWinでSudoを使用(自動化)する実用的な(従来のLinuxに近い)方法

CygWinでSudoコマンドを使用できることは便利であり、昇格されたシェルを開くよりも高速です。

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 プロジェクトには、危険な可能性のある動作があります:それはserver/clientアーキテクチャ、実際、クライアント(Sudo)は、内部(ローカルコンピューターの外部でリッスンしていない)ポート7070TCPでサーバー(sudoserver.py)にコマンドの要求を送信します。 ユーザーまたは権限のチェックがないので、コンピューターにログインした人は誰でも(非特権ユーザーでも)admins(CygWinまたはWindows)シェルコマンドまたはスクリプト(CygWinまたはWindowsも)。
作成者の提案した方法を維持すると、問題は悪化します:「sudoserver.py」をサービスとして登録すると、永続的に実行し続けます。

だから、物事を少しより安全に(完全ではない)維持するために、私はします:
1.-管理シェルで「sudoserver.py」を実行します。
2.-別のCygWinシェルで「Sudo」コマンドを実行します。
3 .-「sudoserver.py」と管理シェルを閉じます(Ctrl + C)。

少し迷惑。 「sudoserver.py」を実行するhotkeyが割り当てられた.cmdファイルを使用して回避し、その後(手動で)閉じます私の管理職ですが、Linuxでの従来の「Sudo」の使いやすさにはまだほど遠いです。

優れた実用的な方法は、次のような方法です。

  1. ** UAC標高プロンプト(またはユーザー/パスワード)を要求する「sudoserver.py」を自動的に開きます。
  2. しばらくすると閉じますので、複数のSudoコマンドが連続して実行された場合でも、UAC要求が邪魔をし続けることはありません。

少なくとも部分的に、これを自動化する方法はありますか?

11

注:これは主に私が作成したプログラム(シェルスクリプト)であり、このフォーラムはプログラム紹介サイトというよりも質疑応答サイトであることを私は知っています。しかし、私はGitHub(または同様の)アカウントを持っていません。また、オープンソースプログラムをコミュニティに公開する方法について調査する時間もありませんでした。ですから、実用的で便利なプログラムが、それを楽しむことができる人に(数ヶ月間でも)見過ごされ続けるリスクがあり、すでに作成されたプログラムを共有しないのは悲しいことである限り、私は公開するここ今のところ。管理者がこのスレッドを削除することを決定した場合、私にとって問題はありません、私は理解します。このフォーラムに役立つように、この問題を質問-回答の方法で表現したいと思います。 興味のあるユーザーが十分にある場合は、プロジェクトを継続するに時間を割くように最善を尽くします(すべての調査の結果、インターネット上でこれに最も近いものは見つかりませんでしたが、まあ。 。自分のスクリプトが価値があるのか​​、それとも時間の無駄だったのかわかりません)。

CygWinで(今まで)動作し、CygWinのタイムアタック間隔のSudoを減らすのに役立つ単純なLinuxシェルスクリプトをプログラムしました。プログラムの名前はTOUACExt( "TimeOut and UAC Extension"の頭字語)で、Sudo for CygWinのラッパー(インストールが必要)として機能し、実際には4つのセットで構成されています。 .shプログラム。

Example of TOUACExt execution

特徴

  • 快適な使用法:Linuxからの元のSudoの動作をシミュレートすることにより、UACの確認要求プロンプトは1回だけ表示されます(複数の連続するSudoコマンドは1つのUAC要求のみを生成します)。 sudoserver.pyが実行され続ける限り(デフォルトでは15分)、ACはもうありませんリクエストがあります。
  • 特権(管理者)ユーザーのみAC確認を取得画面上で要求(はい/いいえ)。
  • 非特権(非管理者)ユーザー管理者アカウント/パスワードを取得入力画面。
  • sudoserver.pyは実行を継続し、最後のSudoコマンドの実行から事前定義された時間(15分)後に自動的に閉じます
  • Sudoの任意のインスタンスが実行されている場合、sudoserver.pyは閉じません(実行を継続し、5分後に再度チェックします)。
  • リモートで動作します(SSH経由でテスト済み):
    • 非特権ユーザーsudoserver.pyをリモートで起動できません。
  • /var/log/SUDOForCygWin/に(まだ単純であまり読みにくい)logを作成します。

要件(CygWinの場合)::

  • CygWin のSudo。
  • pgrep(procpsパッケージ)。
  • 群れ(util-linuxパッケージ)。
  • Nohup(CygWinにデフォルトでインストールされていると思いますが、わかりません)。

仮定:-作成者が提案したパス上のSudo for CygWinプロジェクトの2つのプログラム:

/usr/local/bin/sudoserver.py
/usr/local/bin/Sudo

TOUACExtは、Windows 7SP1およびWindows XP SP3で動作テスト済みですが、この最後のもので使用することに意味があるかどうかはわかりません。

インストール手順

  • このスクリプト(推奨名:SUDOServer.cmd)を配置し、SUDOServer.lnkという名前のショートカット(必要に応じてアイコンをパーソナライズできます)を作成します(このショートカットで有効にする必要がありますAdvanced Options --> Execute as AdministratorWindowsパス上の任意の場所したがって、sudoserver.pyはWindowsから直接要求できます。

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

  • 4つの.shTOUACExtのスクリプトをパスに配置します。次に例を示します。

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

  • 元の名前を変更しますPythonスクリプトをSudoからSudo.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 BashShellからプログラムをテストします。

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

注2:これらのスクリプトはpre-betaリリースであるため、まだバグがあり、コードはあまりクリーンではありません。とにかく、3台の異なるWindows 7コンピューターを使用した私のテストでは、(ほとんど)問題なく動作しているようです。

プログラムの簡単な説明

  1. エイリアスが原因で、Sudoコマンドを実行するとSudo.shスクリプトが呼び出されます。
  2. Sudo.shSUDOServer.shを呼び出します、必要に応じて(SUDOServer.lnk経由で)「sudoserver.py」を開きます。
  3. ユーザーが呼び出した元のSudoコマンドが実行されます。
  4. 次に、Sudo.shSUDOServerWatchDogScheduler.shを呼び出しますは、指定された時間(デフォルトでは15分)後にSUDOServerWatchDog.shを実行するようにスケジュールしてsudoserver.pyを閉じます。
  5. 事前定義された時間の後、SUDOServerWatchDog.shsudoserver.pyを閉じますSudo実行中のインスタンスがある場合は、5分後に新しい実行のためにプログラムします。

やること

  • セルフインストーラーすべての.sh、.cmd、および.lnkファイルを自動的に作成します。
  • ロックファイルを他のものに確立します($ TMP/lockfile.lckにあります)。
  • 構成スクリプトまたは.configファイルを追加します(タイムアウト、ファイルの場所などのデフォルトの場合)。
  • システムアカウントの動作を追加します(ありがとう、@ Wyatt8740)。
  • ¿必要に応じて、「flock」(内部ロックSudoモード)を「fuser」に変更しますか?
  • 提案受け入れました。

報告バグ

  • sudoserver.pyが実行されている場合、bashシェルはexitを入力した後も、閉じるまで開いたままになります。暫定的な回避策は大歓迎です。

私は誰かが使用するだろう私がTOUACExtに捧げてきた長時間のプログラミングを願っています。
機能強化と修正受け入れられました。
どこに公開すればよいかこのフォーラムのしつこいことをやめるためのコードについての提案も受け入れられました;-)。

長い投稿でごめんなさい。余暇はあまりないので、このプロジェクトはクローゼットの中に消えてしまいました(多分何年もの間、誰が知っていますか?)。

10

SIMPLE Sudo.bat(nircmdを使用)

Nircmdはここからダウンロードできます:
http://www.nirsoft.net/utils/nircmd.html

Nircmdをダウンロードし、nircmdc.exeの名前をnircmd.exeに変更し、元のnircmd.exeを置き換えました。次に、それをC:\windows\system32に移動しました。

また、次のバッチファイルを作成して、引数をスクリプトに渡すことができるようにしました。

自分のマシンでUACを無効にしたので、このスクリプトはもう必要ありませんが、Windows8では機能します。cygwinでも同様に機能します。

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

利用可能なソリューションに不満を持っていたので、セキュリティを追加し、セットアップと使用を簡単にするために nu774のスクリプト を採用しました。プロジェクトが利用可能です Github上

使用するには、 cygwin-Sudo.py をダウンロードし、python3 cygwin-Sudo.py **yourcommand**を介して実行します。

便宜上、エイリアスを設定できます。

alias Sudo="python3 /path-to-cygwin-Sudo/cygwin-Sudo.py"
0
Chronial