web-dev-qa-db-fra.com

comment exécuter deux commandes dans sudo?

Comment puis-je exécuter deux commandes Db2 à partir d'une ligne de commande? (Ils seront appelés à partir d'une commande PHP exec.)

  1. db2 connect to ttt (notez que nous devons avoir la connexion en direct pour la deuxième commande
  2. db2 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.

135
Radek

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.

141
wjl

Pour votre commande, vous pouvez également vous référer à l'exemple suivant:

Sudo sh -c "whoami; whoami"

160
Jason

Je fais habituellement:

Sudo bash -c 'whoami; whoami'
42
Samer Atiani

Si vous souhaitez gérer les devis:

Sudo -s -- <<EOF
id
pwd
echo "Done."
EOF
37
Nebojša

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
7
Cas

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;'
3
user2597485

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.

0
Eugene Chow

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'.

0
arberg

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
0
Moshe Simantov