ใช้งานได้จริง (ใกล้กับ Linux คลาสสิกมากที่สุด) วิธีใช้ (อัตโนมัติ) SUDO สำหรับ CygWin


11

ความสามารถในการใช้sudoคำสั่งในCygWin นั้นมีประโยชน์และเร็วกว่าการเปิดเชลล์ที่ยกระดับ:

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.

ดังที่แสดงด้านบนคุณสามารถเรียกใช้คำสั่ง / สคริปต์ของ Windows ได้เช่นเดียวกับ Linux สำหรับฉันเรียบร้อย ทำงานบนคอนโซลระยะไกล (SSH) และอนุญาตให้รวมคำสั่งWindows / Linux ดังนั้นความสามารถในการดำเนินงานการบริหารจึงเป็นสิ่งจำเป็น

แต่โครงการSUDO for CygWinมีพฤติกรรมที่อาจเป็นอันตราย : มันทำงานเป็นสถาปัตยกรรมเซิร์ฟเวอร์ / ไคลเอนต์ในความเป็นจริงลูกค้า (sudo) ส่งคำขอของคำสั่งไปยังเซิร์ฟเวอร์ (sudoserver.py) ที่ภายใน (ไม่ฟังนอก คอมพิวเตอร์เฉพาะที่) พอร์ต 7070TCP ที่ไม่มีการตรวจสอบผู้ใช้หรือการอนุญาตดังนั้นใครก็ตาม (แม้แต่ผู้ใช้ที่ไม่มีสิทธิพิเศษ) ที่ล็อกอินเข้าสู่คอมพิวเตอร์สามารถเรียกใช้คำสั่งเชลล์หรือสคริปต์ (CygWin หรือ Windows ของผู้ดูแลระบบ (CygWin หรือ Windows)
ปัญหาจะแย่ลงถ้าคุณใช้วิธีการของผู้เขียนที่แนะนำ: การลงทะเบียน "sudoserver.py" เป็นบริการดังนั้นมันจะทำงานอย่างถาวร

ดังนั้นเพื่อรักษาสิ่งต่าง ๆ ให้ปลอดภัยยิ่งขึ้น (ไม่ทั้งหมด) ฉันจะทำดังนี้:
1.- ดำเนินการ "sudoserver.py" บนเชลล์ผู้ดูแลระบบ
2.- ดำเนินการคำสั่ง "sudo" ของฉันบน CygWin shell อื่น
3.- ปิด (Ctrl + C) "sudoserver.py" และเชลล์ผู้ดูแลระบบ

บิตที่น่ารำคาญ ฉันกำลังแก้ไขมันโดยใช้.cmdไฟล์ที่มีฮอตคีย์ที่กำหนดว่า "sudoserver.py" และฉันกำลังปิด (ด้วยตนเอง) หลังจากงานบริหารของฉัน แต่ก็ยังห่างไกลจากการใช้งาน"sudo" แบบคลาสสิกบน Linux

วิธีที่ยอดเยี่ยมและเป็นประโยชน์จะเป็นวิธีการบางอย่างที่:

  1. ** เปิด "sudoserver.py" อัตโนมัติเพื่อขอการยกระดับ UAC (หรือผู้ใช้ / รหัสผ่าน)
  2. ปิดหลังจากนั้นครู่หนึ่งคำร้องขอ UAC จะไม่รบกวนในกรณีที่sudoคำสั่งหลายคำสั่งดำเนินการตามลำดับ

จะมีวิธีการใด ๆโดยอัตโนมัตินี้อย่างน้อยบางส่วน?

คำตอบ:


10

หมายเหตุ: นี่เป็นโปรแกรมส่วนใหญ่(เชลล์สคริปต์) ที่ฉันทำและฉันรู้ว่าฟอรัมนี้เป็นไซต์ตอบคำถามมากกว่าการแนะนำโปรแกรม แต่ฉันไม่มีบัญชี GitHub (หรือคล้ายกัน) และฉันไม่มีเวลาค้นคว้าเกี่ยวกับวิธีการเผยแพร่โปรแกรมโอเพ่นซอร์สให้กับชุมชน ดังนั้นตราบใดที่มีความเสี่ยงที่โปรแกรมที่ทำงานและมีประโยชน์จะไม่สังเกตเห็น (แม้เป็นเดือน) กับผู้ที่สนุกกับมันและมันจะเศร้าที่ไม่แบ่งปันโปรแกรมที่ทำไปแล้วฉันจะเผยแพร่ที่นี่เพื่อ ตอนนี้ ไม่มีปัญหาสำหรับฉันหากผู้ดูแลระบบตัดสินใจที่จะลบกระทู้นี้ฉันจะเข้าใจ ฉันหวังว่าจะได้พูดเรื่องนี้ ด้วยวิธีตอบคำถามให้มากพอที่จะทำให้เป็นประโยชน์ต่อฟอรัมนี้ หากมีเพียงพอผู้ใช้ที่สนใจฉันจะทำให้ดีที่สุดเพื่ออุทิศเวลาในการดำเนินโครงการต่อไป (หลังจากการวิจัยทั้งหมดของฉันฉันไม่พบสิ่งใดที่ใกล้เคียงกับสิ่งนี้ทางอินเทอร์เน็ต แต่ก็ดี ... ฉันไม่รู้ว่าสคริปต์ของฉันมีค่าหรือ มันเสียเวลา)

ฉันได้ตั้งโปรแกรมสคริปต์เชลล์ Linux อย่างง่ายที่ใช้งานได้ (จนถึงตอนนี้) บน CygWin และช่วย (ฉันหวังว่า) ลด SUDO สำหรับ CygWin ช่วงเวลาโจมตีระยะเวลา โปรแกรมนี้ชื่อTOUACExt (ตัวย่อของ " TimeOut และ UAC Extension ") และทำหน้าที่เป็นwrapper สำหรับ SUDO สำหรับ CygWin (จำเป็นต้องติดตั้ง) และประกอบด้วยชุดของ.shโปรแกรมสี่โปรแกรมจริงๆ

ตัวอย่างของการดำเนินการ TOUACExt

คุณสมบัติ :

  • การใช้งานที่สะดวกสบาย : ด้วยการจำลอง 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 สามเครื่องพวกเขาดูเหมือนจะใช้งานได้ (ส่วนใหญ่) ตกลง

คำอธิบายสั้น ๆของโปรแกรม:

  1. เนื่องจากนามแฝงเมื่อดำเนินการคำสั่ง sudo สคริปต์ SUDO.shจะถูกเรียกใช้
  2. SUDO.sh เรียก SUDOServer.shเปิด (ผ่านSUDOServer.lnk) "sudoserver.py" หากจำเป็น
  3. คำสั่ง sudo เดิมเรียกโดยผู้ใช้จะถูกดำเนินการ
  4. จากนั้น SUDO.sh เรียก SUDOServerWatchDogScheduler.shที่ตาราง SUDOServerWatchDog.sh สำหรับการดำเนินการหลังจากเวลาที่กำหนด (15 นาทีเริ่มต้น) sudoserver.pyใกล้
  5. หลังจากเวลาที่กำหนดไว้ล่วงหน้า SUDOServerWatchDog.sh ปิด sudoserver.py หากมีอินสแตนซ์ใด ๆของ sudo กำลังทำงานอยู่มันจะเขียนโปรแกรมเองสำหรับการดำเนินการใหม่หลังจาก 5 นาที

สิ่งที่ต้องทำ :

  • ตัวติดตั้งด้วยตนเองที่สร้างไฟล์. sh, .cmd และ. lnk ทั้งหมดโดยอัตโนมัติ
  • สร้างล็อกไฟล์ให้บาง ๆ (เป็น $ TMP / lockfile.lck)
  • เพิ่มสคริปต์การกำหนดค่าหรือไฟล์. config (สำหรับค่าเริ่มต้นในการหมดเวลาตำแหน่งไฟล์ ... ฯลฯ )
  • เพิ่มพฤติกรรมบัญชีระบบ (ขอบคุณ @ Wyatt8740)
  • ¿เปลี่ยน "ฝูง" (โหมด SUDO ล็อคภายใน) ด้วย "fuser" ตามความเหมาะสมหรือไม่
  • ยอมรับคำแนะนำแล้ว

รายงานข้อบกพร่อง :

  • เปลือกทุบตีช่วยให้เปิดแม้หลังจาก inputing exitถ้าsudoserver.pyจะทำงานจนกว่าจะปิด ยินดีต้อนรับการแก้ไขชั่วคราว

ฉันหวังว่าบางคนจะใช้การเขียนโปรแกรมเป็นเวลานานที่ฉันทุ่มเทให้กับ TOUACExt ยอมรับ
การปรับปรุงและแก้ไขแล้ว
คำแนะนำเกี่ยวกับที่ฉันควรไปเผยแพร่รหัสเพื่อหยุดจู้จี้ยอมรับฟอรั่มนี้เกินไป ;-)

ขออภัยสำหรับการโพสต์ยาว ฉันไม่มีเวลาว่างมากและโครงการนี้เกี่ยวกับหายไปในตู้เสื้อผ้าของฉัน (อาจเป็นเวลาหลายปีใครจะรู้?)


2
หากคุณต้องการข้อเสนอแนะเกี่ยวกับรหัสของคุณโพสต์บน codereview.stackexchange.com (บันทึกการใช้งานและตัวอย่างเป็นสิ่งที่ดีที่จะมีที่นี่)
Ben Voigt

ขอบคุณ @BenVoigt ฉันไม่รู้ กรุณาคำถาม: ถ้าฉันทำฉันคิดว่าส่วนใหญ่โพสต์ควรจะซ้ำกันของคำตอบนี้ จะถือว่าเป็นการข้ามรายการหรือไม่
Sopalajo de Arrierez

1
ตรวจสอบให้แน่ใจว่าได้เชื่อมโยงพวกเขาเข้าด้วยกัน อันตรายในการทำ crossposting คือคนพยายามซ้ำ หากพวกเขาเชื่อมโยงนั่นไม่ใช่ปัญหาดังกล่าว
Ben Voigt

นี่เป็นทางออกที่ดีมาก ถ้ามันไม่จำเป็นต้องใช้หลามฉันจะใช้มัน ฉันมีความเกลียดชังส่วนตัวอย่างมากสำหรับงูหลาม มันเป็นภาษาที่ดี แต่ด้วยเหตุผลส่วนตัวมากกว่าสิ่งใดฉันไม่ชอบมัน แต่ถึงกระนั้นเนื่องจากเกือบจะไม่มีใครเกลียดชังงูเหลือมและความเกลียดชังของฉันก็ไม่มีเหตุผลฉันจึงยกระดับการแก้ปัญหาของคุณเพราะมันใกล้เคียงกับของจริงมากกว่าของฉัน
Wyatt8740

1
ขอบคุณ @CharlesRobertoCanato บางทีคุณสามารถให้รายละเอียดการแชทกับฉันเพื่อที่จะแก้มัน? ห้องสนทนา "TOUACExt - SuDo สำหรับ Windows": chat.stackexchange.com/rooms/56716/touacext-sudo-for-windows
Sopalajo de Arrierez

1

SIMPLE sudo.bat (ใช้ nircmd)

สามารถดาวน์โหลด Nircmd ได้ที่นี่:
http://www.nirsoft.net/utils/nircmd.html

ฉันดาวน์โหลด NirCmd และเปลี่ยนชื่อnircmdc.exeเพื่อแทนที่เดิมnircmd.exe จากนั้นผมก็ย้ายไปnircmd.exeC:\windows\system32

ฉันยังสร้างไฟล์แบตช์ต่อไปนี้เพื่ออนุญาตให้ส่งผ่านอาร์กิวเมนต์ไปยังสคริปต์

มันควรจะกล่าวว่าฉันได้ปิดการใช้งาน UAC บนเครื่องของฉันดังนั้นฉันจึงไม่จำเป็นต้องใช้สคริปต์นี้อีกต่อไป แต่มันใช้งานได้เหมือน windows 8 มันทำงานได้ใน cygwin เช่นกัน

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

ทางออกแฟนซี สั้นและง่าย แต่ทำไมมันถึงทำให้ฉันล้มเหลวง่ายๆsudo.bat dir? ข้อผิดพลาด windows บอกว่า "Windows ไม่สามารถหาไฟล์ชื่อ dir" ดูเหมือนว่าจะใช้งานได้sudo echo Helloแต่ไม่มีเอาต์พุตคอนโซล
Sopalajo de Arrierez

ความไม่สะดวกเล็กน้อยกับวิธีนี้คือการร้องขออย่างต่อเนื่องสำหรับ UAC พรอมต์ในคำสั่งที่ต่อเนื่องกัน TOUACExt แก้ปัญหานี้เหมือนกับในการเรียกใช้ sudo ของ Linux แบบดั้งเดิม ฉันได้แก้ไขรายการคุณสมบัติเพื่อแสดงแล้ว
Sopalajo de Arrierez

dirไม่ทำงานเพราะdirไม่ใช่โปรแกรม แต่เป็นคำสั่ง DOS ในตัว ในขณะที่ linux lsเป็นโปรแกรมไบนารีใน DOS / windows dirถูกจัดการโดยตัวแปลเอง (เช่น COMMAND.COM หรือ cmd.exe) ไม่มีdir.exeที่ใดที่โปรแกรมของฉันจะทำงาน แต่สำหรับ cygwin sudo lsควรพอเพียง แม้ว่าคุณจะไม่ได้ทำsudo cmdหรือsudo bashหรือสิ่งที่ควรจะได้รับคุณ 'ผู้ดูแล' พรอมต์ระดับ แม้ 'ผู้ดูแล' ต่ำกว่า 'ระบบ' แม้ว่า - สำหรับ 'ระบบ' nircmd.exe elevatecmd runassystem <program.exe>การใช้งาน นอกจากนี้ผมปิดการใช้งาน UAC บนเครื่องของฉัน :)
Wyatt8740

นอกจากนี้ฉันไม่คิดว่าechoเป็นโปรแกรมใน windows มันเป็นส่วนหนึ่งของ COMMAND.COM/cmd.exe สำหรับฉันแม้ว่าผู้ใช้ cygwin ด้วยls.exeและecho.exeทำงานได้ดี และฉันใช้มันวันนี้เป็นครั้งแรกในรอบหลายเดือนเพื่อจัดการไฟล์ในบัญชีพี่ชายของฉันโดยไม่ต้องเข้าสู่ระบบในฐานะเขา (เขาจัดการใส่ทุกโปรแกรมในคอมพิวเตอร์ของเขาในไดเรกทอรี "เริ่มต้น" ของเมนูเริ่มต้น: P) เพิ่งเข้าสู่ระบบอื่นและเคยsudo.bat cmdได้รับพรอมต์ระดับผู้ดูแลระบบที่จะให้ฉันจัดการไฟล์ของผู้ใช้คนอื่น
Wyatt8740

ความคิดของคุณเกี่ยวกับบัญชีระบบนั้นดี ฉันจะเพิ่มลงใน TOUCExt เป็นตัวเลือก
Sopalajo de Arrierez

0

ด้วยความยินดีกับโซลูชันที่มีอยู่ฉันจึงใช้สคริปต์ของ nu774เพื่อเพิ่มความปลอดภัยและทำให้ติดตั้งและใช้งานได้ง่ายขึ้น โครงการมีอยู่ใน Github

ที่จะใช้มันเพียงแค่ดาวน์โหลดและเรียกใช้ผ่านทางcygwin-sudo.pypython3 cygwin-sudo.py **yourcommand**

คุณสามารถตั้งค่านามแฝงเพื่อความสะดวก:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.