Utilisateur root / équivalent sudo dans Cygwin?

156

J'essaye d'exécuter un script bash dans Cygwin.

J'ai des Must run as root, i.e. sudo ./scriptnameerreurs.

chmod 777 scriptname ne fait rien pour aider.

J'ai cherché des moyens d'imiter sudo sur Cygwin, d'ajouter un utilisateur root, car appeler "su" rend l'erreur su: user root does not exist, quelque chose d'utile, et je n'ai rien trouvé.

Quelqu'un a des suggestions?

Ken Bellows
la source
bonjour KenB, pouvez-vous nous donner plus de détails sur le whatscript que vous essayez d'exécuter? Il n'y a pas d'équivalent à 'sudo' dans un shell cygwin - les droits sont ceux de l'utilisateur win qui a lancé le shell cygwin, donc le lien KyleWpppd est bon pour éviter des erreurs telles que "sudo unknown command". Dans votre cas, cela semble être un problème spécifique avec le script que vous souhaitez exécuter.
Stefano le
1
Honnêtement, c'est un problème depuis longtemps, et je ne me souviens pas vraiment du script. Merci pour l'intérêt, cependant.
Ken Bellows

Réponses:

225

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

Voici la bonne façon d'élever les autorisations dans Cygwin, copiée à partir de ma propre réponse sur SuperUser:

J'ai trouvé la réponse sur la liste de diffusion Cygwin . Pour exécuter commandavec des privilèges élevés dans Cygwin, faites précéder la commande cygstart --action=runascomme suit:

$ cygstart --action=runas command

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

Ceci est facilement scripté, du moment qu'il se ~/bintrouve sur votre chemin. Créez un fichier ~/bin/sudoavec le contenu suivant:

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

Maintenant, rendez le fichier exécutable:

$ chmod +x ~/bin/sudo

Vous pouvez désormais exécuter des commandes avec de réels privilèges élevés :

$ 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é sur Windows 8 64 bits.

Vous pouvez également, au lieu des étapes ci-dessus, ajouter un alias pour cette commande pour ~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'
dotancohen
la source
12
Excellente réponse. Avec quelques ajustements à votre code bash (ci-dessous), j'ai pu exécuter une commande élevée à partir de la ligne de commande. Voici le changement dont j'avais besoin pour faire fonctionner votre code: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (Je ne peux pas comprendre comment insérer des nouvelles lignes dans ce commentaire, j'ai donc ajouté des '\ n's au code) Le reste du PATH = ... .
josmith42
3
Oh je vois! Si je ne me trompe pas, c'est votre façon d'écrire le fichier sur le disque, au lieu d'ouvrir un éditeur de texte. Bien merci! Je ne savais pas comment utiliser les heredocs dans Bash!
dotancohen
8
Le problème avec ceci est que cela crée une toute nouvelle fenêtre de terminal (généralement conhost). La sortie n'est pas intégrée dans le terminal actuel.
CMCDragonkai
1
La seule façon d'exécuter des choses comme lsc'est de l'envelopper dans un processus de longue durée comme mintty ou bash ou zsh aussi. Mais tout apparaît dans un terminal séparé. À ce stade, j'aurais pu simplement l'ouvrir via l'interface graphique en utilisant ConEMU.
CMCDragonkai
1
Sans les guillemets, même les arguments entre guillemets sont à nouveau divisés en espaces, @katriel. Avec les guillemets, se "$@"développe en quelque chose comme "$1" "$2" "$3" ...et sans, se $@développe en $1 $2 $3....
Palec
51

Vous devez probablement exécuter le shell cygwin en tant qu'administrateur. Vous pouvez faire un clic 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é. Attention, les permissions root peuvent être dangereuses.

Matt Williamson
la source
1
Au cours des trois années qui se sont écoulées depuis que cette question a été posée sans une bonne réponse par opposition à cette solution de contournement, j'ai trouvé le moyen correct d'augmenter les autorisations pour une seule commande dans la fenêtre Cygwin existante dans la réponse ci-dessous. Ainsi, il fonctionne exactement comme sudosous Linux.
dotancohen
A travaillé pour moi sur Win10 64. J'ai dû changer la propriété des fichiers téléchargés à partir d'un serveur avec rsync. chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*. Sans lui, je ne pourrais pas accéder aux dossiers et fichiers rsynced.
lowtechsun
25

En m'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 démarrer très facilement un shell de commande en tant qu'utilisateur système

sudo psexec -i -s -d cmd
thoni56
la source
9

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 relie le tty de l'utilisateur et les E / S de processus.

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

AdamTheWebMan
la source
J'utilise ceci depuis un moment maintenant et il gère des trucs interactifs comme nano sans aucun problème!
MemphiZ
4

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

J'ai décidé d'écrire simplement un petit sudoscript qui fonctionne en écrivant un script temporaire qui fait correctement les paramètres.

#! /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
Brian White
la source
1
la réponse acceptée n'a pas fonctionné pour moi sur Win7 mais cette réponse a fonctionné comme un charme. J'ai pu configurer exim-config avec des privilèges élevés, puis vim-modifier le fichier /etc/exim.conf par la suite. Nappe.
nanker le
2

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 distincte entre guillemets. Vous n'obtiendrez 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.

user2618594
la source
2

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

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

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

Sopalajo de Arrierez
la source
1

J'ai atterri ici via Google, et je pense en fait que j'ai trouvé un moyen d'obtenir un root promt pleinement fonctionnel dans cygwin.

Voici mes étapes.

Vous devez d'abord renommer le compte administrateur Windows en "root". Pour ce faire, ouvrez le manuel de démarrage et tapez "gpedit.msc"

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

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

Déconnectez-vous maintenant et connectez-vous au compte root.

Maintenant, définissez une variable d'environnement pour cygwin. Pour ce faire facilement: Cliquez avec le bouton droit sur Poste de travail> Propriétés

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

En 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 \ Administrator , 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 changer les numéros en surbrillance en 0!)

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

Maintenant que tout cela est terminé, ce bit suivant 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 êtes arrivé jusqu'ici, peut-être que vous pouvez trouver le chemin. Et partagez s'il vous plaît)

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 à votre compte utilisateur Windows normal.

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

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

Hydranix
la source
1

N'étant pas satisfait de la solution disponible, j'ai adopté le script de nu774 pour ajouter de la sécurité et le rendre plus facile à installer et à utiliser. Le projet est disponible sur Github

Pour l'utiliser, téléchargez-le cygwin-sudo.pyet exécutez-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"
Chroniques
la source
0

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 appuyez sur le bouton surligné.

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

Un effet secondaire est la couleur différente dans la fenêtre cmd d'administration. Pour l'utiliser 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\""
user2988447
la source
0

Un moyen très simple d'avoir un shell cygwin et les sous-shell correspondants pour fonctionner avec les privilèges d'administrateur est de changer les propriétés du lien qui ouvre le shell initial.

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

Je démarre généralement le shell cygwin à partir d'un lien cygwin au début bouton de (ou sur le bureau). Ensuite, j'ai changé les propriétés du cygwin-link dans les onglets

/ Compatibilité / Niveau de privilège /

et coché la case,

"Exécutez 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 également.

DMH
la source
Le seul problème mineur est que vous ne pouvez pas dire s'il est ouvert en tant qu'administrateur.
Edwin Pratt
0

J'ai rencontré cette discussion à la recherche de quelques détails sur l' sudoimplémentation 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 mis en œuvre pour tout exécuter 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 aucun succès. J'ai essayé d'utiliser des tubes nommés pour capturer STDOUT / STDERR et imprimer dans la fenêtre principale. Mais le processus enfant n'a pas écrit dans les tubes nommés. Cependant, l'écriture dans un fichier normal fonctionne bien.

J'ai abandonné toutes les tentatives pour trouver la cause première et laissé la solution actuelle telle quelle. J'espère que mon message pourra également être utile.

Améliorations:

  • pas de fichier temporaire
  • pas d'analyse et de reconstruction des options de ligne de commande
  • attendez la commande élevée
  • utilisez minttyou bash, si le premier n'est pas trouvé
  • renvoie le code de sortie de la commande
    #! / bin / bash

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

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

    # Désormais, nous pouvons:
    # - lance la commande
    # - afficher le message
    # - renvoie le code de sortie
    "$ @"
    RETOUR = $?

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

    quitter $ RETVAL

jsxt
la source
Comment ne cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"pas casser s'il y a des espaces dans un argument? Cela a toujours été le cas pour moi en passant par cygstart / runas.
Brian White
0

Sur la base de la réponse de @ mat-khor, j'ai pris le syswin su.exe, l'ai enregistré sous manufacture-syswin-su.exeet j'ai écrit ce script wrapper. Il gère la redirection de stdout et stderr de la commande, afin qu'il puisse être utilisé dans un tube, etc. De plus, le script se termine avec l'état de la commande donnée.

Limites:

  • Les options syswin-su sont actuellement codées en dur pour utiliser l'utilisateur actuel. La pré-attente env USERNAME=...de l'appel de script le remplace. Si d'autres options étaient nécessaires, le script devrait faire la distinction entre syswin-su et les arguments de commande, par exemple en divisant en 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")
EndlosSchleife
la source
-1

Je ne peux pas tester complètement cela moi-même, je n'ai pas de script approprié pour l'essayer, et je ne suis pas un expert Linux, mais vous pourrez 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éez un utilisateur sur la machine Windows LOCALE appelée 'root', faites-en un membre du groupe 'Administrateurs'
  • Marquez le bin / bash.exe comme `` Exécuter en tant qu'administrateur '' pour tous les utilisateurs (vous devrez évidemment l'activer / le désactiver au fur et à mesure que vous en aurez besoin)
  • Maintenez le bouton Maj gauche 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 ensuite en tant qu'utilisateur appelé «root» dans cygwin, ce qui, associé au «Exécuter en tant qu'administrateur» sur le fichier bash.exe, peut suffire.

Cependant, vous avez toujours besoin d'un sudo.

J'ai simulé cela (et quelqu'un d'autre avec plus de connaissances Linux peut probablement le simuler 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 d'autres semblent fonctionner correctement pour moi, vous voudrez peut-être l'essayer.

Soyez intéressé de savoir si cela répond à vos besoins ou non.

LarryDavid
la source
-1

Ce que je fais habituellement, c'est d'avoir un assistant de registre "Ouvrir ici" afin d'ouvrir un shell cygwin avec des privilèges administratifs assez facilement de n'importe où dans mon ordinateur.

Sachez que vous devez avoir installé le paquet cygwin "chere", 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 de 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 récupérer ce code, le copier et le coller et l'enregistrer dans un fichier name.reg pour l'exécuter ... ou vous pouvez ajouter manuellement les valeurs.

link_boy
la source
-5

Essayer:

chmod -R ug+rwx <dir>

<dir>est le répertoire sur lequel vous souhaitez modifier les autorisations.

Shanmukh
la source
5
Comment cela le fera-t-il s'enraciner, comme il le demande?
Nikana Reklawyks