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?
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.
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.
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
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.
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
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.
Oder installieren Sie das syswin-Paket, das einen Port von su für cygwin enthält: http://sourceforge.net/p/manufacture/wiki/syswin-su/
Ein neuer Vorschlag zur Verbesserung von Sudo für CygWin aus GitHub in diesem Thread namens TOUACExt
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.
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"
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.
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:
mintty
oder bash
, wenn die erste nicht gefunden wurde#!/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
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:
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 --
..
#!/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")
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\""