2009-10-04 13 views
20

Estoy diseñando un pequeño software en Java. No conozco el término/definición de lo que estoy haciendo, pero estoy pidiendo comandos desde Java a la terminal. Algo como esto:¿Hay algún "sudo" gráfico para Mac OS X?

Process process = Runtime.getRuntime().exec("command"); 

he hecho esto antes en Linux, y utiliza gksudo para los comandos que requieren la contraseña de root.

¿Hay gksudo en OS X? ¿Alguna ventana emergente gráfica que solicite la contraseña de root?

+1

cuando abro MAMP, me preguntan para dar mi contraseña O cuando instalo un paquete ... ¿a qué se llama ese cuadro emergente en os x? – Johannes

Respuesta

-3

Si está utilizando un terminal, simplemente use "sudo", que solicitará la contraseña del usuario en el terminal mismo (a diferencia del gksudo que creo que usa una ventana emergente gráfica). Sudo funciona en Linux y OS X.

+1

se supone que es un gráfico ... =) – Johannes

+1

¿Qué payaso votó a favor de esto? Cuando respondí la pregunta, la palabra "gráfica" no apareció en ninguna parte de la pregunta. Y sigue siendo una respuesta válida, incluso si no es * exactamente * lo que pidió el cartel original –

+0

La pregunta claramente solicita una versión gráfica de sudo (palabra número 4). –

2

gksudo es la versión GTK + de sudo.

Se puede utilizar para ello this clone especialmente para OS X.

9

Esto también parece prometedor: cocoasudo

enter image description here

Utiliza el OSX servicios de autorización nativo API:

Para En las aplicaciones Mac OS X Cocoa, existe una capacidad de sudo análoga proporcionada a través de la API de los Servicios de Autorización. El uso de la API le permite solicitar al usuario su nombre de usuario y contraseña solicitando la posibilidad de escalar privilegios.

...

Para ese caso, he escrito una pequeña utilidad que yo he llamado cocoasudo. Usa cocoasudo de la misma manera que usarías sudo. Sin embargo, en lugar de que se solicite a los usuarios su contraseña en una ventana de Terminal, obtendrán un mensaje de diálogo a través de la API de Servicios de Autorización.

+0

De alguna manera, esto no funciona para mí: probé '.cocoasudo systemsetup' y obtuve el mensaje gráfico, pero después de ingresar mi contraseña, 'systemsetup' aún creo que no estoy' sudo'ing, ya que se queja: 'Necesitas acceso de administrador para ejecutar esta herramienta ... salir!' –

18

Puede más mineral de menos logran escribir su propio con AppleScript:

#!/bin/sh 
osascript -e "do shell script \"$*\" with administrator privileges" 

cocoasudo se ve estéticamente más agradable, pero esto ya se ha desplegado.

+2

¿Alguna manera de recordar la contraseña ingresada entre llamadas? Necesito hacer varias llamadas a dicha secuencia de comandos en sucesión, y no deseo que el usuario ingrese su contraseña varias veces. –

+0

Esto ya no funciona. Verifique mi respuesta para ver si hay actualizaciones o más opciones. ¡Siéntete libre de actualizar el tuyo, @ZJR! ; P – cregox

4

Encontré que el cocoasudo no funciona si está ejecutando un script de shell que llama a otros comandos. Tendría que usar cocoasudo en todos los subcomandos, que también mostraría un aviso para cada llamada.

La solución osascript parece funcionar mejor, pero tuve que modificarla para que funcione con comandos que implican rutas que contienen espacios.

#!/bin/sh 
export bar="" 
for i in "[email protected]"; do export bar="$bar '${i}'";done 
osascript -e "do shell script \"$bar\" with administrator privileges" 
+1

Impresionante. El único inconveniente es que el cuadro de diálogo dice "osascript quiere hacer cambios", lo que puede confundir al usuario ya que es posible que no sepa qué es osascript. – gregschlom

3

hacer la siguiente manera, en este ejemplo voy a crear una carpeta/var/lock y establecer sus permisos a 777:

String[] command = { 
     "osascript", 
     "-e", 
     "do shell script \"mkdir -p /var/lock && chmod 777 /var/lock\" with administrator privileges" }; 
Runtime runtime = Runtime.getRuntime(); 
try { 
    Process process = runtime.exec(command); 
    BufferedReader bufferedReader = new BufferedReader(
       new InputStreamReader(process.getInputStream())); 
    String line; 
    while ((line = bufferedReader.readLine()) != null) 
      System.out.println(line); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

en Linux tal vez usted puede hacer esto con sudo, pero no pruebo después de ir a la prueba y publicar aquí los resultados.

+0

Esto es exactamente lo que estoy buscando, solo pasé horas en este problema ... Gracias hombre. – antonio081014

+0

Gracias por su solución, ¿es posible reemplazar el "osascript" del mensaje "osascript quiere hacer cambios"? – Arash

+0

¿Existe alguna manera de crear una sesión para esas credenciales raíz para que no solicite un nombre de usuario y contraseña cada vez? – Arash

0

Parece que hay mucha información incorrecta en estas respuestas. Para salvar a otras personas, publico mis propios hallazgos:

En primer lugar, al igual que el cartel de la pregunta, también tengo la situación de que necesito elevar los permisos desde una aplicación Java.

He dividido esto en dos scripts. El primer script se ejecuta desde Java con algún parámetro de línea de comando. La segunda secuencia de comandos realiza todos los pasos que necesitan privilegios de raíz. La idea es, por supuesto, utilizar cocoasudo en el primer script para realizar el segundo script con privilegios de root.

He confirmado a través de un registro extenso en archivos separados que los scripts realmente hacen lo que pretendía. Y funcionan bien cuando se inician manualmente (con privilegios de usuario normales, por supuesto) desde la línea de comandos.

Cuando se inicia desde la aplicación Java, obtengo el mensaje de cocoasudo, pero no pasa nada. Ni siquiera aparece la primera salida de registro del segundo script.

Cuando cambio la primera secuencia de comandos para usar osascript, de nuevo con la confirmación de que todo está correcto en cuanto a la secuencia de comandos, ni siquiera aparece una solicitud cuando se ejecuta desde Java.

Esto es todo en OS X Mountain Lion. Como si Apple creara algunas protecciones seguras que impidan que los scripts se ejecuten con privilegios de root desde Java.

Dado que el propio cocoasudo se ejecuta realmente, me inclino a pensar que la solución es codificar algo similar a cocoasudo, pero realizando todas las demás acciones necesarias usando las llamadas Cocoa API. Esto también puede ser firmado por código.

1

Siguiendo ZJR's answer, he hecho esto en Automator, por lo que puede usarlo como un servicio o lo que sea:

on run {input, parameters} 
    do shell script "sudo open \"" & (POSIX path of input as string) & "\"" with administrator privileges 

    return input 
end run 

O, tal vez lo que piensa su respuesta es anticuado y todavía quieren un AppleScript, justo escribir esta sola línea en el Editor de secuencias de comandos:

do shell script "[[your command]]" with administrator privileges 

que luego make into an app y se puede utilizar como un servicio o lo que sea.