Usuario raíz / sudo equivalente en Cygwin?

156

Estoy tratando de ejecutar un script bash en Cygwin.

Me salen Must run as root, i.e. sudo ./scriptnameerrores

chmod 777 scriptname no hace nada para ayudar

He buscado formas de imitar sudo en Cygwin, para agregar un usuario root, ya que llamar a "su" genera el error su: user root does not exist, algo útil, y no he encontrado nada.

¿Alguien tiene alguna sugerencia?

Ken Bellows
fuente
hola KenB, ¿podrías darnos más detalles sobre el whatscript que estás intentando ejecutar? No hay equivalente a 'sudo' dentro de un shell cygwin: los derechos son los del usuario win que lanzó el shell cygwin, por lo que el enlace KyleWpppd es bueno para evitar errores como "comando desconocido de sudo". En su caso, parece que es un problema específico con el script que desea ejecutar.
Stefano
1
Honestamente, este es un problema pasado hace mucho tiempo, y en realidad no recuerdo cuál era el guión. Gracias por el interés, sin embargo.
Ken Bellows

Respuestas:

225

Respondí esta pregunta en SuperUser, pero solo después de que el OP desestimó la respuesta inútil que era en ese momento la única respuesta a la pregunta.

Aquí está la forma correcta de elevar los permisos en Cygwin, copiado de mi propia respuesta en SuperUser:

Encontré la respuesta en la lista de correo de Cygwin . Para ejecutar commandcon privilegios elevados en Cygwin, preceda el comando de cygstart --action=runasesta manera:

$ cygstart --action=runas command

Esto abrirá un cuadro de diálogo de Windows solicitando la contraseña de administrador y ejecutará el comando si se ingresa la contraseña correcta.

Esto es fácil de escribir, siempre y cuando ~/binesté en su camino. Cree un archivo ~/bin/sudocon el siguiente contenido:

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

Ahora haga el archivo ejecutable:

$ chmod +x ~/bin/sudo

Ahora puede ejecutar comandos con privilegios elevados reales :

$ sudo elevatedCommand

Es posible que deba agregar ~/bina su ruta. Puede ejecutar el siguiente comando en la CLI de Cygwin o agregarlo a ~/.bashrc:

$ PATH=$HOME/bin:$PATH

Probado en Windows 8 de 64 bits.

También podría, en lugar de los pasos anteriores, agregar un alias para este comando a ~/.bashrc:

# alias to simulate sudo
alias sudo='cygstart --action=runas'
dotancohen
fuente
12
Excelente respuesta Con algunos ajustes en su código bash (a continuación), pude ejecutar un comando elevado desde la línea de comandos. Aquí está el cambio que necesitaba para que su código funcionara: cat << 'EOF' > ~/bin/sudo\n #!/usr/bin/bash\n cygstart --action=runas "$@"\n EOF (No puedo entender cómo insertar nuevas líneas en este comentario, así que agregué '\ n's al código) El resto de la RUTA = ... en adelante está bien .
josmith42
3
¡Oh ya veo! Si no me equivoco, esa es su forma de escribir el archivo en el disco, en lugar de abrir un editor de texto. ¡Bien gracias! ¡No sabía cómo usar heredocs en Bash!
dotancohen
8
El problema con esto es que crea una ventana de terminal completamente nueva (generalmente conhost). La salida no está en línea en el terminal actual.
CMCDragonkai
1
La única forma de ejecutar cosas como lses envolverlo en un proceso de larga ejecución como mintty o bash o zsh también. Pero todo aparece en una terminal separada. Que en este punto, podría haberlo abierto a través de la GUI usando ConEMU.
CMCDragonkai
1
Sin las comillas, incluso los argumentos citados se dividen en espacios nuevamente, @katriel. Con las comillas, se "$@"expande a algo como "$1" "$2" "$3" ...y sin, se $@expande a $1 $2 $3....
Palec
51

Probablemente necesite ejecutar el shell cygwin como Administrador. Puede hacer clic con el botón derecho en el acceso directo y hacer clic en ejecutar como administrador o acceder a las propiedades del acceso directo y verificarlo en la sección de compatibilidad. Solo tenga cuidado ... los permisos de root pueden ser peligrosos.

Matt Williamson
fuente
1
En los tres años transcurridos desde que se hizo esta pregunta sin una buena respuesta en comparación con esta solución alternativa, he encontrado la forma correcta de aumentar los permisos para un solo comando en la ventana existente de Cygwin en la respuesta a continuación. Por lo tanto, funciona exactamente como sudoen Linux.
dotancohen
Me funcionó en Win10 64. Tuve que cambiar la propiedad de los archivos descargados de un servidor con rsync. chown --changes --verbose --recursive [USER] /cygdrive/c/[PATH TO FOLDER]/*. Sin ella no podría acceder a las carpetas y archivos sincronizados.
lowtechsun
25

Sobre la base de la respuesta de dotancohen, estoy usando un alias:

alias sudo="cygstart --action=runas"

Funciona como un encanto:

sudo chown User:Group <file>

Y si tiene instalado SysInternals, incluso puede iniciar un shell de comandos como usuario del sistema muy fácilmente.

sudo psexec -i -s -d cmd
thoni56
fuente
9

Encontré sudo-for-cygwin , tal vez esto funcionaría, es una aplicación cliente / servidor que usa un script python para generar un proceso hijo en windows (pty) y conecta tty del usuario y el proceso de E / S.

Requiere python en windows y módulos de Python greenlet y eventlet en Cygwin.

AdamTheWebMan
fuente
¡Estoy usando esto por un tiempo ahora y su evento maneja cosas interactivas como nano sin ningún problema!
MemphiZ
4

Parece que cygstart/runasno se maneja correctamente "$@"y, por lo tanto, los comandos que tienen argumentos que contienen espacios (y tal vez otros metacaracteres de shell, no los verifiqué) no funcionarán correctamente.

Decidí escribir un pequeño sudoscript que funcione escribiendo un script temporal que haga los parámetros correctamente.

#! /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
Brian White
fuente
1
la respuesta aceptada no funcionó para mí en Win7 pero esta respuesta funcionó de maravilla. Pude configurar exim-config con privs elevados y luego editar vim el archivo /etc/exim.conf después. Resbaloso.
nanker
2

Esta respuesta se basa en otra respuesta . En primer lugar, asegúrese de que su cuenta esté en el grupo Administradores.

A continuación, cree un archivo genérico "runas-admin.bat" con el siguiente contenido:

@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

Luego ejecute el archivo por lotes de esta manera:

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

Por ejemplo:

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

Solo asegúrese de encerrar cada comando por separado entre comillas dobles. Solo recibirá el aviso UAC una vez que use este método y este procedimiento se ha generalizado para que pueda usar cualquier tipo de comando.

usuario2618594
fuente
2

Una nueva propuesta para mejorar SUDO para CygWin de GitHub en este hilo , llamada TOUACExt :

  • Abre automáticamente sudoserver.py.
  • Cierra automáticamente sudoserver.py después del tiempo de espera (15 minutos por defecto).
  • Solicitar solicitud de elevación de UAC Sí / No estilo para usuarios administradores.
  • Solicitar usuario / contraseña de administrador para usuarios que no sean administradores.
  • Funciona de forma remota (SSH) con cuentas de administrador.
  • Crea un registro.

Todavía en Pre-Beta , pero parece estar funcionando.

Sopalajo de Arrierez
fuente
1

Llegué aquí a través de google, y realmente creo que he encontrado una manera de obtener un aviso raíz completamente funcional en cygwin.

Aquí están mis pasos.

Primero debe cambiar el nombre de la cuenta de administrador de Windows a "root". Haga esto abriendo start manu y escribiendo "gpedit.msc"

Edite la entrada en Política de computadora local> Configuración de computadora> Configuración de Windows> Configuración de seguridad> Políticas locales> Opciones de seguridad> Cuentas: Cambiar nombre de cuenta de administrador

Entonces tendrá que habilitar la cuenta si aún no está habilitada. Política del equipo local> Configuración del equipo> Configuración de Windows> Configuración de seguridad> Políticas locales> Opciones de seguridad> Cuentas: estado de la cuenta de administrador

Ahora cierre sesión e inicie sesión en la cuenta raíz.

Ahora configure una variable de entorno para cygwin. Para hacerlo de manera fácil: haga clic derecho en Mi PC> Propiedades

Haga clic en (en la barra lateral izquierda) "Configuración avanzada del sistema"

Cerca de la parte inferior, haga clic en el botón "Variables del entorno"

En "Variables del sistema", haga clic en el botón "Nuevo ..."

Para el nombre pon "cygwin" sin las comillas. Para el valor, ingrese en su directorio raíz cygwin. (El mío era C: \ cygwin)

Presione OK y cierre todo eso para volver al escritorio.

Abra una terminal Cygwin (cygwin.bat)

Edite el archivo / etc / passwd y cambie la línea.

Administrador : sin usar: 500: 503 : U- MACHINE \ Administrator , S-1-5-21-12345678-1234567890-1234567890- 500: / home / Administrador : / bin / bash

Para esto (sus números y el nombre de la máquina serán diferentes, ¡solo asegúrese de cambiar los números resaltados a 0!)

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

Ahora que todo está terminado, este siguiente bit hará que el comando "su" funcione. (No perfectamente, pero funcionará lo suficiente como para usar. No creo que los scripts funcionen correctamente, pero bueno, has llegado hasta aquí, tal vez puedas encontrar el camino. Y por favor comparte)

Ejecute este comando en cygwin para finalizar el trato.

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'

Salga de la cuenta raíz y vuelva a su cuenta de usuario normal de Windows.

Después de todo eso, ejecute el nuevo "su.bat" manualmente haciendo doble clic en el explorador. Ingrese su contraseña y continúe y cierre la ventana.

Ahora intente ejecutar el comando su desde cygwin y vea si todo salió bien.

Hydranix
fuente
1

Al no estar contento con la solución disponible, adopté el script de nu774 para agregar seguridad y facilitar la configuración y el uso. El proyecto está disponible en Github

Para usarlo, simplemente descárguelo cygwin-sudo.pyy ejecútelo a través de python3 cygwin-sudo.py **yourcommand**.

Puede configurar un alias por conveniencia:

alias sudo="python3 /path-to-cygwin-sudo/cygwin-sudo.py"
Crónica
fuente
0

Use esto para obtener una ventana de administración con bash o cmd ejecutándose, desde cualquier menú contextual de directorios. Simplemente haga clic derecho en el nombre de un directorio y seleccione la entrada o presione el botón resaltado.

Esto se basa en la herramienta chere y la respuesta desafortunadamente no funciona (para mí) de link_boy. Funciona bien para mí usando Windows 8,

Un efecto secundario es el color diferente en la ventana cmd admin. Para usar esto en bash, puede cambiar el archivo .bashrc del usuario administrador.

No podría obtener la versión de "fondo" (clic derecho en un directorio abierto) para ejecutar. Siéntase libre de agregarlo.

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\""
usuario2988447
fuente
0

Una manera muy simple de tener un shell cygwin y los subshells correspondientes para operar con privilegios de administrador es cambiar las propiedades del enlace que abre el shell inicial.

Lo siguiente es válido para Windows 7+ (quizás también para versiones anteriores, pero no lo he comprobado)

Normalmente inicio el shell cygwin desde un enlace cygwin en el botón de inicio (o escritorio). Luego, cambié las propiedades del enlace cygwin en las pestañas

/ Compatibilidad / Nivel de privilegio /

y marcó la casilla,

"Ejecute este programa como administrador"

Esto permite que el shell cygwin se abra con privilegios de administrador y las subcapas correspondientes también.

DMH
fuente
El único problema menor es que no puedes saber si está abierto como administrador.
Edwin Pratt
0

Conocí esta discusión buscando algunos detalles sobre la sudoimplementación en diferentes sistemas operativos. Al leerlo, descubrí que la solución de @ brian-white ( https://stackoverflow.com/a/42956057/3627676 ) es útil pero puede mejorarse ligeramente. Evité crear el archivo temporal y lo implementé para ejecutar todo mediante un solo script.

También investigué el siguiente paso de la mejora a la salida dentro de la única ventana / consola. Lamentablemente, sin ningún éxito. Traté de usar tuberías con nombre para capturar STDOUT / STDERR e imprimir en la ventana principal. Pero el proceso hijo no escribió en tuberías con nombre. Sin embargo, escribir en un archivo normal funciona bien.

Dejé cualquier intento de encontrar la causa raíz y dejé la solución actual tal como está. Espero que mi publicación también pueda ser útil.

Mejoras:

  • sin archivo temporal
  • sin analizar y reconstruir las opciones de línea de comando
  • espera el comando elevado
  • usar minttyo bash, si no se encuentra el primero
  • devolver el código de salida del comando
    #! / bin / bash

    # Siendo administradores, invoque el comando directamente
    id -G | grep -qw 544 && {
        PS
        salir $?
    }

    # La variable CYG_SUDO se usa para controlar la invocación del comando
    [-z "$ CYG_SUDO"] && {
        mintty = "$ (que mintty 2> / dev / null)"
        export CYG_SUDO = "$$"
        cygstart --wait --action = runas $ mintty / bin / bash "$ 0" "$ @"
        salir $?
    }

    # Ahora podemos:
    # - inicia el comando
    # - muestra el mensaje
    # - devuelve el código de salida
    PS
    RETVAL = $?

    echo "$ 0: Presione para cerrar la ventana ..."
    leer

    salir $ RETVAL

jsxt
fuente
¿Cómo no cygstart --wait --action=runas $mintty /bin/bash "$0" "$@"se rompe si hay espacios en una discusión? Siempre lo hizo para mí al pasar por cygstart / runas.
Brian White
0

Basado en la respuesta de @ mat-khor, tomé el syswin su.exe, lo guardé como manufacture-syswin-su.exey escribí este script de envoltura. Maneja la redirección de stdout y stderr del comando, por lo que puede usarse en una tubería, etc. Además, el script sale con el estado del comando dado.

Limitaciones:

  • Las opciones de syswin-su están actualmente codificadas para usar el usuario actual. Preceder env USERNAME=...a la invocación del script lo anula. Si se necesitaran otras opciones, el script tendría que distinguir entre syswin-su y los argumentos de comando, por ejemplo, dividir al principio --.
  • Si el aviso de UAC se cancela o rechaza, el script se bloquea.

.

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

No puedo probar esto por completo, no tengo un script adecuado para probarlo y no soy un experto en Linux, pero es posible que pueda hackear algo lo suficientemente cerca.

He intentado estos pasos, y 'parecen' funcionar, pero no sé si será suficiente para sus necesidades.

Para evitar la falta de un usuario 'root':

  • Cree un usuario en la máquina de Windows LOCAL llamada 'root', hágalo miembro del grupo 'Administradores'
  • Marque bin / bash.exe como 'Ejecutar como administrador' para todos los usuarios (obviamente, tendrá que activar / desactivar esto cuando lo necesite)
  • Mantenga presionado el botón de desplazamiento a la izquierda en Windows Explorer mientras hace clic derecho en el archivo Cygwin.bat
  • Seleccione 'Ejecutar como un usuario diferente'
  • Ingrese. \ Root como nombre de usuario y luego su contraseña.

Esto lo ejecuta como un usuario llamado 'root' en cygwin, que junto con 'Ejecutar como administrador' en el archivo bash.exe podría ser suficiente.

Sin embargo, todavía necesitas un sudo.

Fingí esto (y alguien más con más conocimientos de Linux probablemente pueda fingirlo mejor) creando un archivo llamado 'sudo' en / bin y usando esta línea de comando para enviar el comando a su en su lugar:

su -c "$*"

La línea de comando 'sudo vim' y otros parecen funcionar bien para mí, por lo que es posible que desee probarlo.

Estar interesado en saber si esto funciona para sus necesidades o no.

LarryDavid
fuente
-1

Lo que generalmente hago es tener un asistente de registro "Abrir aquí" para abrir un shell cygwin con privilegios administrativos bastante fácil desde cualquier lugar de mi computadora.

Tenga en cuenta que debe tener instalado el paquete "chere" de chere -i -mcygwin, primero use " " desde un shell elevado de cygwin.

Suponiendo que su instalación cygwin esté en C: \ cygwin ...

Aquí está el código de 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"

Espero que esto ayude. Avísame si te funciona. Gracias.

PD: puede tomar este código, copiarlo y pegarlo y guardarlo en un archivo name.reg para ejecutarlo ... o puede agregar manualmente los valores.

link_boy
fuente
-5

Tratar:

chmod -R ug+rwx <dir>

dónde <dir>está el directorio en el que desea cambiar los permisos.

Shanmukh
fuente
55
¿Cómo lo hará enraizar, como él pregunta?
Nikana Reklawyks