NOT: Bu çoğunlukla yaptığım bir program (kabuk betiği) ve bu forumun bir program tanıtım programından çok bir soru-cevap sitesi olduğunu biliyorum. Ancak GitHub (veya benzeri) hesabım yok ya da topluluğa bir Açık Kaynak programı yayınlama yöntemini araştırmak için zamanım olmadı. Yani, sürece bir çalışma ve kullanışlı bir program zevk verebilir ve zaten yapılmış bir program paylaşmayan üzücü olurdu edenlere (hatta aylarca) farkedilmeden tutar riski vardır, ben gidiyorum burada yayınlamak için şimdi. Yöneticiler bu konuyu kaldırmaya karar verirse benim için sorun yok, anlayacağım. Konuyu bu foruma faydalı olacak kadar soru-cevap şeklinde ifade etmeyi umuyorum
. Yeterince varsailgilenen kullanıcılar , projeye devam etmek için biraz zaman ayırmak için elimden geleni yapacağım (tüm araştırmalarımdan sonra, internette buna en yakın bir şey bulamadım, ama, iyi ... Senaryomun değerli olup olmadığını bilmiyorum ya da zaman kaybı oldu).
CygWin üzerinde (şimdiye kadar) çalışan ve (umarım) CygWin zaman saldırı aralığı için SUDO azaltmaya yardımcı olan basit bir Linux kabuk komut dosyası programladım . Programın adı TOUACExt (" TimeOut ve UAC Extension " kısaltmasıdır ) ve CygWin için SUDO için bir sarıcı görevi görür (yüklü) ve gerçekten dört .sh
programdan oluşur.
Özellikler :
- Rahat kullanım : Orijinal sudo'yu Linux davranışından simüle ederek, UAC onay isteği istemi yalnızca bir kez görünür (art arda birden çok
sudo
komut yalnızca bir UAC isteği oluşturur). Sudoserver.py çalışmaya devam ettiği sürece (varsayılan olarak 15 dakika), artık UAC isteği olmayacaktır .
- Ayrıcalıklı (Yönetici) kullanıcılar ekranda yalnızca UAC onay isteği ( Evet / Hayır ) alır.
- Ayrıcalıklı olmayan (Yönetici olmayan) kullanıcılar Yönetici hesabı / şifre giriş ekranı alır.
- sudoserver.py çalışmaya devam eder, ardından son sudo komutunun yürütülmesinden önceden belirlenmiş süre (15 dakika) sonra otomatik olarak kapanır .
- Sudoerver.py herhangi bir sudo çalışması durumunda kapanmaz (çalışmaya devam eder ve 5 dakika içinde tekrar kontrol eder) .
- Uzaktan çalışır (SSH ile test edilmiştir):
- Ayrıcalıklı kullanıcılar sudoserver.py dosyasını uzaktan başlatamaz.
- Bir (henüz basit ve çok okunabilir değil) oluşturur günlüğü de
/var/log/SUDOForCygWin/
.
Gereksinimler (CygWin'de):
- CygWin için SUDO .
- pgrep (
procps
pakette).
- sürü (
util-linux
pakette).
- nohup (CygWin'de varsayılan olarak yüklendiğini düşünüyorum , ancak emin değilim).
Varsayım : - SUDO for CygWin projesinin yazar tarafından önerilen yolda iki programı:
/usr/local/bin/sudoserver.py
/usr/local/bin/sudo
TOUACExt , Windows 7 SP1 ve Windows XP SP3 üzerinde çalışırken test edilmiştir , ancak bu sonuncusunda kullanmanın anlamlı olup olmadığını bilmiyorum.
Kurulum talimatları :
Bu komut dosyasını (önerilen ad:) koyun SUDOServer.cmd
ve Windows yolunuzun herhangi bir yerinde adlandırılmış bir kısayol (isterseniz simgesini kişiselleştirebilirsiniz) oluşturun SUDOServer.lnk
(bu kısayolda etkinleştirmeniz gerekir Advanced Options --> Execute as Administrator
) , böylece doğrudan Windows'dan istenebilir:sudoserver.py
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
TOUACExt dosyasının dört .sh betiğini yola koyun, örneğin:
/usr/local/bin/SUDO.sh
/usr/local/bin/SUDOServer.sh
/usr/local/bin/SUDOServerWatchDog.sh
/usr/local/bin/SUDOServerWatchDogScheduler.sh
Orijinal yeniden adlandırma gelen Python komut dosyası sudo
için sudo.py
:
mv /usr/local/bin/sudo /usr/local/bin/sudo.py
UYARI: Orijinal "sudo" Python betiği, yolunuzun hiçbir yerinde kalmamalı veya bunun yerine yürütülebilir.
Bu takma adı oluşturun (örneğin, manuel olarak veya düzenleyerek ~/.bashrc
):
alias sudo='SUDO.sh'
SUDO.sh kodu :
#!/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 kodu :
#!/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 kodu :
#!/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 kodu :
#!/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
Programı bir CygWin Bash kabuğundan test edin:
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
NOT2: Bu komut dosyaları beta öncesi sürümdedir , bu yüzden hala buggy ve kod çok temiz değil. Her neyse, üç farklı Windows 7 bilgisayar ile yaptığım testlerde (çoğunlukla) çalışıyor gibi görünüyorlar.
Programın kısa açıklaması :
- Diğer ad nedeniyle, bir sudo komutu gerçekleştirilirken SUDO.sh betiği çağrılır.
- SUDO.sh , gerekirse "sudoserver.py" dosyasını açarak SUDOServer.sh dosyasını çağırır
SUDOServer.lnk
.
- Orijinal sudo komutu kullanıcı tarafından çağrılan yürütülür.
- Sonra SUDO.sh SUDOServerWatchDogScheduler.sh çağırır , bu SUDOServerWatchDog.sh belirtilen süre (varsayılan 15 dakika) kapanış sonra yürütme için zamanlar
sudoserver.py
.
- Önceden tanımlanmış süreden sonra, SUDOServerWatchDog.sh sudoserver.py dosyasını kapatır . Herhangi bir sudo çalışması örneği varsa , 5 dakika sonra yeni yürütme için kendini programlar.
Yapılacaklar :
- Tüm .sh, .cmd ve .lnk dosyalarını otomatik olarak oluşturan kendi kendine yükleyici .
- Kurmak kilit dosyası (o $ TMP / lockfile.lck vardır) bazı diğer.
- Bir yapılandırma komut dosyası veya .config dosyası ekleyin (zaman aşımlarındaki varsayılanlar, dosya konumları ... vb.).
- Sistem hesabı davranışını ekleyin (teşekkürler, @ Wyatt8740).
- "" Flok "(dahili kilitleme SUDO modu) uygun olan yerlerde" kaynaştırıcı "ile değiştirilsin mi?
- Öneriler kabul edildi.
Bildirilen Hatalar :
- Bash kabuk bile inputing sonra açık tutar
exit
eğer sudoserver.py
o kapatana kadar çalışıyor. Geçici çözümler kabul edilir.
Umarım birisi TOUACExt'e tahsis ettiğim uzun süreli programlamayı kullanır.
Düzeltmeler ve düzeltmeler kabul edildi. Nerede bu forum nagging durdurmak için kodu yayınlamak gitmeli
hakkında öneriler de kabul ;-).
Uzun yazı için özür dilerim. Fazla boş zamanım yok ve bu proje dolabımda kaybolmakla ilgiliydi (belki yıllarca kim bilir?).