หมายเหตุ: นี่เป็นโปรแกรมส่วนใหญ่(เชลล์สคริปต์) ที่ฉันทำและฉันรู้ว่าฟอรัมนี้เป็นไซต์ตอบคำถามมากกว่าการแนะนำโปรแกรม แต่ฉันไม่มีบัญชี GitHub (หรือคล้ายกัน) และฉันไม่มีเวลาค้นคว้าเกี่ยวกับวิธีการเผยแพร่โปรแกรมโอเพ่นซอร์สให้กับชุมชน ดังนั้นตราบใดที่มีความเสี่ยงที่โปรแกรมที่ทำงานและมีประโยชน์จะไม่สังเกตเห็น (แม้เป็นเดือน) กับผู้ที่สนุกกับมันและมันจะเศร้าที่ไม่แบ่งปันโปรแกรมที่ทำไปแล้วฉันจะเผยแพร่ที่นี่เพื่อ ตอนนี้ ไม่มีปัญหาสำหรับฉันหากผู้ดูแลระบบตัดสินใจที่จะลบกระทู้นี้ฉันจะเข้าใจ ฉันหวังว่าจะได้พูดเรื่องนี้
ด้วยวิธีตอบคำถามให้มากพอที่จะทำให้เป็นประโยชน์ต่อฟอรัมนี้ หากมีเพียงพอผู้ใช้ที่สนใจฉันจะทำให้ดีที่สุดเพื่ออุทิศเวลาในการดำเนินโครงการต่อไป (หลังจากการวิจัยทั้งหมดของฉันฉันไม่พบสิ่งใดที่ใกล้เคียงกับสิ่งนี้ทางอินเทอร์เน็ต แต่ก็ดี ... ฉันไม่รู้ว่าสคริปต์ของฉันมีค่าหรือ มันเสียเวลา)
ฉันได้ตั้งโปรแกรมสคริปต์เชลล์ Linux อย่างง่ายที่ใช้งานได้ (จนถึงตอนนี้) บน CygWin และช่วย (ฉันหวังว่า) ลด SUDO สำหรับ CygWin ช่วงเวลาโจมตีระยะเวลา โปรแกรมนี้ชื่อTOUACExt (ตัวย่อของ " TimeOut และ UAC Extension ") และทำหน้าที่เป็นwrapper สำหรับ SUDO สำหรับ CygWin (จำเป็นต้องติดตั้ง) และประกอบด้วยชุดของ.sh
โปรแกรมสี่โปรแกรมจริงๆ
คุณสมบัติ :
- การใช้งานที่สะดวกสบาย : ด้วยการจำลอง sudo ดั้งเดิมจากพฤติกรรมของ Linux การร้องขอการยืนยัน UAC จะปรากฏขึ้นเพียงครั้งเดียว (
sudo
คำสั่งที่ต่อเนื่องกันหลายคำสั่งจะสร้างคำขอ UAC เพียงครั้งเดียว) ตราบใดที่ sudoserver.py ยังคงทำงานต่อไป (ค่าเริ่มต้น 15 นาที) จะไม่มีการร้องขอUACอีก
- ผู้ใช้ที่มีสิทธิ์ (ผู้ดูแลระบบ) เท่านั้นจะได้รับคำขอการยืนยัน UAC ( ใช่ / ไม่ใช่ ) บนหน้าจอ
- ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษ (ไม่ใช่ผู้ดูแลระบบ) จะได้รับหน้าจอบัญชีผู้ดูแลระบบ / รหัสผ่าน
- sudoserver.py ยังคงทำงานอยู่จากนั้นจะปิดโดยอัตโนมัติหลังจากเวลาที่กำหนดไว้ล่วงหน้า (15 นาที) จากการดำเนินการคำสั่ง sudo ครั้งสุดท้าย
- sudoserver.py ไม่ปิด (ทำงานต่อไปและจะตรวจสอบอีกครั้งใน 5 นาที) ในกรณีที่มีการเรียกใช้sudo
- ทำงานจากระยะไกล (ทดสอบผ่าน SSH):
- ผู้ใช้ที่ไม่มีสิทธิพิเศษไม่สามารถเริ่ม sudoserver.py ได้จากระยะไกล
- สร้าง (ยังง่ายและไม่สามารถอ่านได้มาก) เข้าสู่ระบบ
/var/log/SUDOForCygWin/
ที่
ข้อกำหนด (ใน CygWin):
- Sudo สำหรับ Cygwin
- 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
สามารถร้องขอได้โดยตรงจาก Windows:
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
วางสคริปต์. sh ทั้งสี่ของ TOUACExtไว้บนพา ธ ตัวอย่างเช่น:
/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
คำเตือน: สคริปต์ Python "sudo" ดั้งเดิมจะต้องไม่อยู่ที่ใดในพา ธ ของคุณไม่เช่นนั้นจะสามารถดำเนินการแทนได้
สร้างนามแฝงนี้ (เช่นด้วยตนเองหรือโดยการแก้ไขของคุณ~/.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 สามเครื่องพวกเขาดูเหมือนจะใช้งานได้ (ส่วนใหญ่) ตกลง
คำอธิบายสั้น ๆของโปรแกรม:
- เนื่องจากนามแฝงเมื่อดำเนินการคำสั่ง sudo สคริปต์ SUDO.shจะถูกเรียกใช้
- SUDO.sh เรียก SUDOServer.shเปิด (ผ่าน
SUDOServer.lnk
) "sudoserver.py" หากจำเป็น
- คำสั่ง sudo เดิมเรียกโดยผู้ใช้จะถูกดำเนินการ
- จากนั้น SUDO.sh เรียก SUDOServerWatchDogScheduler.shที่ตาราง SUDOServerWatchDog.sh สำหรับการดำเนินการหลังจากเวลาที่กำหนด (15 นาทีเริ่มต้น)
sudoserver.py
ใกล้
- หลังจากเวลาที่กำหนดไว้ล่วงหน้า SUDOServerWatchDog.sh ปิด sudoserver.py หากมีอินสแตนซ์ใด ๆของ sudo กำลังทำงานอยู่มันจะเขียนโปรแกรมเองสำหรับการดำเนินการใหม่หลังจาก 5 นาที
สิ่งที่ต้องทำ :
- ตัวติดตั้งด้วยตนเองที่สร้างไฟล์. sh, .cmd และ. lnk ทั้งหมดโดยอัตโนมัติ
- สร้างล็อกไฟล์ให้บาง ๆ (เป็น $ TMP / lockfile.lck)
- เพิ่มสคริปต์การกำหนดค่าหรือไฟล์. config (สำหรับค่าเริ่มต้นในการหมดเวลาตำแหน่งไฟล์ ... ฯลฯ )
- เพิ่มพฤติกรรมบัญชีระบบ (ขอบคุณ @ Wyatt8740)
- ¿เปลี่ยน "ฝูง" (โหมด SUDO ล็อคภายใน) ด้วย "fuser" ตามความเหมาะสมหรือไม่
- ยอมรับคำแนะนำแล้ว
รายงานข้อบกพร่อง :
- เปลือกทุบตีช่วยให้เปิดแม้หลังจาก inputing
exit
ถ้าsudoserver.py
จะทำงานจนกว่าจะปิด ยินดีต้อนรับการแก้ไขชั่วคราว
ฉันหวังว่าบางคนจะใช้การเขียนโปรแกรมเป็นเวลานานที่ฉันทุ่มเทให้กับ TOUACExt ยอมรับ
การปรับปรุงและแก้ไขแล้ว
คำแนะนำเกี่ยวกับที่ฉันควรไปเผยแพร่รหัสเพื่อหยุดจู้จี้ยอมรับฟอรั่มนี้เกินไป ;-)
ขออภัยสำหรับการโพสต์ยาว ฉันไม่มีเวลาว่างมากและโครงการนี้เกี่ยวกับหายไปในตู้เสื้อผ้าของฉัน (อาจเป็นเวลาหลายปีใครจะรู้?)