web-dev-qa-db-fra.com

Racine utilisateur/équivalent Sudo dans Cygwin?

J'essaie de lancer un script bash dans Cygwin. 

Je reçois des erreurs Must run as root, i.e. Sudo ./scriptname

chmod 777 scriptname ne fait rien pour aider. 

J'ai cherché des moyens d'imiter Sudo sur Cygwin, d'ajouter un utilisateur root, car l'appel de "su" génère l'erreur su: user root does not exist, quelque chose d'utile, et n'a rien trouvé. 

Quelqu'un a des suggestions?

144
Ken Bellows

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

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

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

$ cygstart --action=runas command

Ceci ouvrira une boîte de dialogue Windows demandant le mot de passe de l'administrateur et exécutera la commande si le mot de passe correct est entré.

Ceci est facilement scripté, tant que ~/bin est dans 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 les privilèges élevés real:

$ Sudo elevatedCommand

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

$ PATH=$HOME/bin:$PATH

Testé sous Windows 8 64 bits.

198
dotancohen

Vous devrez 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 aller dans les propriétés du raccourci et le vérifier dans la section de compatibilité. Méfiez-vous juste .... les autorisations de root peuvent être dangereuses.

47
Matt Williamson

S'appuyant sur La réponse de dotancohen J'utilise un alias:

alias Sudo="cygstart --action=runas"

Fonctionne comme un charme:

Sudo chown User:Group <file>

Et si vous avez installé SysInternals, vous pouvez même très facilement lancer une commande Shell en tant qu'utilisateur système.

Sudo psexec -i -s -d cmd
17
thoni56

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 le processus I/O.

Il nécessite python dans les fenêtres et la Greenlet des modules Python, et eventlet dans Cygwin.

9
AdamTheWebMan

Il semble que cygstart/runas ne gère pas correctement "$@" et que, par conséquent, les commandes comportant 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 définit les paramètres correctement.

#! /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 <enter> 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
3
Brian White

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 "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

Par exemple:

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

Assurez-vous simplement de mettre chaque commande séparément entre guillemets. Vous n'obtiendrez l'invite UAC qu'une seule fois à l'aide de cette méthode et cette procédure a été généralisée pour vous permettre d'utiliser n'importe quel type de commande.

2
user2618594

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

2
Mat Khor

Une nouvelle proposition pour améliorer Sudo for CygWin de GitHub dans ce fil , nommé TOUACExt:

  • Ouvre automatiquement sudoserver.py.
  • Ferme automatiquement sudoserver.py après expiration du délai (15 minutes par défaut).
  • Demander un style d'invitation Oui/Non au contrôle de compte d'utilisateur pour les utilisateurs administrateurs.
  • Demander un utilisateur administrateur/mot de passe pour les utilisateurs non-administrateurs.
  • Fonctionne à distance (SSH) avec des comptes d’administrateur.
  • Crée un journal.

Toujours en Pre-Beta, mais semble fonctionner.

2

J'ai atterri ici via Google, et je pense réellement avoir trouvé un moyen d'obtenir un message racine pleinement fonctionnel dans cygwin.

Voici mes pas.

Tout d’abord, vous devez renommer le compte administrateur Windows en «root» Pour ce faire, ouvrez start manu et tapez "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 administrateur.

Vous devez ensuite activer le compte s'il ne l'est pas encore.> 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: état du compte d'administrateur 

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

Définissez maintenant une variable d'environnement pour cygwin. Pour le faire facilement: Cliquez avec le bouton droit de la souris 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 environnementales"

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.

Ouvrir un terminal Cygwin (cygwin.bat)

Editez le fichier /etc/passwdet changez la ligne

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

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

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

Maintenant que tout est fini, ce prochain bit fera fonctionner la commande "su". (Pas parfaitement, mais cela fonctionnera suffisamment pour être utilisé. Je ne pense pas que les scripts fonctionneront correctement, mais bon, vous en êtes si loin, vous pouvez peut-être trouver le chemin. Et s'il vous plaît partager)

Exécutez cette commande dans cygwin pour finaliser la transaction.

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 d'utilisateur Windows normal.

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

Maintenant, essayez d’exécuter la commande su depuis cygwin et voyez si tout s’est bien passé.

1
Hydranix

N'étant pas satisfait de la solution disponible, j'ai adopté le script nu774 pour renforcer la sécurité et faciliter l'installation et l'utilisation. Le projet est disponible sur Github

Pour l'utiliser, il suffit de télécharger cygwin-Sudo.py et de l'exécuter 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"
1
Chronial

Un moyen très simple de disposer d’un shell cygwin et des sous-shell correspondants à utiliser avec des privilèges d’administrateur consiste à modifier les propriétés du link, 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 encore vérifié)

Je lance généralement le shell cygwin depuis un lien cygwin dans le bouton start (ou le bureau) . Ensuite, j'ai modifié les propriétés du lien cygwin dans les onglets.

/ Compatibilité/Niveau de privilège /

et a coché la case,

"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-shell correspondants.

0
DMH

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 mettre en œuvre pour exécuter tout par le script unique. 

J'ai également étudié la prochaine étape 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 enfant n'a pas écrit sur les canaux nommés. Cependant, écrire dans un fichier normal fonctionne bien. 

J'ai abandonné toutes les tentatives pour trouver la cause et laissé la solution actuelle telle quelle. J'espère que mon post peut être utile aussi.

Améliorations:

  • pas de fichier temporaire
  • pas d'analyse ni de reconstruction des options en ligne de commande
  • attendez la commande élevée
  • utilisez mintty ou bash, si le premier n'est pas trouvé
  • retourne le code de sortie de la commande

 #!/bin/bash 

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

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

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

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

 exit $ RETVAL 

0
jsxt

Sur la base de la réponse de @ mat-khor, j'ai pris syswin su.exe , je l'ai enregistré sous le nom manufacture-syswin-su.exe et j'ai écrit ce script d'emballage. Il gère la redirection des commandes stdout et stderr de la commande, afin de pouvoir être utilisé dans un tube, etc. De plus, le script se termine avec le statut de la commande donnée.

Limites:

  • Les options syswin-su sont actuellement codées en dur pour utiliser l’utilisateur actuel. Le préfixe env USERNAME=... à l'invocation du script le remplace. Si d'autres options étaient nécessaires, le script devrait faire la distinction entre les arguments syswin-su et les arguments de commande, par exemple. fractionnement au premier --.
  • Si l'invite UAC est annulée ou refusée, le script se bloque.

.

#!/bin/bash
set -e

# join command $@ into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "$@"; ) 2>&1 | Perl -nle 'print $1 if /\bset -- (.*)/' )

tmpDir=$(mktemp -t -d -- "$(basename "$0")_$(date '+%Y%m%dT%H%M%S')_XXX")
mkfifo -- "$tmpDir/out"
mkfifo -- "$tmpDir/err"

cat >> "$tmpDir/script" <<-SCRIPT
    #!/bin/env bash
    $cmd > '$tmpDir/out' 2> '$tmpDir/err'
    echo \$? > '$tmpDir/status'
SCRIPT

chmod 700 -- "$tmpDir/script"

manufacture-syswin-su -s bash -u "$USERNAME" -m -c "cygstart --showminimized bash -c '$tmpDir/script'" > /dev/null &
cat -- "$tmpDir/err" >&2 &
cat -- "$tmpDir/out"
wait $!
exit $(<"$tmpDir/status")
0
EndlosSchleife

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

Ceci est basé sur l'outil chere et sur la réponse malheureusement non fonctionnelle (pour moi) de link_boy. Cela fonctionne bien pour moi sous Windows 8, 

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

Je ne peux pas obtenir la version "d'arrière-plan" (clic droit dans un répertoire ouvert) à exécuter. N'hésitez pas à l'ajouter.

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\""
0
user2988447