comment écrire un shell bash script ssh à la machine à distance et changer d'utilisateur et de l'exportation d'un env variable et de faire d'autres commandes

J'ai un webservice qui fonctionne sur de multiples distance différentes redhat machines. Chaque fois que je veux mettre à jour le service que je synchronise la nouvelle webservice code source écrit en perl à partir d'un contrôle de la version du dépôt(j'utilise perforce) et redémarrez le service de l'aide que les nouveaux synchronisés en bas du code perl. Je pense que c'est trop ennuyeux pour vous connecter à des ordinateurs distants, un par un, et de faire cette série de commandes pour redémarrer le service un par un manully. J'ai donc écrit un script bash update.sh comme ci-dessous dans l'ordre "faire un temps, un lieu, mise à jour toutes les machines". Je vais exécuter ce script shell dans ma machine locale. Mais il semble que cela ne fonctionne pas. Il ne s'exécutera que la première commande "sudo -u webservice_username -je" que je peux dire à partir de la ligne de commande dans ma machine locale. (Le code ci-dessous ne montre pas comment il va mettre à jour l'un de la distance d'un webservice. La fonction "exporter P4USER=monnom" est pour l'utilisation de perforce client)

#!/bin/sh
    ssh myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

Pourquoi je sais que la seule première commande est exécutée? Eh bien parce que après que j'ai entrée le mot de passe pour le ssh sur ma machine locale, il montre:

Your environment has been modified. Please check /tmp/webservice.env.

Et il est juste coincé là-bas. Je ne veux rien en retour.

Comme suggéré par un des auteurs, j'ai ajouté "-t" pour ssh

#!/bin/sh
        ssh -t myname@remotehost1 'sudo -u webservice_username -i ; export P4USER=myname; cd dir ; p4 sync ; cd bin ; ./prog --domain=config_file restart ; tail -f ../logs/service.log'

Ce serait laisser le local ligne de commande de retour. Mais il semble bizarre, il ne peut pas le cd pour que "dir", il est dit "cd:dir: No such file or directory" il dit aussi "p4: command not found". Donc il semble que le sudo -u commande s'exécute sans effet et la commande d'exportation n'a pas exécuté ou exécutée sans effet.
Détaillée fichier journal local est comme ci-dessous:

Your environment has been modified. Please check /tmp/dir/.env.
bash: line 0: cd: dir: No such file or directory
bash: p4: command not found
bash: line 0: cd: bin: No such file or directory
bash: ./prog: No such file or directory
tail: cannot open `../logs/service.log' for reading: No such file or directory
tail: no files remaining
Avez-vous des sudo mis en place pour pas vous demander un mot de passe?
vous êtes de droite. Si je le faire manuellement cette série de commandes en vous connectant à un ordinateur distant, et de faire la première commande "sudo -u webservice_username -je" Sans demander de mot de passe. Aucune idée sur la manière de modifier le script shell?
Au lieu de sudo après ssh, ajouter un utilisateur myname à la sudoers avec les autorisations dont vous avez besoin pour exécuter les scripts sur le serveur.
La raison pour laquelle je vais sudo pour passer à un autre utilisateur n'est pas le problème de l'autorisation. seulement webservice_user a la "dir" répertoire. Chaque utilisateur sur cette machine a l'environnement de travail différent et a donc des différents dossiers du répertoire.
Avez-vous essayé ssh -t ou -T?

OriginalL'auteur Peiti Li | 2012-06-12