Utente root / sudo equivalente in Cygwin?


156

Sto cercando di eseguire uno script bash in Cygwin.

Ottengo Must run as root, i.e. sudo ./scriptnameerrori.

chmod 777 scriptname non fa nulla per aiutare.

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

Qualcuno ha qualche suggerimento?


ciao KenB, potresti darci maggiori dettagli sulla whatsceneggiatura che stai cercando di eseguire? Non esiste un equivalente di 'sudo' all'interno di una shell cygwin - i diritti sono quelli dell'utente win che ha lanciato la shell cygwin, quindi il link KyleWpppd è buono per evitare errori come "sudo unknown command". Nel tuo caso sembra che sia un problema specifico con lo script che desideri eseguire.
Stefano,

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

Risposte:


225

Ho risposto a questa domanda su SuperUser ma solo dopo che l'OP ha ignorato la risposta inutile che all'epoca era l'unica risposta alla domanda.

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

Ho trovato la risposta sulla mailing list di Cygwin . Per eseguire commandcon privilegi elevati in Cygwin, precedere il comando in cygstart --action=runasquesto modo:

$ cygstart --action=runas command

Questo aprirà una finestra di dialogo di Windows che richiede la password dell'amministratore ed eseguirà il comando se viene inserita la password corretta.

Questo è facilmente scriptato, purché ~/binsia sul tuo percorso. Crea un file ~/bin/sudocon il seguente contenuto:

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

Ora rendi eseguibile il file:

$ chmod +x ~/bin/sudo

Ora puoi eseguire comandi con privilegi elevati reali :

$ sudo elevatedCommand

Potrebbe essere necessario aggiungere ~/binal tuo percorso. È possibile eseguire il comando seguente sulla CLI di Cygwin o aggiungerlo a ~/.bashrc:

$ PATH=$HOME/bin:$PATH

Testato su Windows 8 a 64 bit.

Al posto dei passaggi precedenti puoi anche aggiungere un alias per questo comando a ~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'

12
Risposta eccellente. Con alcune modifiche al tuo codice bash (sotto), sono stato in grado di eseguire un comando elevato dalla riga di comando. Ecco la modifica di cui avevo bisogno per far funzionare il tuo codice: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (Non riesco a capire come inserire nuove righe in questo commento, quindi ho aggiunto '\ n's al codice) Il resto dal PATH = ... in poi va bene .
josmith42,

3
Oh, capisco! Se non sbaglio, questo è il tuo modo di scrivere il file su disco, invece di aprire un editor di testo. Bello grazie! Non sapevo usare heredocs in Bash!
dotancohen,

8
Il problema è che crea una finestra del terminale completamente nuova (di solito conhost). L'output non è integrato nel terminale corrente.
CMCDragonkai

1
L'unico modo per eseguire cose del genere lsè avvolgerlo in un lungo processo come mintty o bash o zsh. Ma tutto appare in un terminale separato. Che a questo punto, avrei potuto semplicemente aprirlo tramite la GUI usando ConEMU.
CMCDragonkai

1
Senza le virgolette, anche gli argomenti tra virgolette vengono nuovamente suddivisi negli spazi, @katriel. Con le virgolette, si "$@"espande in qualcosa di simile "$1" "$2" "$3" ...e senza, si $@espande in $1 $2 $3....
Palec,

51

Probabilmente dovrai eseguire la shell cygwin come amministratore. È possibile fare clic con il tasto destro del collegamento e fare clic su Esegui come amministratore oppure accedere alle proprietà del collegamento e verificarlo nella sezione compatibilità. Attenzione .... i permessi di root possono essere pericolosi.


1
Nei tre anni trascorsi da quando questa domanda è stata posta senza una buona risposta rispetto a questa soluzione alternativa, ho trovato il modo corretto di aumentare le autorizzazioni per un singolo comando nella finestra esistente di Cygwin nella risposta seguente. Pertanto, funziona esattamente come sudoin Linux.
dotancohen,

Ha funzionato per me su Win10 64. Ho dovuto cambiare la proprietà dei file scaricati da un server con rsync. chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*. Senza di essa non potrei accedere alle cartelle e ai file rsynced.
lowtechsun,

25

Sulla base della risposta di dotancohen sto usando un alias:

alias sudo="cygstart --action=runas"

Funziona come un fascino:

sudo chown User:Group <file>

E se hai installato SysInternals puoi anche avviare una shell dei comandi come utente di sistema molto facilmente

sudo psexec -i -s -d cmd

9

Ho trovato sudo-for-cygwin , forse funzionerebbe, si tratta di un'applicazione client / server che utilizza uno script Python per generare un processo figlio in Windows (pty) e collega l'utente tty e l'I / O di processo.

Richiede Python in Windows e il modulo verde Python e l'evento in Cygwin.


Lo sto usando da un po 'di tempo e l'evento gestisce cose interattive come nano senza problemi!
MemphiZ,


4

Sembra che cygstart/runasnon gestisca correttamente "$@"e quindi i comandi che hanno argomenti contenenti spazi (e forse altri meta-caratteri della shell - non ho controllato) non funzioneranno correttamente.

Ho deciso di scrivere solo un piccolo sudoscript che funzioni scrivendo uno script temporaneo che fa 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
   "$@"
   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

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

2

Questa risposta si basa su un'altra risposta . Prima di tutto, assicurati che il tuo account sia nel gruppo Administrators.

Successivamente, crea un file "runas-admin.bat" generico 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 in questo modo:

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

Per esempio:

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

Assicurati solo di racchiudere ogni comando separato tra virgolette doppie. Riceverai il prompt UAC solo una volta usando questo metodo e questa procedura è stata generalizzata in modo da poter usare qualsiasi tipo di comando.


2

Una nuova proposta per migliorare SUDO per CygWin da GitHub in questo thread , denominata TOUACExt :

  • Apre automaticamente sudoserver.py.
  • Chiude automaticamente sudoserver.py dopo il timeout (impostazione predefinita 15 minuti).
  • Richiedi prompt elevazione UAC Sì / No stile per utenti amministratori.
  • Richiedi utente / password amministratore per utenti non amministratori.
  • Funziona in remoto (SSH) con account admin.
  • Crea registro.

Ancora in pre-beta , ma sembra funzionare.


1

Sono arrivato qui tramite google e in realtà credo di aver trovato un modo per ottenere un promt root completamente funzionante in Cygwin.

Ecco i miei passi.

Per prima cosa devi rinominare l'account dell'amministratore di Windows in "root". Fallo aprendo manu start e digitando "gpedit.msc"

Modificare la voce in Criteri del computer locale> Configurazione del 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 del computer> Impostazioni di Windows> Impostazioni di sicurezza> Criteri locali> Opzioni di sicurezza> Account: stato dell'account amministratore

Ora disconnettersi e accedere all'account di root.

Ora imposta una variabile d'ambiente per cygwin. Per farlo nel modo più semplice: fai clic con il pulsante destro del mouse su Risorse del computer> Proprietà

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

Nella parte inferiore fai clic sul pulsante "Variabili d'ambiente"

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

Per il nome metti "cygwin" senza virgolette. Per il valore, immettere nella directory principale di Cygwin. (Il mio era C: \ cygwin)

Premi OK e chiudi tutto per tornare al desktop.

Apri un terminale Cygwin (cygwin.bat)

Modifica il file / etc / passwd e cambia la riga

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

Per questo (i tuoi numeri e il nome della macchina saranno diversi, assicurati di cambiare i numeri evidenziati su 0!)

root : non utilizzato: 0: 0 : U- MACCHINA \ root , 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 credo 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'affare.

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ò, esegui il nuovo "su.bat" manualmente facendo doppio clic su di esso in Explorer. Inserisci la tua password e vai avanti e chiudi la finestra.

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


1

Non essendo soddisfatto della soluzione disponibile, ho adottato lo script di nu774 per aggiungere sicurezza e semplificare l'installazione e l'uso. Il progetto è disponibile su Github

Per usarlo, basta scaricarlo cygwin-sudo.pyed eseguirlo tramite python3 cygwin-sudo.py **yourcommand**.

Puoi impostare un alias per comodità:

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

0

Usa questo 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 pulsante evidenziato.

Questo si basa sullo strumento Chere e la risposta purtroppo non funzionante (per me) da link_boy. Funziona bene per me usando Windows 8,

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

Non riesco a far funzionare la versione "in background" (clic destro in una directory aperta). 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\""

0

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

Quanto segue è valido per Windows 7+ (forse anche per le versioni precedenti, ma non ho controllato)

Di solito avvio la shell cygwin da un collegamento cygwin nel pulsante di avvio (o desktop). Quindi, ho modificato le proprietà del collegamento cygwin nelle schede

/ Compatibilità / Livello di privilegio /

e spuntato la casella,

"Esegui questo programma come amministratore"

Ciò consente alla shell cygwin di aprirsi con i privilegi di amministratore e anche i relativi subshells.


L'unico problema minore è che non puoi sapere se è aperto come amministratore.
Edwin Pratt,

0

Ho incontrato questa discussione cercando alcuni dettagli sudosull'implementazione in diversi sistemi operativi. Leggendolo ho scoperto che la soluzione di @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) è utile ma può essere leggermente migliorata. Ho evitato di creare il file temporaneo e implementato per eseguire tutto dal singolo script.

Inoltre ho studiato il passaggio successivo del miglioramento dell'output all'interno della singola finestra / console. Sfortunatamente, senza successo. Ho provato a usare le pipe con nome per catturare STDOUT / STDERR e stampare nella finestra principale. Ma il processo figlio non ha scritto su named pipe. Tuttavia, la scrittura su un file normale funziona bene.

Ho lasciato cadere tutti i tentativi di trovare la causa principale e ho lasciato la soluzione attuale così com'è. Spero che anche il mio post possa essere utile.

miglioramenti:

  • nessun file temporaneo
  • nessuna analisi e ricostruzione delle opzioni della riga di comando
  • attendere il comando elevato
  • utilizzare minttyo bash, se il primo non è stato trovato
  • restituisce il codice di uscita del comando
    #! / Bin / bash

    # Essendo amministratori, invoca direttamente il comando
    id -G | grep -qw 544 && {
        "$ @"
        uscita $?
    }

    # La variabile CYG_SUDO viene utilizzata per controllare l'invocazione del comando
    [-z "$ CYG_SUDO"] && {
        mintty = "$ (che mintty 2> / dev / null)"
        export CYG_SUDO = "$$"
        cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
        uscita $?
    }

    # Ora siamo in grado di:
    # - avvia il comando
    # - visualizza il messaggio
    # - restituisce il codice di uscita
    "$ @"
    RETVAL = $?

    echo "$ 0: premere per chiudere la finestra ..."
    leggere

    uscire da $ RETVAL


Come cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"non rompersi se ci sono spazi in un argomento? Lo ha sempre fatto quando passavo attraverso cygstart / runas.
Brian White

0

Basato sulla risposta di @ mat-khor, ho preso il syswin su.exe, l'ho salvato come manufacture-syswin-su.exee ho scritto questo script wrapper. Gestisce il reindirizzamento dello stdout e dello stderr del comando, quindi può essere utilizzato in una pipe, ecc. Inoltre, lo script esce con lo stato del comando dato.

limitazioni:

  • Le opzioni di syswin-su sono attualmente codificate per utilizzare l'utente corrente. La preparazione env USERNAME=...all'invocazione dello script lo sovrascrive. Se fossero necessarie altre opzioni, lo script dovrebbe distinguere tra syswin-su e argomenti di comando, ad esempio la divisione iniziale --.
  • Se il prompt UAC viene annullato o rifiutato, lo script si blocca.

.

#!/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")

-1

Non posso 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 abbastanza vicino.

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

Per ovviare alla mancanza di un utente "root":

  • Crea un utente sul computer locale LOCAL chiamato 'root', rendilo un membro del gruppo 'Administrators'
  • Contrassegna bin / bash.exe come 'Esegui come amministratore' per tutti gli utenti (ovviamente dovrai attivarlo / disattivarlo come e quando ti serve)
  • Tieni premuto il tasto Maiusc sinistro in Windows Explorer mentre fai clic con il tasto destro sul file Cygwin.bat
  • Seleziona "Esegui come un altro utente"
  • Immettere. \ Root come nome utente e quindi la password.

Questo ti esegue quindi come utente chiamato 'root' in cygwin, che potrebbe essere sufficiente accoppiato con 'Esegui come amministratore' sul file bash.exe.

Tuttavia hai ancora bisogno di un sudo.

Ho falsificato questo (e qualcun altro con più conoscenza di Linux può probabilmente falsarlo meglio) creando un file chiamato 'sudo' in / bin e usando questa riga di comando per inviare invece il comando a su:

su -c "$*"

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

Sii interessato a sapere se funziona per le tue esigenze o meno.


-1

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

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

Supponendo che l'installazione di Cygwin sia 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 ti aiuti. Fammi sapere se funziona per te. Grazie.

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


-5

Provare:

chmod -R ug+rwx <dir>

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


5
Come lo farà radicare, come chiede?
Nikana Reklawyks,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.