Être capable d'utiliser les commandes sudo
dans CygWin est utile et plus rapide que l'ouverture d'un shell élevé:
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.
Comme indiqué ci-dessus, vous pouvez également exécuter des commandes / scripts Windows, tout comme Linux. Pour moi, c'est propre; Fonctionne sur des consoles distantes (SSH) et permet de combiner les commandes Windows / Linux . Ainsi, être en mesure d'exécuter des tâches administratives est presque un must.
Mais le projet SUDO pour CygWin a un comportement qui pourrait être dangereux : il fonctionne comme une architecture serveur / client , en fait, un client (sudo) envoie des requêtes de commandes à un serveur (sudoserver.py) à l'interne (n'écoute pas à l'extérieur du Ordinateur local) port 7070TCP, sans vérification de l'utilisateur ou des autorisations , de sorte que quiconque (même les utilisateurs non primiérés) a ouvert une session sur l'ordinateur pourrait exécuter des commandes ou des scripts d' administration (CygWin ou Windows) (CygWin ou Windows, également).
Le problème s'aggrave si vous conservez la méthode proposée par l'auteur: vous enregistrez "sudoserver.py" en tant que service, de sorte qu'il fonctionnera en permanence.
Donc, pour maintenir les choses un peu plus sécurisées (pas totalement), je fais:
1.- Exécuter "sudoserver.py" sur un shell d'administration.
2.- Exécutez mes commandes "sudo" sur un autre shell CygWin.
3.- Fermer (Ctrl + C) "sudoserver.py" et le shell d'administration.
Un peu ennuyeux . Je suis en train de l'utiliser en utilisant un fichier .cmd
avec le raccourci affecté qui fonctionne "sudoserver.py", et je ferme (manuellement) après mes tâches administratives, mais toujours loin de la fonctionnalité classique "sudo" sur Linux.
La façon idéale et pratique serait une méthode qui:
sudo
exécutées séquentiellement. Existe-t-il un moyen d' automatiser cela , au moins partiellement?
REMARQUE: il s'agit principalement d'un programme (script shell) que j'ai créé, et je sais que ce forum est plus un site de réponses aux questions qu'un programme-introduction. Mais je n'ai pas de compte GitHub (ou similaire), ni j'ai eu le temps de faire des recherches sur la méthode de publication d'un programme Open Source dans la communauté. Ainsi, tant qu'il y a un risque qu'un programme utile et utile reste inaperçu (même pendant des mois) à ceux qui pourraient en profiter, et il serait triste de ne pas partager un programme déjà créé, je vais le publier ici pour à présent. Aucun problème pour moi si les administrateurs décident de supprimer ce fil, je comprendrai. J'espère avoir rédigé la question de manière à répondre à toutes les questions pour que cela soit utile à ce forum. S'il y a suffisamment d' utilisateurs intéressés , je ferai de mon mieux pour consacrer du temps à poursuivre le projet (après toutes mes recherches, je n'ai trouvé rien de plus proche de celui-ci sur Internet, mais, eh bien … Je ne sais pas si mon Le script est précieux ou c'est une perte de temps).
J'ai programmé un script shell Linux simple qui fonctionne (jusqu'à présent) sur CygWin et aide (j'espère) à réduire l'intervalle de temps d'attaque SUDO pour CygWin. Le programme s'appelle TOUACExt (acronyme de " TimeOut et UAC Extension ") et agit comme un wrapper pour SUDO pour CygWin (requis installé) et est vraiment composé par un ensemble de quatre programmes .sh
.
Caractéristiques :
sudo
consécutives ne génèrent qu'une demande UAC). Tant que sudoserver.py continue à fonctionner (15 minutes par défaut), il n'y aura plus de demandes UAC . /var/log/SUDOForCygWin/
. Exigences (dans CygWin):
procps
). util-linux
). En supposant : – Les deux programmes du projet SUDO pour CygWin sur le chemin suggéré par l'auteur:
/usr/local/bin/sudoserver.py /usr/local/bin/sudo
TOUACExt a été testé en fonction de Windows 7 SP1 et Windows XP SP3, mais je ne sais pas s'il est logique de l'utiliser sur ce dernier.
Instructions d'installation :
Mettez ce script (nom suggéré: SUDOServer.cmd
) et créez un raccourci (vous pouvez personnaliser son icône si vous le souhaitez), nommé SUDOServer.lnk
(vous devez activer ce raccourci Advanced Options --> Execute as Administrator
) n'importe où sur votre Chemin Windows , donc sudoserver.py
peut être directement demandé à partir de Windows:
c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py
Placez les quatre scripts .sh de TOUACExt sur le chemin, par exemple:
/usr/local/bin/SUDO.sh /usr/local/bin/SUDOServer.sh /usr/local/bin/SUDOServerWatchDog.sh /usr/local/bin/SUDOServerWatchDogScheduler.sh
Renommez le script Python d' origine de sudo
à sudo.py
:
mv /usr/local/bin/sudo /usr/local/bin/sudo.py
AVERTISSEMENT: Le script original "sudo" Python ne doit pas rester dans votre chemin, ou il pourrait être exécuté à la place.
Créez cet alias (par exemple, manuellement ou en éditant votre ~/.bashrc
):
alias sudo='SUDO.sh'
Code pour 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.
Code pour 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).
Code pour 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
Code pour 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
Testez le programme à partir d'un shell 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: Ces scripts sont en version pré-beta , donc ils sont encore buggy et le code n'est pas très propre. Quoi qu'il en soit, dans mes tests avec trois ordinateurs Windows 7 différents, ils semblent fonctionner (surtout) OK.
Brève explication du programme:
SUDOServer.lnk
) "sudoserver.py" si nécessaire. sudoserver.py
. À faire :
Bugs déclarés:
exit
si sudoserver.py
est en cours d'exécution jusqu'à ce qu'il se ferme. Des solutions de contournement provisoires sont les bienvenues. J'espère que quelqu'un va utiliser la programmation longue heures que j'ai consacrée à TOUACExt.
Des améliorations et des corrections sont acceptées.
Des suggestions sur l' endroit où je devrais publier le code pour arrêter de déranger ce forum ont également accepté ;-).
Désolé pour la longue publication. Je n'ai pas beaucoup de temps libre, et ce projet a été de disparaître sur mon placard (peut-être depuis des années, qui sait?).
SIMPLE sudo.bat (utilise nircmd)
Nircmd peut être téléchargé ici:
http://www.nirsoft.net/utils/nircmd.html
J'ai téléchargé nircmd et j'ai renommé nircmdc.exe
pour nircmd.exe
, en remplaçant le nircmd.exe
original. Je l'ai ensuite déplacé vers C:\windows\system32
.
J'ai également fait le fichier batch suivant pour permettre la transmission des arguments au script.
Il faut dire que j'ai désactivé UAC sur ma machine, donc je n'ai plus besoin de ce script, mais ça marche à partir de Windows 8. Il fonctionne également dans cygwin.
@echo off if "%*" == "" goto error nircmd elevate %* goto thisiseof :error echo No arguments were given. Exiting. :thisiseof