web-dev-qa-db-fra.com

Utilisation de Su Inside of A Shell Script

Je suis automatisé d'un processus de déploiement et je souhaite pouvoir simplement appeler un fichier .sh sur ma machine, faites-la faire ma construction et téléchargez le fichier .zip sur le serveur, puis faites un tas de trucs sur le serveur. Une des choses que je dois faire nécessite que je sois root. Alors, ce que je veux faire, c'est ceci:

ssh [email protected] <<END_SCRIPT
su - 
#password... somehow...
#stop jboss
service server_instance stop
#a bunch of stuff here
#all done!
exit
END_SCRIPT

Est-ce seulement possible?

12
cmcculloh

Avez-vous considéré à la place d'un mot de passe moins de sudo?

15
medina

Au lieu de SU, utilisez sudo avec le NOPASSWD fixé à Sudoers pour une ou des commandes appropriées. Vous voudrez rendre la commande autorisée définie aussi limitée que possible. Avoir Call Circuler Exécuter un script pour les commandes racine peut être le moyen le plus propre et de loin plus facile à sécuriser si vous n'êtes pas familier avec la syntaxe de fichier SUDOer. Pour les commandes/scripts qui nécessitent le chargement de l'environnement complet, Sudo su - -c command fonctionne bien que peut être trop exclu.

5
Jeremy M

Ce que vous décrivez peut être possible avec attendre .

Vous pouvez transmettre une commande comme argument à SSH pour simplement exécuter cette commande sur le serveur, puis quitter:

ssh user@Host "command to run"

Cela fonctionne également pour une liste de commandes multiples:

ssh user@Host "command1; command2; command3"

Ou bien:

ssh user@Host "
[.____] command1
[.____] command2
[.____] command3
[.____] "

Comme les autres utilisateurs l'ont souligné avant moi, l'exécution su sur le serveur lancera une nouvelle coquille au lieu d'exécuter des commandes ultérieures dans le script en tant que root. Ce que vous devez faire, c'est utiliser soit Sudo ou su -c, et forcer l'allocation TTY à SSH avec le -t Commutateur (obligatoire si vous devez entrer le mot de passe root):

ssh -t user@Host 'su - -c "command"'
[.____] ssh -t user@Host 'Sudo command'

Pour résumer, une façon d'accomplir ce que vous voulez faire, serait:

#!/bin/bash
[.____] ssh -t [email protected] "
[.____] Sudo some_command
[.____] Sudo service server_instance stop
[.____] Sudo some_other_command
[.____] "

Étant donné que Sudo se souvient généralement de votre niveau d'autorisation pendant quelques minutes avant de demander à nouveau le mot de passe root, il suffit de préparer simplement Sudo à toutes les commandes que vous devez exécuter en tant que root est probablement le moyen le plus simple d'exécuter des commandes. racine sur le serveur. Ajout d'une règle NOPASSWD pour votre utilisateur dans /etc/sudoers rendrait le processus encore plus fluide.

J'espère que ça aide :-)

3
jabirali

Non. Même si vous obtenez le mot de passe sur su, vous devez toujours faire face au fait que su ouvrira une nouvelle coquille, ce qui signifie que vos commandes supplémentaires ne seront pas transmises. Vous devrez écrire un script pour les opérations racines ainsi qu'un exécutable assistant pouvant l'invoquer avec les privilèges appropriés.

2

Je sais que c'est un peu tard mais j'utiliserais personnellement net :: Ssh :: Attendez-vous, disponible de CPAN.

http://search.cpan.org/~bnegrao/net-ssh-expect-1.09/lib/net/ssh/expect.pod

1
misconfig

Vous pouvez utiliser 'ssh exemple.com su -lc "$ cmd"'.

Lorsque la commande contient des options, vous devez le citer, sinon "SU" pourrait les manger ("SU: Option non valide - 'A').

ssh -AX -tt example.com 'su -lc "tmux new-session -A"'
0
blueyed