¿Hay alguna forma de ejecutar dos comandos Db2 desde una línea de comandos? (Se llamarán desde un exec
comando PHP ).
db2 connect to ttt
(tenga en cuenta que necesitamos tener la conexión en vivo para el segundo comandodb2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
Intenté esto:
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 usuario php me da la salida correcta.
Respuestas:
sudo puede ejecutar múltiples comandos a través de un shell, por ejemplo:
Su comando sería algo como:
Si su versión de sudo no funciona con punto y coma con -s (aparentemente, no lo hace si se compila con ciertas opciones), puede usar
en cambio, que básicamente hace lo mismo pero te hace nombrar el shell explícitamente.
fuente
sudo -s -- '/usr/bin/whoami; /usr/bin/whoami' /bin/bash: /usr/bin/whoami; /usr/bin/whoami: No such file or directory
sudo -- sh -c 'whoami; whoami;
como solución alternativa cuando "sudo -s" no funciona. También actualicé la respuesta.--
indica el final de los parámetros parasudo
, por lo que todo lo demás es parte del comando; sin él, argumentos como-c
podrían ser interpretados como un argumento parasudo
. Esto funciona para la mayoría de los programas de línea de comandos (pero no para todos). Para otro (nosudo
) ejemplo, para eliminar un archivo llamado-f
no puedes simplemente ejecutarlorm -f
, ¿verdad? Pero puede ejecutarrm -- -f
para eliminar el archivo llamado-f
.Para su comando, también puede consultar el siguiente ejemplo:
sudo sh -c 'whoami; whoami'
fuente
Yo suelo hacer:
fuente
Si desea manejar cotizaciones:
fuente
sudo
- siempre necesita engañarlo para que ejecute un shell que puede aceptar múltiples comandos para ejecutar como parámetros"Una alternativa que usa
eval
para evitar el uso de una subshell:Nota: Las otras respuestas que usan
sudo -s
fallan porque las citas se pasan a bash y se ejecutan como un solo comando, por lo que deben eliminarse las comillas con eval.eval
se explica mejor es esta respuesta SOCitar dentro de los comandos también es más fácil:
Y si los comandos deben dejar de ejecutarse si uno falla, use dos signos en lugar de punto y coma:
fuente
La
-s
opción no funcionó para mí, lo-i
hizo.Aquí hay un ejemplo de cómo podría actualizar el tamaño del registro desde mi bash:
fuente
En la terminal, escriba:
Luego escribe tantos comandos como quieras. Escriba
exit
cuando haya terminado.Si necesita automatizarlo, cree un
script.sh
archivo y ejecútelo:fuente
En un tema ligeramente relacionado, quería hacer el mismo sudo de comandos múltiples a través de SSH, pero ninguno de los anteriores funcionó.
Por ejemplo en Ubuntu,
El truco descubierto aquí es comillas dobles del comando.
Otras opciones que también funcionan:
En principio, se necesitan comillas dobles porque creo que el shell del cliente donde se ejecuta SSH elimina el conjunto de comillas más externo. Mezcle y combine las citas con sus necesidades (por ejemplo, las variables deben pasarse). Sin embargo, YMMV con las comillas, especialmente si los comandos remotos son complejos. En ese caso, una herramienta como Ansible hará una mejor elección.
fuente
Si conoce la contraseña de root, puede intentar
fuente
sudo su -c "<command1> ; <command2>"
.Las respuestas anteriores no le permitirán citar dentro de las citas. Esta solución:
Tanto el comando umask como el comando mkdir se ejecutan con el usuario 'nobody'.
fuente