CygWin için pratik (otomasyonlu) SUDO'nun pratik (klasik Linux'a daha yakın) yolu


11

CygWin'desudo komutları kullanabilmek faydalıdır ve yükseltilmiş bir kabuk açmaktan daha hızlıdır :

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.

Yukarıda gösterildiği gibi, Windows komutlarını / komut dosyalarını da Linux gibi çalıştırabilirsiniz. Benim için düzenli; uzak (SSH) konsollarda çalışır ve Windows / Linux komutlarını birleştirmeye izin verir . Dolayısıyla idari görevleri yerine getirebilmek neredeyse bir zorunluluktur.

Ancak CygWin için SUDO projesi tehlikeli olabilecek bir davranışa sahiptir : bir sunucu / istemci mimarisi olarak çalışır , aslında bir istemci (sudo) dahili olarak bir sunucuya (sudoserver.py) komut istekleri gönderir ( yerel bilgisayar) 7070TCP bağlantı noktasını, hiçbir kullanıcı veya izin denetimi olmadan , bu nedenle bilgisayarda oturum açan herkes (ayrıcalıklı kullanıcılar bile) yönetici (CygWin veya Windows) kabuk komutları veya komut dosyaları (CygWin veya Windows da) çalıştırabilir. Yazarın önerilen yöntemini tutarsanız
sorun daha da kötüleşir : "sudoserver.py" nin bir hizmet olarak kaydedilmesi, bu nedenle kalıcı olarak çalışmaya devam eder.

Yani, işleri (tamamen değil) biraz daha güvenli tutmak için , ben:
1.- Bir yönetici kabuğu üzerinde "sudoserver.py" çalıştırın.
2. Başka bir CygWin kabuğunda "sudo" komutlarımı çalıştır.
3. (Ctrl + C) "sudoserver.py" dosyasını ve yönetici kabuğunu kapatın.

Biraz sinir bozucu . Ben "sudoserver.py" çalıştıran .cmdatanmış kısayol tuşu ile bir dosya kullanarak geçici çözüm , ve ben yönetim işleri sonra (elle), ama yine de klasik klasik "sudo" kullanılabilirlik Linux uzak.

Harika ve pratik bir yöntem:

  1. ** UAC Yükseklik İstemi (veya kullanıcı / şifre) isteyen "sudoserver.py" dosyasını otomatik olarak açar.
  2. Bir süre sonra kapatır , bu nedenle sudosırayla birkaç komut yürütülmesi durumunda UAC talebi rahatsız olmaya devam etmez .

En azından kısmen bunu otomatikleştirmenin bir yolu var mı ?

Yanıtlar:


10

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 .shprogramdan oluşur.

TOUACExt yürütme örneği

Ö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 sudokomut 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 ( procpspakette).
  • sürü ( util-linuxpakette).
  • 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.cmdve 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ı sudoiç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ı :

  1. Diğer ad nedeniyle, bir sudo komutu gerçekleştirilirken SUDO.sh betiği çağrılır.
  2. SUDO.sh , gerekirse "sudoserver.py" dosyasını açarak SUDOServer.sh dosyasını çağırırSUDOServer.lnk .
  3. Orijinal sudo komutu kullanıcı tarafından çağrılan yürütülür.
  4. 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.
  5. Ö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 exiteğer sudoserver.pyo 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?).


2
Kodunuzla ilgili geri bildirim almak isterseniz kodu codereview.stackexchange.com adresine gönderin. (Kullanım notları ve örneklerin burada bulunması iyidir)
Ben Voigt

Teşekkürler, @ BenVoigt, bilmiyordum. Lütfen bir soru: eğer yaparsam, yazının çoğunun bu cevabın bir kopyası olması gerektiğini düşünüyorum. Bu çapraz paylaşım olarak kabul edilecek mi?
Sopalajo de Arrierez

1
Bunları birbirine bağladığınızdan emin olun. Crossposting'in zararı, insanların çabayı ikiye katlamasıdır. Bağlantılılarsa, bu böyle bir sorun değil
Ben Voigt

Bu çok iyi bir çözüm. Python gerektirmediyse, onu kullanardım. Python için kişisel, derin bir nefretim var. Güzel bir dildir, ancak kişisel nedenlerden dolayı her şeyden çok hoşlanmıyorum. Yine de, neredeyse hiç kimse python'dan nefret etmediği ve nefretim mantıksız olduğu için, çözümünüzü iptal ettim, çünkü gerçek olan benimkinden daha yakın.
Wyatt8740

1
Teşekkürler, @CharlesRobertoCanato. Belki de sohbeti çözmek için bana sohbette ayrıntıları verebilirsin? Sohbet Odası "TOUACExt - Windows için SuDo": chat.stackexchange.com/rooms/56716/touacext-sudo-for-windows
Sopalajo de Arrierez

1

SIMPLE sudo.bat (nircmd kullanır)

Nircmd buradan indirilebilir:
http://www.nirsoft.net/utils/nircmd.html

Ben NirCmd ve adını indirilen nircmdc.exeiçin nircmd.exeorijinali yerine nircmd.exe. Sonra taşındım C:\windows\system32.

Ayrıca, argümanların betiğe geçirilmesine izin vermek için aşağıdaki toplu iş dosyasını yaptım.

Makinemde UAC'yi devre dışı bıraktığım söylenmeli, bu yüzden artık bu betiğe ihtiyacım yok, ancak Windows 8'den beri çalışıyor. Aynı zamanda cygwin'de de çalışıyor.

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

Süslü bir çözüm. Kısa ve kolay. Ama bu neden basit bir şekilde başarısız oluyor sudo.bat dir? Hata pencerelerinde "Windows dir adlı dosyayı bulamıyor" bildiriliyor. Çalışıyor gibi görünüyor sudo echo Hello, ancak konsol çıkışı yok.
Sopalajo de Arrierez

Bir küçük rahatsızlık bu yöntemle üst üste komutları UAC sürekli talebidir. TOUACExt bunu klasik Linux sudo uygulamalarında olduğu gibi çözer . Göstermek için özellikler listesini düzenledim.
Sopalajo de Arrierez

dirçalışmıyor çünkü dirteknik bir program değil, yerleşik bir DOS komutu. linux içinde iken ls, DOS / windows bir ikili program diryorumlayıcı kendisi tarafından yönetilir (yani COMMAND.COM veya cmd.exe). Bir yoktur dir.exevadede benim program için her yerde. Ama cygwin için sudo lsyeterli olmalı. Yapmasanız bile, sudo cmdya sudo bashda ya da her neyse size bir 'Yönetici' seviye istemi almalısınız. 'Yönetici' bile 'SİSTEM'in altında olsa da,' SİSTEM 'için kullanın nircmd.exe elevatecmd runassystem <program.exe>. Ayrıca, makinelerimde UAC'yi devre dışı
bırakıyorum

Ayrıca, ben de echowindows bir program olduğunu sanmıyorum . COMMAND.COM/cmd.exe dosyasının bir parçasıdır. Benim için olsa bir cygwin kullanıcısı ile ls.exeve echo.exeiyi çalışıyor. Ve aslında onu aylar içinde giriş yapmadan kardeşimin hesabındaki dosyaları yönetmek için aylarca ilk kez kullandım (bilgisayarındaki her programı kendi başlangıç ​​menüsünün "başlangıç" dizinine koymayı başardı: P). Başka bir hesapta oturum açtım ve sudo.bat cmddiğer kullanıcıların dosyalarını yönetmeme izin verecek bir yönetici düzeyinde bilgi istemi için kullandım.
Wyatt8740

Sistem hesabı fikriniz iyi. Ben bir seçenek olarak TOUCExt ekleyeceğim.
Sopalajo de Arrierez

0

Mevcut çözümden memnun olmadığım için, güvenlik eklemek, kurulumu ve kullanımı kolaylaştırmak için nu774'ün komut dosyasını kullandım. Proje Github'da mevcut

Kullanmak için indirin cygwin-sudo.pyve çalıştırın python3 cygwin-sudo.py **yourcommand**.

Kolaylık sağlamak için bir takma ad oluşturabilirsiniz:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.