L'utilisateur Root/sudo équivalent dans Cygwin?
j'essaie de lancer un script bash à Cygwin.
je reçois Must run as root, i.e. sudo ./scriptname
erreurs.
chmod 777 scriptname
ne fait rien pour aider.
j'ai cherché des moyens d'imiter sudo sur Cygwin, pour ajouter un utilisateur root, car appeler" su "rend l'erreur su: user root does not exist
, quelque chose d'utile, et n'ont rien trouvé.
Quelqu'un a une suggestion?
16 réponses
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 permissions dans Cygwin, copié 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, précédez 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 administrateur et lancera la commande si le mot de passe approprié est entré.
c'est facilement scripté, tant que ~/bin
est sur votre chemin. Créer un fichier ~/bin/sudo
avec le contenu suivant:
#!/usr/bin/bash
cygstart --action=runas "$@"
maintenant rendre le fichier exécutable:
$ chmod +x ~/bin/sudo
Maintenant, vous pouvez exécuter des commandes avec réel des privilèges élevés :
$ sudo elevatedCommand
vous devrez peut-être ajouter ~/bin
à votre chemin. Vous pouvez exécuter la commande suivante sur le clip Cygwin, ou l'ajouter à ~/.bashrc
:
$ PATH=$HOME/bin:$PATH
testé sur Windows 64 bits 8.
vous devez probablement exécuter le shell cygwin comme administrateur. Vous pouvez cliquer droit sur le raccourci et cliquez sur exécuter en tant qu'administrateur ou d'aller dans les propriétés du raccourci et de la compatibilité avec l'article. Il suffit de se méfier.... les permissions root peuvent être dangereuses.
s'appuyant sur dotancohen la réponse de je suis en utilisant un alias:
alias sudo="cygstart --action=runas"
Fonctionne comme un charme:
sudo chown User:Group <file>
j'ai trouvé sudo-for-cygwin , peut-être que cela fonctionnerait, c'est une application client/serveur qui utilise un script python pour lancer un processus enfant dans windows (pty) et passerelles tty de l'utilisateur et le processus I /O.
il nécessite python dans windows et modules Python greenlet, et eventlet dans Cygwin.
il semble que cygstart/runas
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 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 fait 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 " \" >>$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"151900920": 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
Cette réponse est basée sur des autre réponse . Tout d'abord, assurez-vous que votre compte est dans le groupe Administrateurs.
ensuite, créer un" runas-admin.bat "fichier 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
puis exécutez le fichier batch comme ceci:
./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"
pour exaxmple:
./runas-admin.bat "net localgroup newgroup1 /add" "net localgroup newgroup2 /add"
assurez-vous juste de joindre chaque commande séparée en double citation. 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 pour que vous puissiez utiliser n'importe quel type de commande.
Une nouvelle proposition pour améliorer SUDO pour CygWin à partir de GitHub dans ce fil , nommé TOUACExt :
- s'ouvre automatiquement sudoserver.py.
- se ferme Automatiquement sudoserver.py après la temporisation (15 minutes par défaut).
- Demande de contrôle de compte d'utilisateur de l'invite d'élévation Oui/Aucun style pour l'administration des utilisateurs.
- Demande d'utilisateur Admin/mot de passe pour les utilisateurs non-administrateurs.
- fonctionne à distance (SSH) avec les comptes administrateurs.
- crée log.
Encore Pré-Bêta , mais semble être au travail.
ou installer le paquet syswin, qui inclut un port de su pour cygwin: http://sourceforge.net/p/manufacture/wiki/syswin-su/
j'ai atterri ici grâce à google, et je crois avoir trouvé un moyen de gagner un PROMT root entièrement fonctionnel à cygwin.
Voici mes pas.
vous devez d'abord renommer le compte Administrateur Windows en " root" Pour ce faire, ouvrez start manu et tapez "gpedit.msc "
éditer l'entrée sous Politique Informatique Locale > Configuration De L'Ordinateur > Paramètres Windows > Paramètres De Sécurité > Politiques Locales > Sécurité Options > Comptes: renommer le compte administrateur
alors vous devrez activer le compte s'il n'est pas encore activé. Politique informatique locale > Configuration de L'ordinateur > paramètres de Windows > Paramètres de sécurité > politiques locales > Options en matière de sécurité > comptes: État du compte administrateur
déconnectez-vous et connectez-vous au compte racine.
définit maintenant une variable d'environnement pour cygwin. Pour cela, le moyen facile: Clic Droit Sur Mon Ordinateur > Propriétés
cliquez (sur la barre latérale gauche) "Paramètres Système avancés "
près du bas cliquez sur le bouton" Variables de L'environnement
sous" Variables système "cliquez sur le bouton" Nouveau..."bouton
Pour le nom "cygwin" sans les guillemets. Pour la valeur, entrez dans votre cygwin répertoire racine. (La mienne était C:\cygwin )
appuyez sur OK et fermez tout ça pour revenir au bureau.
ouvre un terminal Cygwin (cygwin.chauve-souris)
éditer le fichier / etc / passwd et changez la ligne
administrateur : non utilisé: 500:503 :U - MACHINE \ administrateur , S-1-5-21-12345678-1234567890-1234567890- 500:/accueil / administrateur :/bin / bash
à ceci (vos numéros, et la machine nom sera différent, assurez-vous juste que vous changez les numéros surlignés à 0!)
root : non utilisé: 0:0 :U - MACHINE\root , S-1-5-21-12345678-1234567890-1234567890- 0:/racine : / bin /bash
maintenant que tout est terminé, ce prochain bit va faire fonctionner la commande "su". (Pas parfaitement, mais c'est assez pour l'utiliser. 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 merci de partager)
exécute cette commande à cygwin pour finaliser l'accord.
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 retournez dans votre compte d'utilisateur windows normal.
après tout ça, lancez le nouveau "su.chauve-souris" manuellement en double-cliquant dessus dans l'explorateur. Entrez votre mot de passe et allez-y et fermez la fenêtre.
essayez maintenant d'exécuter la commande su de cygwin et voyez si tout s'est bien passé.
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 à configurer et à utiliser. 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"
utilisez ceci pour obtenir une fenêtre admin avec bash ou cmd tournant, à partir de n'importe quel menu de contexte de répertoires. Il suffit de cliquer avec le bouton droit de la souris sur le nom d'un répertoire, puis de sélectionner l'entrée ou de cliquer sur le bouton surligné.
ceci est basé sur l'outil chere et la réponse malheureusement ne fonctionne pas (pour moi) de link_boy. Il fonctionne très bien pour moi en utilisant Windows 8,
Un effet secondaire est la couleur différente dans l'admin fenêtre cmd. Pour utiliser cela sur bash, vous pouvez changer le .fichier bashrc de l'utilisateur administrateur.
je coudln pas obtenir le "fond" de la version (clic droit sur un répertoire ouvert) pour fonctionner. N'hésitez pas à 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\""
une façon très simple d'avoir un shell cygwin et les sous-cellules correspondantes 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 valide pour Windows 7+ (peut-être pour les versions précédentes aussi, mais je n'ai pas coché)
je démarre habituellement le shell cygwin à partir d'un lien cygwin dans le bouton démarrer (ou 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écuter ce programme en tant qu'administrateur"
cela permet au shell cygwin d'ouvrir avec les privilèges d'administrateur et les sous-cellules correspondantes.
j'ai rencontré cette discussion à la recherche de quelques détails sur l'implémentation de sudo
dans différents systèmes d'exploitation. En le lisant j'ai trouvé que la solution par @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 implémenté pour exécuter tout par le script unique.
aussi j'ai examiné l'étape suivante de l'amélioration à la production dans le unique fenêtre de la console. Malheureusement, sans succès. J'ai essayé d'utiliser des pipes nommées pour capturer STDOUT/STDERR et imprimer dans la fenêtre principale. Mais child process n'a pas écrit à named pipes. Cependant, écrire à un fichier régulier fonctionne bien.
j'ai laissé tomber toute tentative de trouver la cause profonde et j'ai laissé la solution actuelle telle quelle. J'espère que mon post peut être utile.
améliorations:
- pas de fichier temporaire
- pas de l'analyse et de reconstruction de la ligne de commande options
- attendre la commande élevée
- utiliser
mintty
oubash
, si le premier non trouvé - de retour de la commande code de sortie
#!/bin/bash # Being Administrators, invoke the command directly id -G | grep -qw 544 && { "$@" exit $? } # The CYG_SUDO variable is used to control the command invocation [ -z "$CYG_SUDO" ] && { mintty="$( which mintty 2>/dev/null )" export CYG_SUDO="$$" cygstart --wait --action=runas $mintty /bin/bash "" 151900920"" "$@" exit $? } # Now we are able to: # -- launch the command # -- display the message # -- return the exit code "$@" RETVAL=$? echo "" 151900920": Press to close window..." read exit $RETVAL
ne peut pas entièrement tester cela moi-même, je n'ai pas de script approprié pour l'essayer, et je ne suis pas un expert Linux, mais vous pourriez être en mesure de hacker quelque chose assez près.
j'ai essayé ces étapes, et elles "semblent" fonctionner, mais ne sais pas si cela suffira pour vos besoins.
Pour contourner l'absence d'un utilisateur 'root':
- créer un utilisateur sur la machine windows locale appelé "root", en faire un membre de la Groupe "Administrateurs
- marque la bin / bash.exe as 'Run as administrator' pour tous les utilisateurs (évidemment, vous devrez l'activer/désactiver au fur et à mesure que vous en aurez besoin)
- maintenez enfoncé le bouton majuscule gauche dans l'Explorateur de windows en cliquant avec le bouton droit de la souris sur le Cygwin.fichier bat
- Sélectionnez "Exécuter en tant qu'utilisateur différent'
- Enter .\root comme nom d'utilisateur puis votre mot de passe.
vous en tant qu'utilisateur appelé "root" dans cygwin, qui couplé avec le "Run as administrator" sur le bash.le fichier exe pourrait suffire.
cependant vous avez encore besoin d'un sudo.
j'ai simulé cela (et quelqu'un d'autre avec plus de connaissances sur linux peut probablement mieux le simuler) en créant un fichier appelé 'sudo' in / 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, de sorte que vous pouvez essayer.
Être intéressé de savoir si cela fonctionne pour vos besoins ou non.
ce que je fais habituellement est d'avoir un registre" ouvrir ici " helper afin d'ouvrir un shell cygwin avec des privilèges administratifs assez facile à partir de n'importe où dans mon ordinateur.
soyez conscient que vous devez avoir le paquet cygwin" chere " installé, utilisez " chere -i -m
" d'un shell cygwin élevé en premier.
si votre installation cygwin est dans C:\cygwin...
voici le code d'enregistrement:
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"
Espérons que cette aide. Laissez-moi savoir si cela fonctionne pour vous. Grâce.
PS: Vous pouvez saisir ce code, le copier et le coller et le sauvegarder dans un nom.fichier reg pour l'exécuter... ou vous pouvez ajouter manuellement les valeurs.
, Essayez:
chmod -R ug+rwx <dir>
où <dir>
est le répertoire sur lequel vous
souhaitez modifier les autorisations.