2010-11-03 43 views
130

Sto tentando di eseguire uno script bash in Cygwin.Utente root/sudo equivalente in Cygwin?

Ottengo errori Must run as root, i.e. sudo ./scriptname.

chmod 777 scriptname non fa nulla per aiutare.

Ho cercato modi per imitare sudo su Cygwin, per aggiungere un utente root, poiché la chiamata "su" restituisce l'errore su: user root does not exist, qualcosa di utile, e non ho trovato nulla.

Qualcuno ha qualche suggerimento?

+0

ciao KenB, potrebbe darci maggiori dettagli su 'script che' si sta tentando di correre? Non esiste un equivalente di "sudo" all'interno di una shell cygwin - i diritti sono quelli del win user che ha lanciato la shell cygwin, quindi il link di KyleWpppd è buono per evitare errori come "sudo unknown command". Nel tuo caso sembra che si tratti di un problema specifico con lo script che vuoi eseguire. – Stefano

+1

Onestamente, questo è un problema molto tempo fa, e in realtà non ricordo quale fosse la sceneggiatura. Grazie per l'interesse, però. –

+0

Domande correlate qui: http://superuser.com/questions/122418/theres-no-sudo-command-in-cygwin e qui: http://stackoverflow.com/questions/22527668/sudo-command-not-found -on-cygwin – Benj

risposta

177

ho risposto a questa domanda su SuperUser ma solo dopo l'OP ignorato la risposta inutile che era al momento l'unica risposta alla domanda.

Ecco il modo corretto di elevare le autorizzazioni in Cygwin, copiati dalla mia risposta su SuperUser:

ho trovato la risposta su the cygwin mailing list. Per eseguire command con privilegi elevati a Cygwin, far precedere il comando con cygstart --action=runas come questo:

$ cygstart --action=runas command 

Si aprirà una finestra di dialogo di Windows che chiede la password di amministratore ed eseguire il comando se viene inserita la password corretta.

Questo è facilmente copiato, purché ~/bin sia nel tuo percorso. Creare un file ~/bin/sudo con il seguente contenuto:

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

Ora rendere il file eseguibile:

$ chmod +x ~/bin/sudo 

Ora è possibile eseguire comandi con privilegi reali elevati:

$ sudo elevatedCommand 

Si può è necessario aggiungere ~/bin al percorso. È possibile eseguire il seguente comando sul Cygwin CLI, o aggiungerlo a ~/.bashrc:

$ PATH=$HOME/bin:$PATH 

provata su 64-bit Windows 8.

+10

Ottima risposta. Con alcune modifiche al codice bash (sotto), sono stato in grado di eseguire un comando con privilegi dalla riga di comando. Ecco il cambiamento avevo bisogno di fare il vostro lavoro Codice: 'cat << 'EOF' > ~/bin/sudo \ n #/usr/bin/bash \ n cygstart --action = runas "$ @" \ n EOF' ! (Non riesco a capire come inserire newline in questo commento, quindi ho aggiunto '\ n al codice) Il resto dal PERCORSO = ... in avanti va bene. – josmith42

+0

@ josmith42: Grazie! Non vedo la differenza tra la mia sceneggiatura e la tua. Qual è la differenza? – dotancohen

+0

È principalmente la prima riga: ho 'cat << 'EOF' > ~/bin/sudo'. E ho aggiunto 'EOF' sotto la riga' cygstart' per chiudere il documento qui. – josmith42

43

Probabilmente è necessario eseguire la shell cygwin come amministratore. È possibile fare clic con il tasto destro del mouse sul collegamento e fare clic su Esegui come amministratore o accedere alle proprietà del collegamento e controllarlo nella sezione Compatibilità. Fai attenzione ... i permessi di root possono essere pericolosi.

+0

Ho provato anche quello.Niente da fare. –

+1

ha funzionato per me su Win 7 con file system NTFS – JeffG

+1

Nei tre anni trascorsi da questa domanda senza una buona risposta rispetto a questa soluzione alternativa, ho trovato il modo corretto di aumentare le autorizzazioni per un singolo comando nella versione corrente Cygwin window] (http://stackoverflow.com/a/21024592/343302) nella risposta seguente. Quindi, funziona esattamente come 'sudo' in Linux. – dotancohen

8

Ho trovato sudo-for-cygwin, forse questo avrebbe funzionato, è un'applicazione client/server che utilizza uno script python per generare un processo figlio in windows (pty) e collega il tty dell'utente e l'I/O di processo.

Richiede python in windows e greenlet di moduli Python e eventlet in Cygwin.

+0

Questo in realtà sembra piuttosto promettente. –

+0

Lo sto usando da un po 'e questo evento gestisce contenuti interattivi come nano senza problemi! – MemphiZ

-5

Prova:

chmod -R ug+rwx <dir> 

dove <dir> è la directory in cui si desidera modificare le autorizzazioni.

+4

Come lo farà radicare, come lui chiede? –

-1

Non riesco a testarlo completamente da solo, non ho uno script adatto per provarlo e non sono un esperto di Linux, ma potresti essere in grado di hackerare qualcosa di abbastanza vicino.

Ho provato questi passaggi e "sembrano" funzionare, ma non so se sarà sufficiente per le vostre esigenze.

Per ovviare alla mancanza di un utente 'root':

  • creare un utente sulla macchina Windows locale chiamato 'root', ne fanno un membro del gruppo 'Administrators'
  • Segnare il bin/bash.exe come "Esegui come amministratore" per tutti gli utenti (ovviamente dovrai accenderlo/spegnerlo come e quando necessario)
  • Tieni premuto il tasto Maiusc sinistro in Windows Explorer mentre fai clic con il pulsante destro del mouse su Cygwin .bat file
  • Seleziona "Esegui come utente diverso"
  • Immettere. \ Root come nome utente e quindi la password.

Questo quindi viene eseguito dall'utente come "root" in cygwin, che potrebbe essere sufficiente con "Esegui come amministratore" nel file bash.exe.

Tuttavia è ancora necessario un sudo.

Finsi questo (e qualcun altro con più conoscenza Linux può probabilmente fingere meglio) con la creazione di un file chiamato 'sudo' in/bin e l'utilizzo di questa riga di comando per inviare il comando di Su, invece:

su -c "$*" 

La riga di comando 'sudo vim' e altri sembrano funzionare bene per me, quindi potresti volerlo provare.

Essere interessati a sapere se questo funziona per le vostre esigenze o no.

1

Sono atterrato qui tramite Google e in realtà credo di aver trovato un modo per ottenere un promemoria root pienamente funzionante in cygwin.

Ecco i miei passi.

In primo luogo è necessario rinominare l'account Administrator di Windows a "root" farlo aprendo manu inizio e digitare "gpedit.msc"

Modifica la voce sotto Criteri Computer locale> Configurazione computer> Impostazioni di Windows> Impostazioni di sicurezza> Criteri locali> Opzioni di sicurezza> Account: Rinomina account amministratore

Quindi dovrai abilitare l'account se non è ancora abilitato. Criteri del computer locale> Configurazione computer> Impostazioni di Windows> Impostazioni sicurezza> Criteri locali> Opzioni di sicurezza> Account: stato account amministratore

Ora uscire e accedere all'account root.

Ora impostare una variabile di ambiente per cygwin. Per farlo nel modo più semplice: destro su Risorse del computer> Proprietà

clic (sulla barra laterale a sinistra) "Impostazioni di sistema avanzate"

Nella parte inferiore cliccare "Variabili Enviroment" pulsante

In " Variabili di sistema "fare clic sul pulsante" Nuovo ... "

Per il nome inserire" cygwin "senza virgolette. Per il valore, immettere nella directory root cygwin. (Il mio era C: \ cygwin)

Premere OK e chiudere tutto per tornare al desktop.

Aprire un terminale Cygwin (cygwin.bat)

Modificare il file/etc/passwd e cambiare la linea

amministratore: inutilizzato: 500: 503: U- MACCHINA \ Amministratore, S-1-5-21-12345678-1234567890-1234567890- 500:/home/Amministratore:/bin/bash

A questo (i numeri e il nome della macchina saranno diversi, assicurati di cambiare i numeri evidenziati a 0!)

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

Ora che tutto è finito, questo prossimo bit farà funzionare il comando "su". (Non perfettamente, ma funzionerà abbastanza da usare. Non penso che gli script funzionino correttamente, ma hey, sei arrivato così lontano, forse puoi trovare la strada e per favore condividi)

Esegui questo comando in cygwin per finalizzare l'accordo.

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' 

Disconnettersi dall'account root e tornare al normale account utente di Windows.

Dopo tutto ciò, eseguire manualmente il nuovo "su.bat" facendo doppio clic su di esso in Esplora risorse. Inserisci la tua password e vai avanti e chiudi la finestra.

Ora prova a eseguire il comando su da cygwin e vedere se tutto ha funzionato bene.

-1

Quello che faccio di solito è avere un helper di registro "Apri qui" per aprire una shell cygwin con privilegi amministrativi abbastanza semplice da qualsiasi parte del mio computer.

Tenere presente che è necessario installare il pacchetto cygwin "chere", utilizzare prima "chere -i -m" da una shell cygwin elevata.

Supponendo che l'installazione di Cygwin è in C: \ cygwin ...

Ecco il codice di registro:

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" 

Spero che questo aiuti. Fammi sapere se funziona per te. Grazie.

PS: è possibile prendere questo codice, copiarlo e incollarlo e salvarlo in un file name.reg per eseguirlo ... oppure è possibile aggiungere manualmente i valori.

1

Questa risposta è basata su another answer. Prima di tutto, assicurati che il tuo account sia nel gruppo degli amministratori.

successivo, creare un file generico "runas-admin.bat" con il seguente contenuto:

@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 

quindi eseguire il file batch come questo:

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

Per exaxmple:

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

Assicurati di includere ogni comando separato tra virgolette. Riceverete il prompt UAC solo una volta utilizzando questo metodo e questa procedura è stata generalizzata in modo da poter utilizzare qualsiasi tipo di comando.

0

Da utilizzare per ottenere una finestra di amministrazione con bash o cmd in esecuzione, da qualsiasi menu di contesto delle directory.Basta fare clic destro sul nome di una directory e selezionare la voce o premere il tasto highlited.

Questo è basato sullo strumento chere e la risposta, purtroppo non funzionante (per me) da link_boy. Funziona perfettamente con Windows 8,

Un effetto collaterale è il colore diverso nella finestra di amministrazione cmd. Per usarlo su bash, puoi cambiare il file .bashrc dell'utente admin.

Non riesco a ottenere la versione "di sfondo" (fare clic con il tasto destro su una directory aperta) per eseguire. Sentiti libero di aggiungerlo.

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\"" 
2

Una nuova proposta per migliorare SUDO per Cygwin da GitHub in this thread, di nome TOUACExt:

  • apre automaticamente sudoserver.py.
  • Chiude automaticamente sudoserver.py dopo il timeout (15 minuti predefiniti).
  • Richiesta richiesta elevazione UAC Sì/Nessuno stile per gli utenti amministratori.
  • Richiedi utente/password amministratore per utenti non amministratori.
  • Funziona in remoto (SSH) con account di amministratore.
  • Crea registro.

Ancora in Pre-Beta, ma sembra funzionare.

10

Sulla dotancohen's answer sto usando un alias:

alias sudo="cygstart --action=runas" 

Funziona come un fascino:

sudo chown User:Group <file> 
+0

Preferisco questo approccio piuttosto che la risposta accettata, grazie! –

0

Un modo molto semplice per avere una shell cygwin e subshell corrispondenti per operare con i privilegi di amministratore è quello di modificare le proprietà dello link che apre la shell iniziale.

Quello che segue è valida per Windows 7+ (forse per le versioni precedenti anche, ma non ho controllato)

solito avviare la shell cygwin da un cygwin-link nel pulsante di avvio (o desktop). Poi, ho cambiato le proprietà del cygwin-link nella linguette

/Compatibilità/Privilege Livello/

e selezionata la casella,

"Esegui questo programma come amministratore"

Ciò consente alla shell cygwin di aprirsi con i privilegi di amministratore e anche le subshell corrispondenti.

2

Sembra che cygstart/runas non gestisca correttamente "[email protected]" e quindi i comandi che contengono argomenti contenenti spazi (e forse altri metacaratteri della shell - Non ho controllato) non funzioneranno correttamente.

Ho deciso di scrivere un piccolo script sudo che funziona scrivendo uno script temporaneo che esegue correttamente i parametri.

#! /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 
+0

la risposta accettata non ha funzionato per me su Win7 ma questa risposta ha funzionato come un fascino. Sono stato in grado di configurare exim-config con privilegiati elevati e poi modificare il file /etc/exim.conf in seguito. Slick. – nanker

1

essere infelice con la soluzione a disposizione, ho adottato nu774's script di aggiungere la sicurezza e rendere più facile da installare ed usare. Il progetto è disponibile on Github

Per utilizzarlo, è sufficiente scaricare cygwin-sudo.py ed eseguirlo tramite python3 cygwin-sudo.py **yourcommand**.

È possibile configurare un alias per comodità:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"