J'automatise un processus de déploiement et je veux pouvoir simplement appeler un fichier .sh sur ma machine, le faire faire ma génération et télécharger le .zip sur le serveur, puis faire un tas de choses sur le serveur. L'une des choses que je dois faire exige que je sois root. Donc, ce que je veux faire, c'est ceci:
ssh user@172.1.1.101 <<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?
Réponses:
Avez-vous plutôt envisagé un sudo sans mot de passe?
la source
Au lieu de su, utilisez sudo avec l'ensemble NOPASSWD dans sudoers pour les commandes appropriées. Vous voudrez rendre le jeu de commandes autorisé aussi limité que possible. Le faire appeler exécuter un script pour les commandes root peut être le moyen le plus propre et de loin le plus facile à sécuriser si vous n'êtes pas familier avec la syntaxe des fichiers sudoer. Pour les commandes / scripts qui nécessitent le chargement de l'environnement complet,
sudo su - -c command
fonctionne bien que peut être excessif.la source
Qu'est - ce que vous décrivez pourrait être possible avec attendre .
la source
Vous pouvez passer une commande en tant qu'argument à SSH pour simplement exécuter cette commande sur le serveur, puis quitter:
Cela fonctionne également pour une liste de plusieurs commandes:
Ou bien:
Comme d'autres utilisateurs l'ont souligné avant moi, l'exécution
su
sur le serveur lancera un nouveau shell au lieu d'exécuter les commandes suivantes dans le script en tant que root. Ce que vous devez faire, c'est utiliser soitsudo
ousu -c
, et forcer l'allocation TTY à SSH avec le-t
commutateur (requis si vous devez entrer le mot de passe root):Pour résumer, une façon d'accomplir ce que vous voulez faire serait:
Comme
sudo
vous vous souvenez généralement de votre niveau d'autorisation pendant quelques minutes avant de demander à nouveau le mot de passe root, le simple ajoutsudo
de toutes les commandes que vous devez exécuter en tant que root est probablement le moyen le plus simple d'exécuter des commandes en tant que root sur le serveur. L'ajout d'uneNOPASSWD
règle pour votre utilisateur/etc/sudoers
rendrait le processus encore plus fluide.J'espère que ça aide :-)
la source
NOPASSWD
règle, consultez les exemples au bas deman sudoers
. N'oubliez pas non plus d'utiliservisudo
lors de l'édition de votresudoers
fichier pour éviter les cassures!su -c
place desudo
, vous devez exécuter SSH avec l'-t
indicateur - vous serez invité à entrer le mot de passe root sur le serveur lorsque la commande sera exécutée. Fournir un mot de passe directement ensu
tant qu'argument de ligne de commande n'est ni pris en charge (pour autant que je sache), ni recommandé - car un simpleps -ef | grep su
révèle tous les arguments passés àsu
, y compris tout mot de passe fourni depuis la ligne de commande ...su -c
sur SSH:ssh -t user@host 'su -lc "
<br />echo this is a test
<br />echo this is another test
<br />"
<br />'
<br />
précède par des sauts de ligne dans votre script. Hors sujet: pouvez-vous ajouter des nouvelles lignes aux commentaires ServerFault? Ce serait très utile lors de la publication d'extraits de code ...Non. Même si vous obtenez le mot de passe
su
, vous devez toujours faire face au fait qu'ilsu
ouvrira un nouveau shell, ce qui signifie que vos autres commandes ne lui seront pas transmises. Vous devrez écrire un script pour les opérations root avec un exécutable d'assistance qui peut l'invoquer avec les privilèges appropriés.la source
Écrivez un script attendu. Je sais que vous avez déjà trouvé une réponse à cela, mais cela pourrait être utile si vous devez vous connecter à un groupe de serveurs qui nécessitent une saisie de mot de passe interactive.
C'est un langage basé sur TCL, donc il pourrait être un peu bizarre par rapport aux anciens scripts shell. Mais il gère l'automatisation de la saisie de texte et, vous l'aurez deviné, "attend" certains bits de sortie avant d'entrer dans toute sorte d'entrée de mot de passe automatisée ou d'escalade de privilèges.
Voici un bon lien comme guide: http://bash.cyberciti.biz/security/expect-ssh-login-script/
Juste au cas où le site tombe en panne:
la source
Je sais que c'est un peu tard mais j'utiliserais personnellement Net :: SSH :: Expect, disponible auprès du CPAN.
http://search.cpan.org/~bnegrao/Net-SSH-Expect-1.09/lib/Net/SSH/Expect.pod
la source
Vous pouvez utiliser 'ssh example.com su -lc "$ cmd"'.
Lorsque la commande contient des options, vous devez les citer, sinon "su" pourrait les manger ("su: option non valide - 'A').
la source