注:これは主に私が作成したプログラム(シェルスクリプト)であり、このフォーラムはプログラムの紹介サイトというよりも質問応答サイトであることを知っています。しかし、私はGitHub(または同様の)アカウントを持っていませんし、オープンソースプログラムをコミュニティに公開する方法について研究する時間もありませんでした。そのため、実用的で有用なプログラムが、それを楽しむことができる人に(数か月間でも)気付かれないリスクがあり、すでに作成されたプログラムを共有しないのが悲しい場合は、ここで公開します。今。管理者がこのスレッドを削除することを決定した場合、私にとって問題はありません、私は理解します。このフォーラムで役立つように、質問と回答の方法で問題を表現したいと思ってい
ます。十分ある場合興味のあるユーザー、私はプロジェクトを継続するためにいくらかの時間を捧げるために最善を尽くします(すべての研究の後、私はインターネットでこれに最も近いものを見つけていませんが、まあ...私のスクリプトが貴重であるかどうかわかりません時間の無駄でした)。
CygWinで動作する(今まで)簡単なLinuxシェルスクリプトをプログラムし、CygWinの時間攻撃間隔のSUDOを減らすのに役立ちます(願っています)。このプログラムの名前はTOUACExt(「TimeOut and UAC Extension」の頭字語)であり、CygWinのSUDOのラッパーとして機能し(インストールが必要)、実際には4つの.sh
プログラムのセットで構成されています。
特徴:
- 快適な使用法:Linuxの動作からの元のsudoをシミュレートすることにより、UAC確認要求プロンプトは1回だけ表示されます(複数の連続した
sudo
コマンドは1つのUAC要求のみを生成します)。sudoserver.pyが実行されている限り(デフォルトでは15分)、UAC要求はこれ以上ありません。
- 特権(管理)ユーザーは、画面でUAC確認要求(Yes / No)のみを取得します。
- 特権のない(非管理者)ユーザーは、管理者アカウント/パスワード入力画面を取得します。
- sudoserver.pyは実行を継続し、最後のsudoコマンドの実行から事前定義された時間(15分)後に自動的に閉じます。
- sudoのインスタンスが実行されている場合、sudoserver.pyは閉じません(実行を続け、5分後に再度チェックします)。
- リモートで動作します(SSHでテスト済み):
- 権限のないユーザーは、sudoserver.pyをリモートで起動できません。
- で(まだシンプルで読みにくい)ログを作成します
/var/log/SUDOForCygWin/
。
要件(CygWin):
- CygWinのSUDO。
- pgrep(
procps
パッケージで)。
- flock(
util-linux
パッケージで)。
- nohup(CygWinにデフォルトでインストールされると思いますが、わかりません)。
想定:-著者によって提案されたパス上のCygWinプロジェクトのSUDOの2つのプログラム:
/usr/local/bin/sudoserver.py
/usr/local/bin/sudo
TOUACExtは、Windows 7 SP1およびWindows XP SP3で動作することがテストされていますが、この最後の1つで使用することに意味があるかどうかはわかりません。
インストール手順:
このスクリプト(推奨される名前:)を入れて、名前付きSUDOServer.cmd
のショートカット(必要に応じてアイコンをカスタマイズできます)を作成しますSUDOServer.lnk
(このショートカットで有効にする必要があります)Advanced Options --> Execute as Administrator
)Windowsのパス上のどこでも、そのsudoserver.py
直接のWindowsから要求することができます。
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
TOUACExtの 4つの.sh スクリプトをパスに配置します。次に例を示します。
/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 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
注2:これらのスクリプトは ベータ版より前のリリースにあるため、まだバグが多く、コードはあまりきれいではありません。とにかく、3つの異なるWindows 7コンピューターを使用したテストでは、(ほとんど)正常に動作しているようです。
簡単な プログラムの説明:
- エイリアスのため、sudoコマンドを実行するとき 、SUDO.shスクリプトが呼び出されます。
- SUDO.sh は呼び出し、
SUDOServer.lnk
必要に応じて「sudoserver.py」を(経由で)開きます。
- の オリジナルsudoコマンドユーザによって呼び出さが実行されます。
- 次に、SUDO.sh が SUDOServerWatchDogScheduler.shを呼び出します、指定された時間(デフォルトでは15分)が終了した後、SUDOServerWatchDog.shの実行をスケジュールします
sudoserver.py
。
- 事前定義された時間が経過すると、SUDOServerWatchDog.shはsudoserver.pyを閉じます。実行中のsudoのインスタンスがある場合中、5分後に新しい実行のためにプログラム自体をプログラムします。
やること:
- セルフインストーラーすべての.sh、.cmd、および.lnkファイルを自動的に作成する。
- 確立する ロックファイルを他の場所にます($ TMP / lockfile.lckにあります)。
- を追加 構成スクリプトまたは.configファイルます(タイムアウトのデフォルト、ファイルの場所など)。
- システムアカウントの動作を追加します(ありがとう、@ Wyatt8740)。
- ¿必要に応じて、「flock」(内部ロックSUDOモード)を「fuser」に変更しますか?
- 提案受け入れられました。
報告されたバグ:
- bashシェルは、以下を入力した後でも開いたまま
exit
です。sudoserver.py
、閉じるまで実行されているなります。暫定的な回避策は大歓迎です。
TOUACExt専用の長時間のプログラミングを誰かが使用してくれることを願っています。
拡張および修正が受け入れられました。
についての提案このフォーラムのしつこいをやめるためにコードをどこに公開すべきかも受け入れられました;-)。
長い投稿でごめんなさい。暇がないので、このプロジェクトはクローゼットから消えてしまいました(長年、誰が知っているのでしょうか?)。