it-swarm.com.de

Root-Benutzer/Sudo-Äquivalent in Cygwin?

Ich versuche ein Bash-Skript in Cygwin auszuführen. 

Ich bekomme Must run as root, i.e. Sudo ./scriptname Fehler. 

chmod 777 scriptname hilft nicht weiter. 

Ich habe nach Möglichkeiten gesucht, Sudo auf Cygwin zu imitieren, einen Root-Benutzer hinzuzufügen, da der Aufruf von "su" den Fehler su: user root does not exist, alles nützliche darstellt und nichts gefunden hat. 

Hat jemand Anregungen?

144
Ken Bellows

Ich habe diese Frage am SuperUser beantwortet, aber erst nachdem das OP die wenig hilfreiche Antwort außer Acht gelassen hatte, war dies die einzige Antwort auf die Frage.

Dies ist der richtige Weg, um Berechtigungen in Cygwin zu erhöhen, kopiert aus meiner eigenen Antwort auf SuperUser:

Ich habe die Antwort auf der Cygwin-Mailingliste gefunden. Um command mit erhöhten Berechtigungen in Cygwin auszuführen, stellen Sie dem Befehl cygstart --action=runas wie folgt vor:

$ cygstart --action=runas command

Dies öffnet ein Windows-Dialogfeld, in dem Sie nach dem Administratorkennwort gefragt werden. Führen Sie den Befehl aus, wenn das richtige Kennwort eingegeben wurde.

Dies kann leicht in Skripts geschrieben werden, solange sich ~/bin in Ihrem Pfad befindet. Erstellen Sie eine Datei ~/bin/Sudo mit folgendem Inhalt:

#!/usr/bin/bash
cygstart --action=runas "[email protected]"

Machen Sie nun die Datei ausführbar:

$ chmod +x ~/bin/Sudo

Jetzt können Sie Befehle mit erhöhten echten Berechtigungen ausführen:

$ Sudo elevatedCommand

Möglicherweise müssen Sie ~/bin zu Ihrem Pfad hinzufügen. Sie können den folgenden Befehl auf der Cygwin-CLI ausführen oder zu ~/.bashrc hinzufügen:

$ PATH=$HOME/bin:$PATH

Getestet unter 64-Bit Windows 8.

198
dotancohen

Möglicherweise müssen Sie die cygwin-Shell als Administrator ausführen. Sie können mit der rechten Maustaste auf die Verknüpfung klicken und auf Als Administrator ausführen klicken oder die Eigenschaften der Verknüpfung aufrufen und im Abschnitt zur Kompatibilität überprüfen. Vorsicht, Root-Berechtigungen können gefährlich sein.

47
Matt Williamson

Aufbauend auf dotancohens Antwort Ich verwende einen Alias:

alias Sudo="cygstart --action=runas"

Funktioniert als Zauber:

Sudo chown User:Group <file>

Und wenn Sie SysInternals installiert haben, können Sie als Systembenutzer sogar ganz einfach eine Befehls-Shell starten

Sudo psexec -i -s -d cmd
17
thoni56

Ich fand Sudo-for-cygwin , vielleicht würde dies funktionieren, es ist eine Client/Server-Anwendung, die ein Python-Skript verwendet, um einen untergeordneten Prozess in Windows (pty) zu erzeugen, und tty und Prozess-E/A des Benutzers überbrückt.

Es erfordert Python in Windows- und Python-Modul-Greenlet und Eventlet in Cygwin.

9
AdamTheWebMan

Es scheint, dass cygstart/runas"[email protected]" nicht ordnungsgemäß verarbeitet. Befehle, die Argumente enthalten, die Leerzeichen enthalten (und möglicherweise andere Shell-Metazeichen - ich habe es nicht geprüft), funktionieren nicht richtig.

Ich beschloss, einfach ein kleines Sudo-Skript zu schreiben, das funktioniert, indem ein temporäres Skript geschrieben wird, das die Parameter richtig ausführt.

#! /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
   "[email protected]"
   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 "[email protected]"; 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

Diese Antwort basiert auf einer anderen Antwort . Stellen Sie zunächst sicher, dass sich Ihr Konto in der Gruppe Administratoren befindet.

Als nächstes erstellen Sie eine generische "runas-admin.bat" -Datei mit folgendem Inhalt:

@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

Führen Sie dann die Batchdatei folgendermaßen aus:

./runas-admin.bat "<command1> [parm1, parm2, ...]" "<command2> [parm1, parm2, ...]"

Zum Beispiel:

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

Stellen Sie sicher, dass Sie jeden einzelnen Befehl in doppelte Anführungszeichen setzen. Sie erhalten die UAC-Eingabeaufforderung nur einmal, wenn Sie diese Methode verwenden. Dieses Verfahren wurde verallgemeinert, sodass Sie jeden Befehl verwenden können.

2
user2618594

Oder installieren Sie das syswin-Paket, das einen Port von su für cygwin enthält: http://sourceforge.net/p/manufacture/wiki/syswin-su/

2
Mat Khor

Ein neuer Vorschlag zur Verbesserung von Sudo für CygWin aus GitHub in diesem Thread namens TOUACExt

  • Öffnet sudoserver.py automatisch.
  • Schließt sudoserver.py nach einem Timeout (Standardeinstellung 15 Minuten) automatisch.
  • Anforderung der UAC-Erhöhungsaufforderung Ja/Nein für Administratorbenutzer.
  • Fordern Sie den Admin-Benutzer/das Passwort für Nicht-Admin-Benutzer an.
  • Funktioniert remote (SSH) mit Administratorkonten.
  • Erzeugt ein Protokoll.

Noch in Pre-Beta, aber es scheint zu funktionieren.

Ich bin hier durch Google gelandet und glaube wirklich, dass ich einen Weg gefunden habe, einen voll funktionsfähigen Root Promt in Cygwin zu finden.

Hier sind meine Schritte.

Zuerst müssen Sie das Windows-Administratorkonto in "root" umbenennen Öffnen Sie dazu das Startmenü und geben Sie "gpedit.msc" ein.

Bearbeiten Sie den Eintrag unter Richtlinie für lokale Computer> Computerkonfiguration> Windows-Einstellungen> Sicherheitseinstellungen> Lokale Richtlinien> Sicherheitsoptionen> Konten: Administratorkonto umbenennen

Dann müssen Sie das Konto aktivieren, falls es noch nicht aktiviert ist. Lokale Richtlinien> Computerkonfiguration> Windows-Einstellungen> Sicherheitseinstellungen> Lokale Richtlinien> Sicherheitsoptionen> Konten: Status des Administratorkontos 

Melden Sie sich jetzt ab und melden Sie sich beim Root-Konto an.

Legen Sie nun eine Umgebungsvariable für cygwin fest. Gehen Sie dazu folgendermaßen vor: Klicken Sie mit der rechten Maustaste auf Arbeitsplatz> Eigenschaften

Klicken Sie (in der linken Seitenleiste) auf "Erweiterte Systemeinstellungen".

Klicken Sie unten auf die Schaltfläche "Umgebungsvariablen"

Klicken Sie unter "Systemvariablen" auf die Schaltfläche "Neu ..."

Geben Sie für den Namen "cygwin" ohne die Anführungszeichen ein .. _. Geben Sie als Wert den Wert in Ihr cygwin-Stammverzeichnis ein. (Mein war C:\cygwin)

Klicken Sie auf OK und schließen Sie alles, um zum Desktop zurückzukehren.

Öffnen Sie ein Cygwin-Terminal (cygwin.bat)

Bearbeiten Sie die Datei /etc/passwdund ändern Sie die Zeile

Administrator : nicht verwendet: 500: 503 : U - MASCHINE\Administrator , S-1-5-21-12345678-1234567890-1234567890 - 500:/home/Administrator :/bin/bash

Zu diesem Zweck (Ihre Nummern und Ihr Rechnername werden sich unterscheiden, stellen Sie sicher, dass Sie die hervorgehobenen Zahlen in 0 ändern!)

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

Nun, da alles fertig ist, wird der Befehl "su" mit diesem nächsten Bit funktionieren. (Nicht perfekt, aber es wird genug funktionieren, um es zu benutzen. Ich glaube nicht, dass Skripte richtig funktionieren werden, aber hey, Sie sind so weit gekommen, vielleicht können Sie den Weg finden. Und bitte teilen)

Führen Sie diesen Befehl in cygwin aus, um den Deal abzuschließen.

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'

Melden Sie sich vom Root-Konto ab und wieder in Ihrem normalen Windows-Benutzerkonto.

Führen Sie anschließend die neue "su.bat" manuell aus, indem Sie im Explorer darauf doppelklicken. Geben Sie Ihr Passwort ein und schließen Sie das Fenster.

Versuchen Sie nun, den Befehl su von cygwin auszuführen, und prüfen Sie, ob alles in Ordnung ist.

1
Hydranix

Da ich mit der verfügbaren Lösung nicht zufrieden bin, habe ich das Skript von nu774 verwendet, um die Sicherheit zu erhöhen und die Einrichtung und Verwendung zu erleichtern. Das Projekt ist verfügbar auf Github

Um es zu verwenden, laden Sie einfach cygwin-Sudo.py herunter und führen Sie es über python3 cygwin-Sudo.py **yourcommand** aus.

Sie können einen Alias ​​für die Bequemlichkeit einrichten:

alias Sudo="python3 /path-to-cygwin-Sudo/cygwin-Sudo.py"
1
Chronial

Eine sehr einfache Möglichkeit, eine cygwin-Shell und entsprechende Subshells für den Betrieb mit Administratorrechten zu verwenden, besteht darin, die Eigenschaften von link zu ändern, wodurch die ursprüngliche Shell geöffnet wird.

Folgendes gilt für Windows 7+ (möglicherweise auch für frühere Versionen, aber ich habe es nicht geprüft)

Normalerweise starte ich die cygwin-Shell über einen cygwin-Link in der Taste start (oder auf dem Desktop) ..__ und änderte dann die Eigenschaften des cygwin-Links in den Registerkarten

/ Kompatibilität/Berechtigungsstufe /

und überprüfte das Kästchen

"Dieses Programm als Administrator ausführen"

Dadurch kann die cygwin-Shell auch mit Administratorrechten und den entsprechenden Subshells geöffnet werden.

0
DMH

Ich traf diese Diskussion, als ich nach Details zur Sudo-Implementierung in verschiedenen Betriebssystemen suchte. Beim Lesen habe ich herausgefunden, dass die Lösung von @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) nützlich ist, aber leicht verbessert werden kann. Ich habe es vermieden, die temporäre Datei zu erstellen, und habe alles implementiert, um alles mit einem einzigen Skript auszuführen. 

Ich untersuchte auch den nächsten Schritt der Verbesserung der Ausgabe innerhalb des einzelnen Fensters/der Konsole. Leider ohne erfolg. Ich habe versucht, Named Pipes zu verwenden, um STDOUT/STDERR zu erfassen und im Hauptfenster zu drucken. Der untergeordnete Prozess hat jedoch nicht in Named Pipes geschrieben. Das Schreiben in eine reguläre Datei funktioniert jedoch gut. 

Ich habe alle Versuche, die Ursache zu finden, fallen gelassen und die aktuelle Lösung so belassen, wie sie ist. Ich hoffe, mein Beitrag kann auch nützlich sein.

Verbesserungen:

  • keine temporäre Datei
  • keine Analyse und Rekonstruktion der Befehlszeilenoptionen
  • warten Sie auf den erhöhten Befehl
  • verwenden Sie mintty oder bash, wenn die erste nicht gefunden wurde
  • den Befehlsexitcode zurückgeben
 #!/bin/bash 

 # Als Administratoren rufen Sie den Befehl direkt auf 
 id -G | grep -qw 544 && {
 "$ @" 
 Beenden Sie $? 
 } 

 # Die Variable CYG_Sudo wird zur Steuerung des Befehlsaufrufs verwendet 
 [-z "$ CYG_Sudo"] && {
 mintty = "$ (welche Mintty 2>/dev/null)" 
 export CYG_Sudo = "$$" 
 cygstart --wait --action = runas $ mintty/bin/bash "$ 0" "$ @" 
 Beenden Sie $? 
 } 

 # Jetzt können wir: 
 # - Starten Sie den Befehl 
 # - Nachricht anzeigen 
 # - gibt den Exit-Code zurück 
 "$ @" 
 RETVAL = $? 

 echo "$ 0: Zum Schließen des Fensters drücken ..." 
 lesen

 Beenden Sie $ RETVAL 

0
jsxt

Basierend auf der Antwort von @ mat-khor nahm ich das syswin su.exe , speicherte es als manufacture-syswin-su.exe und schrieb dieses Wrapper-Skript. Es verwaltet die Umleitung von stdout und stderr des Befehls, sodass es in einer Pipe usw. verwendet werden kann. Außerdem wird das Skript mit dem Status des angegebenen Befehls beendet.

Einschränkungen:

  • Die syswin-su-Optionen sind derzeit fest programmiert, um den aktuellen Benutzer zu verwenden. Das Voranstellen von env USERNAME=... vor dem Skriptaufruf setzt diesen außer Kraft. Wenn andere Optionen benötigt würden, müsste das Skript zwischen syswin-su und Befehlsargumenten unterscheiden, z. Teilen beim ersten --.
  • Wenn die UAC-Eingabeaufforderung abgebrochen oder abgelehnt wird, bleibt das Skript hängen.

.

#!/bin/bash
set -e

# join command [email protected] into a single string with quoting (required for syswin-su)
cmd=$( ( set -x; set -- "[email protected]"; ) 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

Verwenden Sie diese Option, um ein Verwaltungsfenster mit bash oder cmd aus einem Kontextmenü des Verzeichnisses aufzurufen. Klicken Sie einfach mit der rechten Maustaste auf einen Verzeichnisnamen und wählen Sie den Eintrag aus oder drücken Sie die hervorgehobene Schaltfläche.

Dies basiert auf dem chere-Tool und der leider nicht funktionierenden Antwort (für mich) von link_boy. Es funktioniert gut für mich mit Windows 8, 

Ein Nebeneffekt ist die andere Farbe im Admin-Cmd-Fenster. Um dies für bash zu verwenden, können Sie die .bashrc-Datei des Admin-Benutzers ändern.

Ich konnte die "Hintergrund" -Version (Rechtsklick in ein offenes Verzeichnis) nicht ausführen. Fühlen Sie sich frei, es hinzuzufügen.

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