2011-07-23 7 views
14

Necesito usar ejecutar un comando dentro de un script en una fase de compilación ejecutar script en Xcode 4 usando sudo. Sin embargo, el compilador se queja:¿Cómo usar sudo dentro de una fase de compilación Ejecutar script en Xcode 4?

sudo: sin TTY presente y hay un programa especificado askpass

Alguien tiene una solución inteligente para este problema?

+0

Te recomiendo que especifiques para qué estás utilizando el acceso de sudo. Eso puede abrir alternativas más amplias. –

+0

Copie un archivo de una ubicación a otra y debe hacerse con acceso de root. – ericg

+0

Tengo el mismo problema y he configurado ALL = NOPASSWD para esa secuencia de comandos. De hecho, si lo ejecuto desde la consola, no solicita la contraseña – hithwen

Respuesta

11

Una solución es colocar la contraseña de sudo en un script de shell ejecutable como el siguiente:

#!/bin/bash 
echo thesudopassword 

Este script de shell que se podría llamar password.sh

A continuación, configurar el entorno SUDO_ASKPASS variable = contraseña .sh

Una vez que esto está configurado, la opción -A se puede pasar a sudo. Esta opción utiliza el programa ASKPASS para obtener la contraseña de sudo. El programa ASKPASS solo necesita escribir la contraseña para stdout.

Así, por ejemplo,

sudo -A ditto -V /tmp/testserver.dst/

Esto es obviamente una solución bastante inseguro, pero funciona.

+10

, ¡al menos que sea legible por usted! 'chmod 600 ' –

-1

También puede ejecutar XCode dándole el proyecto como parámetro de la terminal usando sudo así:

sudo /Developer/Applications/Xcode.app/Contents/MacOS/Xcode /path/to/your/project.xcodeproj 

Ésta es la solución más fácil de lo que podía pensar, pero puede haber algunos inconvenientes, ya que lo haría ejecutar XCode como root

+2

Ugh. Técnicamente eso funciona, pero recomiendo que no lo haga, especialmente teniendo en cuenta cuán defectuoso es Xcode 4 (según la frecuencia con la que se cuelga ... imagine los estragos que podría causar con privilegios de root). – Richard

+1

Esto depende de cualquier cambio futuro en el proyecto, ya que SIEMPRE tendrías que ejecutar Xcode como raíz a partir de ese momento. – mydogisbox

-4

No necesita escribir su contraseña de sudo en ningún lado. Sólo tiene que abrir una ventana de terminal y escriba

$ sudo echo "hello" 

Una vez que haya escrito su contraseña, que será bueno por un tiempo - no está seguro de cuánto tiempo - y la cáscara generada por Xcode heredará este permiso.

Si recibe el mensaje "no TTY presente" de nuevo más tarde, sólo tiene que repetir el procedimiento

+2

Funciona, pero no es útil en un entorno automatizado. – Jasarien

2

Otra solución a este problema es modificar el archivo sudoers y añadir su cuenta a ella y el estado que nunca se debe pedirá la contraseña de sudo Para lograr esto es bastante sencillo:

de ejecución:

sudo visudo 

En la sección de especificación de privilegios del usuario añadir una línea que se parece a

youraccountname ALL=(ALL) NOPASSWD: ALL 

Por supuesto, esto puede ser algo peligroso hacer , así que ten cuidado. Sugiero leer la página de man para sudoers y visudo antes de seguir esta ruta.

+1

Sería mejor utilizar 'youraccountname ALL = (ALL) NOPASSWD: SETENV:/ruta/a/script', que restringe la concesión sin contraseña a esa ruta específica, y luego usar' sudo -E/the/script' en Xcode para transferir los vars de entorno (por ejemplo, '$ BUILT_PRODUCTS_DIR', etc.) – jrodatus

6

dos ideas que no han sido sugeridas sin embargo, ambos de los cuales son probablemente mejor/más seguro que la respuesta aceptada actualmente:

La primera opción sería la de poner la parte de la secuencia de comandos que necesita ser ejecutado como root en un archivo de script (.sh o algo), y luego hacer que setuid como root: chmod go-w,+sx scriptfile, sudo chown root scriptfile. Esto significa que el script se ejecutará automáticamente como root, lo que le evitará la necesidad de autenticarse para ejecutarlo (solo para cambiarlo). Mientras su operación no esté sujeta a la entrada del usuario, esto debería ser bastante seguro. (Por supuesto, si usted hace un script que toma un argumento de entrada y lo elimina o lo dirige, o hace la mayor parte nada más con ella, que sería no estar a salvo.)

La segunda opción sería utilizar AppleScript (posiblemente a través de osascript). Applescript le permite do shell script "sudo command goes here" with administrator privileges, que aparecerá un cuadro de diálogo gráfico que le pedirá una contraseña.

La primera de estas opciones sería buena para un entorno automatizado, aunque podría no ser adecuada (por ejemplo) para ser registrada en un SCM o para ser enviada a otro usuario. La segunda opción funcionaría mejor con eso, pero requiere una entrada de contraseña cada vez, por lo que no funciona tan bien para una secuencia de comandos de compilación automatizada.

+1

Establecer el uid como root es una buena idea. No estoy tan seguro de que me guste la respuesta AppleScript. Sobre lo último que quiero es que me pidan una contraseña cada vez que necesito construir. – ericg

+0

@ericgorr Es cierto, aunque uno podría esperar que generalmente no necesitara root para sus compilaciones corrientes (ya que la mayoría de las pruebas deberían poder hacerse en su directorio de inicio), pero solo de vez en cuando para una prueba de que las cosas funcionan cuando se instalan en ubicaciones del sistema o similares. Por supuesto, no tengo idea de lo que estás haciendo aquí. – arcticmac

+0

En realidad, sí necesito root para cada compilación ... – ericg

Cuestiones relacionadas