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
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
Vous devez vous connecter pour publier un commentaire.
Au lieu de se connecter via ssh, puis immédiatement à la modification des utilisateurs, pouvez-vous ne pas utiliser quelque chose comme
ssh -t webservice_username@remotehost1
de se connecter avec le nom d'utilisateur souhaité pour commencer? Pour éviter d'avoir àsudo
tout à fait.Si ce n'est pas une possibilité, essayez habillage de toutes les commandes que vous souhaitez exécuter dans un script shell, et de le stocker sur l'ordinateur distant. Si vous pouvez obtenir votre tâche de travail à partir d'un script, puis votre
ssh
appel devient beaucoup plus simple et qui devrait rencontrer moins de problèmes:Pour mettre à jour facilement ce script, vous pouvez écrire un petit script pour votre machine locale qui télécharge la version la plus récente via
scp
et utilise ensuitessh
pour l'appeler.OriginalL'auteur bta
Notez que lorsque vous exécutez:
Votre session ssh fonctionne
sudo -u webservice_username -i
l'attend à la sortie et exécute ensuite le reste des commandes; il ne les exécute passudo
et puis exécutez les commandes suivantes. Cela a à voir avec le contexte dans lequel vous exécutez la série de commandes. Toutes les commandes sont exécutées dans la coquille demyname@remotehost1
et tous lessudo -u webservice_username - i
est commence un shell pour webservice_username et n'a pas fait exécuter toutes les commandes.Vraiment la meilleure solution est ici comme bta dit; écrire un script, puis rsync/scp à la destination, puis l'exécuter à l'aide de
sudo
.Pas donné ce que vous essayez d'accomplir; l'exécution de plusieurs commandes en tant qu'utilisateur spécifique dans ce cas, il vaut mieux faire avec un script. J'ai vérifié les docs pour sudo, et ne pouvait pas trouver quelque chose qui pourrait l'aider.
OriginalL'auteur Nik
commande exporter tout simplement pas travailler avec ssh comme cela, ce que vous voulez faire est à distance de modifier ~/.bashrc et il sera source de lui-même à chaque fois u faire une connexion ssh.
OriginalL'auteur tomriddle_1234