2010-08-08 18 views

Respuesta

52

Ejecutar una cáscara interior sudo: sudo bash -c 'whoami; whoami'

Se puede utilizar cualquier carácter excepto ' sí dentro de las comillas simples. Si realmente desea tener una comilla simple en ese comando, use '\'' (que técnicamente es: final literal de una sola cita, literal ' carácter, comience literal de una sola cita, pero efectivamente esta es una forma de insertar una sola comilla en un solo -clasificación literal citada).

+4

Sin embargo, corregir citas es una putada. –

+0

@MaximYegorushkin No, en realidad, si conoces el truco, mira mi edición. – Gilles

+0

El truco no se adapta bien a varios niveles de cotización. A diferencia de varios niveles de documentos aquí. –

-2

The Brackets significa que ejecuta el comando en un nuevo bash.It ejecute el comando con el intervalo de punto y coma.Solo use el siguiente código en su lugar.

(sudo whoami;sudo whoami) 

BYW: el espacio no es necesario cuando se usa '()'.

47

Puede pasar los comandos como entrada estándar en la fiesta de sudo'ed con un here document:

sudo bash <<"EOF" 
whoami 
id 
EOF 

De esta manera no hay necesidad de tocar el violín con citar correcta, especialmente si tiene varios niveles, por ejemplo:

sudo bash <<"EOF" 
whoami 
echo $USER ~ 
sudo -u apache bash <<"DOF" 
whoami 
echo $USER ~ 
DOF 
EOF 

Produce:

root 
root /root 
apache 
apache /usr/share/httpd 

(Tenga en cuenta que se puede' t indent el terminador interno - tiene que estar solo en su línea. Si desea utilizar la sangría en un documento de aquí, se puede utilizar en lugar de <<-<<, pero entonces debe sangrar con pestañas, no espacios.)

+0

+1 @ ¡La respuesta de Gillette es excelente, pero +1 por mencionar esta útil alternativa! – msanford

+0

Aquí los documentos (no hay ningún tubo involucrado) son realmente más convenientes para un comando largo, pero es necesario que se encargue de citar. Debe citar el marcador de extremo heredoc después de '<<', de lo contrario, el shell externo realizaría la expansión '$'. Y si anida, recuerde que el marcador final debe estar solo en su línea, no puede sangrarse (a menos que use el formulario '<< -' y sangría con pestañas). Y, por supuesto, el uso de un documento aquí para la entrada del guión no permite pasar datos como entrada al guión. – Gilles

+0

@Gilles Tienes razón, el marcador de apertura debe ser citado, mira mi respuesta actualizada. –

-3

sudo sólo se le pide su passwd passwd el primer tiempo.El responder es válida por unos 5 minutos por defecto. Puede cambiar este valor como this contó. Así que solo preocúpese por el indicador de passwd al comienzo de su script, entonces puede usar sudo en out. cambiando Valores predeterminados: el valor de user_name timestamp_timeout a -1 puede ser un agujero de seguridad en su sistema.

+1

-1 Esto es solo un desastre esperando que ocurra – siride

+0

Lo que quiero decir es que sudo solo solicita una contraseña en el primer momento. Sin avisos dentro de 5 minutos o más.¿Cuánto tiempo se ejecutará el script? ¿Salir con 5 minutos? Nunca debes cambiar el valor predeterminado a -1. Pocos cmds requieren permiso de root. Simplemente use sudo foo en cualquier lugar de su script en cada línea, o conectado por comas. – schemacs

+0

alternativamente puede configurar una lista definida de comandos y scripts para sudo sin contraseña. por supuesto, sus scripts deben escribirse con buenas prácticas de seguridad. debe evitar el uso de atributos externos si es posible, porque en bash hay demasiadas trampas. – Znik

3

por ejemplo intente esto, he comprobado:

sudo bash -c "cd /;ls;ls|grep o" 

En este ejemplo, el primer cambio dir a/root, directorio siguiente lista de raíz y, finalmente, para filtros de directorio raíz sólo directorios que tienen nombre con la letra 'O' .

Pero lo mejor es escribir el script que hace todo lo que necesita y dar el código de salida para todas las acciones complejas. Luego puede sudo script en su lugar grupo de comandos individuales como el ejemplo anterior.

Cuestiones relacionadas