2013-07-11 5 views
0

Je veux écrire un script que je peux utiliser pour grep pour un processus sur un serveur distant, sur chaque serveur il y a déjà un compte utilisateur qui peut ssh avec un mot de passe, donc l'idée est ce scriptScript de shell à distance

  • sudo pour compte utilisateur sans mot
  • ssh au serveur distant
  • commandes run (ps -ef | grep processname) affichage
  • la sortie sur le serveur local
  • fermer la connexion ssh
  • sortie sur compte utilisateur passwordless

à la minute où j'ai:

if [ $1 = -r ] 
then 
su - useraccount 
ssh $2 "ps -ef | grep process | grep -v grep" 
exit 
else 
ps -ef | grep process | grep -v grep 
fi 

L'idée ici est que vous pouvez exécuter le script local si vous n'avez pas le - option r afin de fonctionner localement vous avez

script.sh processname 

ou à distance

script.sh -r remotehost processname 

J'ai la grep -v grep là becasue il me agace de voir ma commande grep dans la liste,
Je pense juste qu'il semble un peu plus propre
Toutes les idées?

+0

Alors, quel est le problème? –

+0

'su' démarre son propre shell, utilisez' su-username -c "votre commande ssh" '. – Wrikken

+0

Merci oui cela a fonctionné, je peux obtenir le script à ssh sur le serveur distant, mais maintenant le problème est de passer les variables locales au serveur distant, donc si je lance 'script.sh -r remotehost processname' le nom du processus est $ 3 localement mais pas à distance –

Répondre

0

Au lieu de dire

ssh -t host command $argument ... 

disent

ARGUMENT="-abc" 
COMMAND="'command $ARGUMENT'" 

et offrent

sst -t host $COMMAND 

la machine distante va avoir aucune idée de ce $ARGUMENT est, alors assurez-vous d'interpoler cette chaîne sur la machine locale avant de l'envoyer. Notez que vous aurez besoin d'être compliqué avec des guillemets, comme je l'ai fait plus haut, parce que vous ne pouvez pas interpoler des variables à l'intérieur de simples graduations ('').

modifier:

Je me demande pourquoi vous insistez sur l'exécution des tuyaux sur la machine distante. Pouvez-vous simplement dire:

ssh -t host -- ps -ef | grep process_name | grep -v grep 

Cela me semble être la meilleure façon de le faire. Alors vous ne devez pas déranger avec l'interpolation variable et les ticks curieux.

modifier 2:

Pouvez-vous pas seulement utiliser sudo -s username ssh foo?

1

Si vous avez beaucoup de traitement et de piping à faire, je vous recommande d'écrire un script sur un hôte local, puis de l'invoquer sur un hôte distant avec ssh.

localhost cat localScript.sh $ #!/Usr/bin/ksh`

ps -ef | grep -i java | grep -v grep

localhost ssh [email protected] < localScript.sh $

Cela affichera la sortie attendue sur l'hôte local.

0

Vous ne devez pas passer à un utilisateur différent localement pour pouvoir vous connecter en tant que cet utilisateur sur un système distant.

ssh -l <username> remotemachine 

Alors:

ssh -l useraccount remote host ps -ef | grep process 

Est-ce le grep sur place, et vous éviter le problème avec grep apparaissant dans la sortie ainsi.