Racine utilisateur / équivalent sudo dans Cygwin?

J’essaie d’exécuter un script bash dans Cygwin.

Must run as root, ie sudo ./scriptname erreurs Must run as root, ie sudo ./scriptname .

chmod 777 scriptname ne fait rien pour aider.

J’ai cherché des moyens d’imiter sudo sur Cygwin, pour append un utilisateur root, car appeler “su” rend l’erreur su: user root does not exist , quelque chose d’utile, et n’a rien trouvé.

Quelqu’un a des suggestions?

J’ai répondu à cette question sur SuperUser, mais seulement après que le PO eut ignoré la réponse inutile qui était à l’époque la seule réponse à la question.

Voici le moyen approprié d’élever les permissions dans Cygwin, copié à partir de ma propre réponse sur SuperUser:

J’ai trouvé la réponse dans la liste de diffusion cygwin . Pour exécuter la command avec des privilèges élevés dans Cygwin, cygstart --action=runas précéder la commande de cygstart --action=runas comme ceci:

 $ cygstart --action=runas command 

Cela ouvrira une boîte de dialog Windows demandant le mot de passe administrateur et exécutera la commande si le mot de passe correct est entré.

Ceci est facilement scripté, tant que ~/bin est sur votre chemin. Créez un fichier ~/bin/sudo avec le contenu suivant:

 #!/usr/bin/bash cygstart --action=runas "$@" 

Maintenant, rendez le fichier exécutable:

 $ chmod +x ~/bin/sudo 

Vous pouvez maintenant exécuter des commandes avec des privilèges élevés :

 $ sudo elevatedCommand 

Vous devrez peut-être append ~/bin à votre chemin. Vous pouvez exécuter la commande suivante sur la CLI Cygwin ou l’append à ~/.bashrc :

 $ PATH=$HOME/bin:$PATH 

Testé sur Windows 8 64 bits.

Vous devez probablement exécuter le shell cygwin en tant qu’administrateur. Vous pouvez cliquer avec le bouton droit sur le raccourci et cliquer sur exécuter en tant qu’administrateur ou accéder aux propriétés du raccourci et le vérifier dans la section de compatibilité. Méfiez-vous simplement … les permissions root peuvent être dangereuses.

En me basant sur la réponse de dotancohen, j’utilise un alias:

 alias sudo="cygstart --action=runas" 

Fonctionne comme un charme:

 sudo chown User:Group  

J’ai trouvé sudo-for-cygwin , peut-être que cela fonctionnerait, c’est une application client / serveur qui utilise un script python pour générer un processus enfant dans windows (pty) et ponte le tty de l’utilisateur et les E / S du processus.

Il nécessite python dans Windows et Greenlet de modules Python, et eventlet dans Cygwin.

Il semble que cygstart/runas ne gère pas correctement "$@" et que les commandes qui ont des arguments contenant des espaces (et peut-être d’autres méta-caractères shell – je n’ai pas vérifié) ne fonctionneront pas correctement.

J’ai décidé d’écrire un petit script sudo qui fonctionne en écrivant un script temporaire qui effectue correctement les parameters.

 #! /bin/bash # If already admin, just run the command in-line. # This works on my Win10 machine; dunno about others. if id -G | grep -q ' 544 '; then "$@" exit $? fi # cygstart/runas doesn't handle arguments with spaces correctly so create # a script that will do so properly. tmpfile=$(mktemp /tmp/sudo.XXXXXX) echo "#! /bin/bash" >>$tmpfile echo "export PATH=\"$PATH\"" >>$tmpfile echo "$1 \\" >>$tmpfile shift for arg in "$@"; do qarg=`echo "$arg" | sed -e "s/'/'\\\\\''/g"` echo " '$qarg' \\" >>$tmpfile done echo >>$tmpfile # cygstart opens a new window which vanishes as soon as the command is complete. # Give the user a chance to see the output. echo "echo -ne '\n$0: press  to close window... '" >>$tmpfile echo "read enter" >>$tmpfile # Clean up after ourselves. echo "rm -f $tmpfile" >>$tmpfile # Do it as Administrator. cygstart --action=runas /bin/bash $tmpfile 

Cette réponse est basée sur une autre réponse . Tout d’abord, assurez-vous que votre compte est dans le groupe Administrateurs.

Ensuite, créez un fichier générique “runas-admin.bat” avec le contenu suivant:

 @if (1==1) @if(1==0) @ELSE @echo off&SETLOCAL ENABLEEXTENSIONS >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||( cscript //E:JScript //nologo "%~f0" %* @goto :EOF ) FOR %%A IN (%*) DO ( "%%A" ) @goto :EOF @end @ELSE args = WScript.Arguments; newargs = ""; for (var i = 0; i < args.length; i++) { newargs += "\"" + args(i) + "\" "; } ShA=new ActiveXObject("Shell.Application"); ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+" "+newargs+"\"","","runas",5); @end 

Ensuite, exécutez le fichier de commandes comme ceci:

 ./runas-admin.bat " [parm1, parm2, ...]" " [parm1, parm2, ...]" 

Pour exaxmple:

 ./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add" 

Veillez simplement à inclure chaque commande séparée entre guillemets. Vous ne recevrez l'invite UAC qu'une seule fois en utilisant cette méthode et cette procédure a été généralisée afin que vous puissiez utiliser n'importe quel type de commande.

Une nouvelle proposition pour améliorer SUDO pour CygWin à partir de GitHub dans ce thread , nommé TOUACExt :

  • Ouvre automatiquement sudoserver.py.
  • Ferme automatiquement sudoserver.py après expiration du délai (15 minutes par défaut).
  • Demander l’invite d’élévation UAC de style Oui / Non pour les utilisateurs admin.
  • Demander un utilisateur / mot de passe administrateur pour les utilisateurs non administrateurs.
  • Fonctionne à distance (SSH) avec les comptes admin.
  • Crée un journal.

Toujours en pré-bêta , mais semble fonctionner.

Ou installez le paquet syswin, qui inclut un port de su pour cygwin: http://sourceforge.net/p/manufacture/wiki/syswin-su/

J’ai atterri ici via google, et je crois réellement que j’ai trouvé un moyen d’obtenir une promt root complète dans cygwin.

Voici mes pas.

Tout d’abord, vous devez renommer le compte administrateur Windows en “root” Faites-le en ouvrant manu start et en tapant “gpedit.msc”

Modifiez l’entrée sous Stratégie de l’ordinateur local> Configuration de l’ordinateur> Paramètres Windows> Paramètres de sécurité> Stratégies locales> Options de sécurité> Comptes: renommer le compte d’administrateur

Ensuite, vous devrez activer le compte s’il n’est pas encore activé. Stratégie de l’ordinateur local> Configuration de l’ordinateur> Paramètres Windows> Paramètres de sécurité> Stratégies locales> Options de sécurité> Comptes: statut du compte d’administrateur

Maintenant, déconnectez-vous et connectez-vous au compte root.

Définissez maintenant une variable d’environnement pour cygwin. Pour faire cela facilement: Cliquez avec le bouton droit sur Poste de travail> Propriétés

Cliquez sur (dans la barre latérale gauche) “Paramètres système avancés”

Près du bas, cliquez sur le bouton “Variables d’environnement”

Sous “Variables système”, cliquez sur le bouton “Nouveau …”

Pour le nom, mettez “cygwin” sans les guillemets. Pour la valeur, entrez dans votre répertoire racine cygwin. (Le mien était C: \ cygwin)

Appuyez sur OK et fermez tout cela pour revenir au bureau.

Ouvrez un terminal Cygwin (cygwin.bat)

Editez le fichier / etc / passwd et changez la ligne

Administrateur : inutilisé: 500: 503 : U- MACHINE \ Administrateur , S-1-5-21-12345678-1234567890-1234567890- 500: / home / Administrator : / bin / bash

Pour cela (vos numéros et le nom de la machine seront différents, assurez-vous simplement de remplacer les chiffres en surbrillance par 0!)

root : inutilisé: 0: 0 : U- MACHINE \ root , S-1-5-21-12345678-1234567890-1234567890- 0: / root : / bin / bash

Maintenant que tout est fini, ce bit suivant fera fonctionner la commande “su”. (Pas parfaitement, mais ça fonctionnera suffisamment pour que je puisse l’utiliser. Je ne pense pas que les scripts fonctionneront correctement, mais bon, vous êtes arrivé si loin, peut-être que vous pouvez trouver le chemin. Et s’il vous plaît partagez)

Exécutez cette commande dans cygwin pour finaliser le deal.

 mv /bin/su.exe /bin/_su.exe_backup cat > /bin/su.bat << "EOF" @ECHO OFF RUNAS /savecred /user:root %cygwin%\cygwin.bat EOF ln -s /bin/su.bat /bin/su echo '' echo 'All finished' 

Déconnectez-vous du compte root et revenez dans votre compte utilisateur Windows habituel.

Après tout cela, exécutez le nouveau "su.bat" manuellement en double-cliquant dessus dans l'explorateur. Entrez votre mot de passe et fermez la fenêtre.

Maintenant, essayez d'exécuter la commande su à partir de cygwin et voyez si tout s'est bien passé.

Insatisfait de la solution disponible, j’ai adopté le script de nu774 pour renforcer la sécurité et faciliter sa configuration et son utilisation. Le projet est disponible sur Github

Pour l’utiliser, téléchargez cygwin-sudo.py et lancez-le via python3 cygwin-sudo.py **yourcommand** .

Vous pouvez configurer un alias pour plus de commodité:

 alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py" 

Utilisez ceci pour obtenir une fenêtre d’administration avec soit bash ou cmd en cours d’exécution, à partir de n’importe quel menu contextuel de répertoires. Il suffit de cliquer avec le bouton droit sur un nom de répertoire et de sélectionner l’entrée ou d’appuyer sur le bouton en surbrillance.

Ceci est basé sur l’outil chere et la réponse qui ne fonctionne malheureusement pas (pour moi) à partir de link_boy. Cela fonctionne bien pour moi en utilisant Windows 8,

Un effet secondaire est la couleur différente dans la fenêtre admin cmd. Pour utiliser cela sur bash, vous pouvez modifier le fichier .bashrc de l’utilisateur admin.

Je ne peux pas obtenir la version “background” (clic droit dans un répertoire ouvert) pour la lancer. N’hésitez pas à l’append.

 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash] @="&Bash Prompt Here" "Icon"="C:\\cygwin\\Cygwin.ico" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command] @="C:\\cygwin\\bin\\bash -c \"/bin/xhere /bin/bash.exe '%L'\"" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root] @="&Root Bash Prompt Here" "Icon"="C:\\cygwin\\Cygwin.ico" "HasLUAShield"="" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash_root\command] @="runas /savecred /user:administrator \"C:\\cygwin\\bin\\bash -c \\\"/bin/xhere /bin/bash.exe '%L'\\\"\"" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd] @="&Command Prompt Here" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd\command] @="cmd.exe /k cd %L" "HasLUAShield"="" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root] @="Roo&t Command Prompt Here" "HasLUAShield"="" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_cmd_root\command] @="runas /savecred /user:administrator \"cmd.exe /t:1E /k cd %L\"" 

Un moyen très simple d’avoir un shell cygwin et les sous-couches correspondantes pour fonctionner avec des privilèges d’administrateur consiste à modifier les propriétés du lien qui ouvre le shell initial.

Ce qui suit est valable pour Windows 7+ (peut-être aussi pour les versions précédentes, mais je n’ai pas vérifié)

Je lance habituellement le shell cygwin à partir d’un lien cygwin dans le bouton Démarrer (ou bureau). Ensuite, j’ai modifié les propriétés du lien cygwin dans les tabs

/ Compatibilité / Niveau de privilège /

et vérifié la boîte,

“Exécuter ce programme en tant qu’administrateur”

Cela permet au shell cygwin de s’ouvrir avec les privilèges d’administrateur et les sous-couches correspondantes également.

J’ai rencontré cette discussion en cherchant des détails sur l’implémentation de sudo dans différents systèmes d’exploitation. En le lisant, j’ai trouvé que la solution de @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) est utile mais peut être légèrement améliorée. J’ai évité de créer le fichier temporaire et de l’implémenter pour exécuter tout par le script unique.

J’ai également étudié l’étape suivante de l’amélioration de la sortie dans la fenêtre / console unique. Malheureusement, sans succès. J’ai essayé d’utiliser des canaux nommés pour capturer STDOUT / STDERR et imprimer dans la fenêtre principale. Mais le processus fils n’a pas écrit sur les canaux nommés. Cependant, écrire dans un fichier normal fonctionne bien.

J’ai abandonné toute tentative de trouver la cause première et laissé la solution actuelle telle quelle. J’espère que mon message peut être utile aussi.

Améliorations:

  • pas de fichier temporaire
  • pas d’parsing et de reconstruction des options de ligne de commande
  • attendre la commande élevée
  • utiliser mintty ou bash , si le premier n’a pas été trouvé
  • retourne le code de sortie de la commande

     #! / bin / bash

     # En tant qu'administrateurs, invoquez la commande directement
     id -G |  grep -qw 544 && {
         "$ @"
         exit $?
     }

     # La variable CYG_SUDO est utilisée pour contrôler l'invocation de la commande
     [-z "$ CYG_SUDO"] && {
         mintty = "$ (qui mintty 2> / dev / null)"
         export CYG_SUDO = "$$"
         cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
         exit $?
     }

     # Nous pouvons maintenant:
     # - lance la commande
     # - affiche le message
     # - retourne le code de sortie
     "$ @"
     RETVAL = $?

     echo "$ 0: appuyez pour fermer la fenêtre ..."
     lis

     exit $ RETVAL

Je ne peux pas tout tester moi-même, je n’ai pas de script approprié pour l’essayer, et je ne suis pas un expert Linux, mais vous pourriez peut-être pirater quelque chose d’assez proche.

J’ai essayé ces étapes et elles semblent fonctionner, mais je ne sais pas si cela suffira à vos besoins.

Pour contourner le manque d’utilisateur ‘root’:

  • Créer un utilisateur sur la machine Windows LOCAL appelée ‘root’, en faire un membre du groupe ‘Administrators’
  • Marquez le fichier bin / bash.exe comme “Exécuter en tant qu’administrateur” pour tous les utilisateurs (vous devrez évidemment l’activer ou le désactiver lorsque vous en aurez besoin)
  • Maintenez le bouton gauche de la souris enfoncé dans l’explorateur Windows tout en cliquant avec le bouton droit sur le fichier Cygwin.bat.
  • Sélectionnez “Exécuter en tant qu’utilisateur différent”
  • Entrez. \ Root comme nom d’utilisateur, puis votre mot de passe.

Cela vous exécute alors en tant qu’utilisateur appelé «root» dans cygwin, ce qui, couplé avec «Exécuter en tant qu’administrateur» sur le fichier bash.exe peut être suffisant.

Cependant, vous avez toujours besoin d’un sudo.

J’ai truqué cela (et quelqu’un d’autre ayant plus de connaissances sur Linux peut probablement faire mieux) en créant un fichier appelé «sudo» dans / bin et en utilisant cette ligne de commande pour envoyer la commande à su à la place:

 su -c "$*" 

La ligne de commande “sudo vim” et les autres semblent fonctionner correctement pour moi, alors vous pourriez vouloir l’essayer.

Être intéressé de savoir si cela fonctionne pour vos besoins ou non.

Ce que je fais habituellement est d’avoir un registre “Open Here” afin d’ouvrir un shell cygwin avec des privilèges d’administration assez faciles de n’importe où dans mon ordinateur.

Sachez que vous devez avoir le paquet cygwin “chere” installé, utilisez d’abord ” chere -i -m ” à partir d’un shell cygwin élevé.

En supposant que votre installation cygwin se trouve dans C: \ cygwin …

Voici le code du registre:

 Windows Registry Editor Version 5.00 [-HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash] [HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash] @="Open Cygwin Here as Root" "HasLUAShield"="" [HKEY_CLASSES_ROOT\Directory\shell\cygwin_bash\command] @="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe" [-HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash] [HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash] @="Open Cygwin Here as Root" "HasLUAShield"="" [HKEY_CLASSES_ROOT\Directory\Background\shell\cygwin_bash\command] @="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe" [-HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash] [HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash] @="Open Cygwin Here as Root" "HasLUAShield"="" [HKEY_CLASSES_ROOT\Drive\shell\cygwin_bash\command] @="c:\\cygwin\\bin\\mintty.exe -i /Cygwin-Terminal.ico -e /bin/xhere /bin/bash.exe" 

J’espère que cela t’aides. Dites-moi si cela marche pour vous. Merci.

PS: vous pouvez saisir ce code, le copier et le coller et l’enregistrer dans un fichier name.reg pour l’exécuter … ou vous pouvez append manuellement les valeurs.

Essayer:

 chmod -R ug+rwx  

est le répertoire sur lequel vous souhaitez modifier les permissions.