cómo ejecutar dos comandos en sudo?

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

  1. db2 connect to ttt (tenga en cuenta que necesitamos tener la conexión en vivo para el segundo comando
  2. db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'

Intenté esto:

 sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = 'mytestaccount@gmail.com' 

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

Tenga en cuenta que necesito ejecutar esto como usuario de php. El comando sudo -u db2inst1 id como usuario php me da el resultado correcto.

sudo puede ejecutar múltiples comandos a través de un shell, por ejemplo:

 $ sudo -s - 'whoami;  quién soy'
 raíz
 raíz

Tu comando sería algo así como:

 sudo -u db2inst1 -s - "db2 connect to ttt; db2 ACTUALIZACIÓN CONTACTO SET EMAIL_ADDRESS = 'mytestaccount@gmail.com'"

Si su versión de sudo no funciona con punto y coma con -s (al parecer, no si está comstackda con ciertas opciones), puede usar

 sudo - sh -c 'whoami;  quién soy'

en cambio, que básicamente hace lo mismo pero te hace nombrar el shell explícitamente.

Para su comando también puede consultar el siguiente ejemplo:

sudo sh -c "whoami; whoami"

Usualmente hago:

 sudo bash -c 'whoami; whoami' 

Si desea manejar las cotizaciones:

 sudo -s -- < 

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

Aquí hay un ejemplo de cómo podría actualizar el tamaño de 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;' 

Una alternativa que usa eval para evitar el uso de una subcapa:

 sudo -s eval 'whoami; whoami' 

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

Citar 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 deben dejar de ejecutarse si falla uno, use dobles ampersands en lugar de puntos y comas:

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

En la terminal, escribe:

 $ sudo bash 

Luego escribe todos los comandos que quieras. Escriba exit cuando haya terminado.

Si necesita automatizarlo, cree un archivo script.sh y ejecútelo:

 $ sudo ./script.sh 

Las respuestas anteriores no le permitirán citar dentro de las comillas. Esta solución:

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

Tanto el comando umask como el mkdir-command se ejecutan con el usuario ‘nobody’.