Comment puis-je exécuter deux commandes Db2 à partir d'une ligne de commande? (Ils seront appelés à partir d'une commande PHP exec
.)
db2 connect to ttt
(notez que nous devons avoir la connexion en direct pour la deuxième commandedb2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
J'ai essayé ceci:
Sudo -su db2inst1 db2 connect to ttt; db2 UPDATE CONTACT SET EMAIL_ADDRESS = '[email protected]'
La première commande se termine correctement mais la seconde échoue avec le message d'erreur SQL1024N A database connection does not exist. SQLSTATE=08003
Notez que je dois l'exécuter en tant qu'utilisateur php. La commande Sudo -u db2inst1 id
en tant que php user me donne le bon résultat.
Sudo peut exécuter plusieurs commandes via un shell, par exemple:
$ Sudo -s - 'whoami; whoami ' racine racine
Votre commande serait quelque chose comme:
Sudo -u db2inst1 -s - "db2 se connecter à ttt; db2 MISE À JOUR DE CONTACT SET EMAIL_ADDRESS = 'mytestaccount @ gmail.com"
Si votre version de Sudo ne fonctionne pas avec des points-virgules avec -s (apparemment, elle ne fonctionne pas si elle est compilée avec certaines options), vous pouvez utiliser
Sudo - sh-c 'whoami; qui suis je'
ce qui fait essentiellement la même chose mais vous oblige à nommer explicitement le Shell.
Pour votre commande, vous pouvez également vous référer à l'exemple suivant:
Sudo sh -c "whoami; whoami"
Je fais habituellement:
Sudo bash -c 'whoami; whoami'
Si vous souhaitez gérer les devis:
Sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
Une alternative utilisant eval
, évitant ainsi l’utilisation d’un sous-shell:
Sudo -s eval 'whoami; whoami'
Remarque: Les autres réponses utilisant Sudo -s
échouent, car les guillemets sont transmis à bash et exécutés en tant que commande unique. Il est donc nécessaire de supprimer les guillemets avec eval. eval
est mieux expliqué si cette SO réponse
Citer dans les commandes est aussi plus facile:
$ Sudo -s eval 'whoami; whoami; echo "end;"'
root
root
end;
Et si les commandes doivent cesser de fonctionner en cas d'échec, utilisez doubles-esperluettes au lieu de points-virgules:
$ Sudo -s eval 'whoami && whoamit && echo "end;"'
root
/bin/bash: whoamit: command not found
L'option -s
n'a pas fonctionné pour moi, mais -i
l'a fait.
Voici un exemple de la façon dont je pourrais mettre à jour la taille du journal depuis mon 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;'
Sur un sujet légèrement lié, je voulais faire le même Sudo à commandes multiples via SSH mais rien de ce qui précède n’a fonctionné.
Par exemple sur Ubuntu,
$ ssh Host.name Sudo sh -c "whoami; whoami"
[Sudo] password for ubuntu:
root
ubuntu
L'astuce découverte ici consiste à mettre une double citation de la commande.
$ ssh Host.name Sudo sh -c '"whoami; whoami"'
[Sudo] password for ubuntu:
root
root
Autres options qui fonctionnent aussi:
ssh Host.name Sudo sh -c "\"whoami; whoami\""
ssh Host.name 'Sudo sh -c "whoami; whoami"'
En principe, les doubles guillemets sont nécessaires parce que je pense que le client Shell où SSH est exécuté supprime le jeu de citations le plus externe. Mélangez et faites correspondre les citations à vos besoins (par exemple, les variables doivent être transmises). Cependant YMMV avec les guillemets surtout si les commandes à distance sont complexes. Dans ce cas, un outil comme Ansible fera un meilleur choix.
Les réponses ci-dessus ne vous laisseront pas citer entre les citations. Cette solution va:
Sudo -su nobody umask 0000 \; mkdir -p "$targetdir"
La commande umask et la commande mkdir s'exécutent avec l'utilisateur 'personne'.
Sur le terminal, tapez:
$ Sudo bash
Puis écrivez autant de commandes que vous le souhaitez. Tapez exit
lorsque vous avez terminé.
Si vous devez l’automatiser, créez un fichier script.sh
et exécutez-le:
$ Sudo ./script.sh