2011-04-06 16 views
116

¿Hay alguna manera de cómo puedo ejecutar dos comandos Db2 desde una línea de comando? (Ellos serán llamados de un comando PHP exec.)cómo ejecutar dos comandos en sudo?

  1. db2 connect to ttt (tenga en cuenta que tenemos que tener la conexión en directo para el segundo comando
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'

yo probamos este:

sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]' 

El primer comando finaliza correctamente pero el segundo falla con el mensaje de error SQL1024N A database connection does not exist. SQLSTATE=08003

Tenga en cuenta que necesito ejecutar esto como usuario php. El comando sudo -u db2inst1 id como php usuario me da salida correcta.

+0

por favor deje un comentario por qué quiere cerrar esta pregunta. Gracias. – Radek

+1

La votación cerrada es para la migración a serverfault, ya que esta es una cuestión de administración de sistemas, no de programación. – bdonlan

Respuesta

120

sudo puede ejecutar varios comandos a través de una concha, por ejemplo:

 
$ sudo -s -- 'whoami; whoami' 
root 
root 

su comando sería algo así como:

 
sudo -u db2inst1 -s -- "db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'" 

Si su versión sudo no funciona con punto y coma con -s (al parecer, no si compilado con ciertas opciones), puede utilizar

 
sudo -- sh -c 'whoami; whoami' 

en su lugar, que bas icalmente hace lo mismo pero te hace nombrar el shell explícitamente.

+2

me da '/ bin/bash: db2: comando no encontrado /bin/bash: db2: comando no encontrado' si se ejecuta como usuario de php – Radek

+0

' sudo -u db2inst1 -s - 'whoami; whoami'' se ejecuta bien desde la cuenta php – Radek

+1

agrega el/full/path/to/db2; tal vez el shell raíz no lo tiene en $ PATH – ggiroux

146

Por su comando también se puede hacer referencia al siguiente ejemplo:

sudo sh -c "whoami; whoami"

+11

He encontrado que esta es una alternativa más confiable. – Nick

+8

Una más: "-s-" no funcionó para mí, pero este método sí. –

0

Las respuestas anteriores no permitirán que usted cita dentro de las comillas. Esta solución:

sudo -su nobody umask 0000 \; mkdir -p "$targetdir" 

Tanto el comando umask y se ejecuta el comando mkdir-en con el usuario 'nadie'.

+0

Puede usar comillas simples y dobles y escapar de ellas. – Radek

+0

Ok, entonces, ¿cómo es que importa ahora a qué se ajustó umask en este comando? ¿No tiene ningún efecto? – Michael

29

Si desea manejar cotizaciones:

sudo -s -- <<EOF 
id 
pwd 
echo "Done." 
EOF 
+0

¿Cómo se puede hacer eso desde php? – Radek

+0

Muy claro y legible. ¡Gracias! – Benny

+1

Esta es la respuesta más limpia aquí, gracias. Quizás agregue una nota "No puede ejecutar múltiples comandos desde' sudo' - siempre tiene que engañarlo para ejecutar un shell que puede aceptar múltiples comandos para ejecutarse como parámetros " – trs

3

La opción -s no funcionó para mí, -i lo hicieron.

Aquí es un ejemplo de cómo podría actualizar el tamaño del registro de mi bash:

sudo -u [user] -i -- sh -c 'db2 connect to [database name];db2 update db cfg for [database name] using logsecond 20;db2 update db cfg for [database name] using logprimary 20;' 
33

que suelo hacer:

sudo bash -c 'whoami; whoami' 
3

Una alternativa usando eval evitando así el uso de un subnivel:

sudo -s eval 'whoami; whoami' 

Nota: Las otras respuestas usando sudo -s fallan porque las comillas se pasan a bash y se ejecutan como un único comando, por lo que es necesario quitar las comillas con eval.eval se explica mejor es esta SO answer

Citando dentro de los comandos es más fácil también:

$ sudo -s eval 'whoami; whoami; echo "end;"' 
root 
root 
end; 

Y si los comandos tienen que dejar de correr si uno falla utilizar dobles símbolos de unión en lugar de punto y coma:

$ sudo -s eval 'whoami && whoamit && echo "end;"' 
root 
/bin/bash: whoamit: command not found 
1

En el terminal, escriba:

$ sudo bash 

Luego escriba tantos comandos como desee. Escriba exit cuando haya terminado.

Si necesita automatizarlo, crear un archivo script.sh y ejecutarlo:

$ sudo ./script.sh 
Cuestiones relacionadas