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」の使いやすさにはまだほど遠いです。
優れた実用的な方法は、次のような方法です。
Sudo
コマンドが連続して実行された場合でも、UAC要求が邪魔をし続けることはありません。少なくとも部分的に、これを自動化する方法はありますか?
注:これは主に私が作成したプログラム(シェルスクリプト)であり、このフォーラムはプログラム紹介サイトというよりも質疑応答サイトであることを私は知っています。しかし、私はGitHub(または同様の)アカウントを持っていません。また、オープンソースプログラムをコミュニティに公開する方法について調査する時間もありませんでした。ですから、実用的で便利なプログラムが、それを楽しむことができる人に(数ヶ月間でも)見過ごされ続けるリスクがあり、すでに作成されたプログラムを共有しないのは悲しいことである限り、私は公開するここ今のところ。管理者がこのスレッドを削除することを決定した場合、私にとって問題はありません、私は理解します。このフォーラムに役立つように、この問題を質問-回答の方法で表現したいと思います。 興味のあるユーザーが十分にある場合は、プロジェクトを継続するに時間を割くように最善を尽くします(すべての調査の結果、インターネット上でこれに最も近いものは見つかりませんでしたが、まあ。 。自分のスクリプトが価値があるのか、それとも時間の無駄だったのかわかりません)。
CygWinで(今まで)動作し、CygWinのタイムアタック間隔のSudoを減らすのに役立つ単純なLinuxシェルスクリプトをプログラムしました。プログラムの名前はTOUACExt( "TimeOut and UAC Extension"の頭字語)で、Sudo for CygWinのラッパー(インストールが必要)として機能し、実際には4つのセットで構成されています。 .sh
プログラム。
特徴:
Sudo
コマンドは1つのUAC要求のみを生成します)。 sudoserver.pyが実行され続ける限り(デフォルトでは15分)、ACはもうありませんリクエストがあります。/var/log/SUDOForCygWin/
に(まだ単純であまり読みにくい)logを作成します。要件(CygWinの場合)::
procps
パッケージ)。util-linux
パッケージ)。仮定:-作成者が提案したパス上の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 Administrator
)Windowsパス上の任意の場所したがって、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コンピューターを使用した私のテストでは、(ほとんど)問題なく動作しているようです。
プログラムの簡単な説明:
SUDOServer.lnk
経由で)「sudoserver.py」を開きます。sudoserver.py
を閉じます。やること:
報告バグ:
sudoserver.py
が実行されている場合、bashシェルはexit
を入力した後も、閉じるまで開いたままになります。暫定的な回避策は大歓迎です。私は誰かが使用するだろう私がTOUACExtに捧げてきた長時間のプログラミングを願っています。
機能強化と修正受け入れられました。
どこに公開すればよいかこのフォーラムのしつこいことをやめるためのコードについての提案も受け入れられました;-)。
長い投稿でごめんなさい。余暇はあまりないので、このプロジェクトはクローゼットの中に消えてしまいました(多分何年もの間、誰が知っていますか?)。
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
利用可能なソリューションに不満を持っていたので、セキュリティを追加し、セットアップと使用を簡単にするために nu774のスクリプト を採用しました。プロジェクトが利用可能です Github上
使用するには、 cygwin-Sudo.py
をダウンロードし、python3 cygwin-Sudo.py **yourcommand**
を介して実行します。
便宜上、エイリアスを設定できます。
alias Sudo="python3 /path-to-cygwin-Sudo/cygwin-Sudo.py"