Est-il possible d'envoyer un HEREDOC sur ssh à un hôte distant à partir d'un script exécuté localement?

Je veux essentiellement exécuter un script sur la machine A qui va SSH dans la machine B, exécuter les commands sur B, et returnner la sortie à la machine A.

Donc, je crée un script csh pour le faire, j'espère, si c'est possible.

Par exemple, cette solution de cette réponse fonctionne à partir de la command line:

ssh user@host << 'ENDSSH' ls -l ENDSSH 

Je peux vérifier qu'il exécute le ls sur la télécommand et pas localement.

Cependant, je veux pouvoir le faire dans les backticks, à l'intérieur de mon script csh fonctionnant localement. Serait-ce possible?

Je sais qu'il est possible de SSH dans et exécuter un script qui est sur la télécommand, mais ce n'est pas mon cas.

J'ai aussi entendu qu'il était possible d'envoyer un second script stocké localement sur le SSH (que je n'ai pas encore compris), mais j'aime l'idée d'avoir toutes les commands à l'intérieur du script original, d'où l'HEREDOC.

Je sais que c'est une question assez particulière, mais s'il y a un moyen, ce serait très cool de savoir comment.

Choses qui ne marchent pas

1)

 `ssh user@host<<'ENDSSH'` `echo "ls -l"` `echo "ENDSSH"` 

Cela donne l'erreur:

stty: standard input: Invalid argument. stty: standard input: Invalid argument. Warning: Command not found

Et puis il exécute ls -l localement, et puis il a essayé d'exécuter ENDSSH localement et bien sûr échoue avec la command introuvable.

2)

 `ssh user@host<<'ENDSSH'` echo "ls -l" echo "ENDSSH" 

Même problème que ci-dessus, sauf qu'il affiche seulement ls -l et ENDSSH comme text. Cela a du sens … depuis l'échec de la partie HEREDOC.

3) 3-5 ne sont pas exactement ce que j'ai demandé, mais toujours en essayant juste d'get même le cas de base de travail.

 `ssh user@host ls-l` 

Cela renvoie le total: Command not found. Ouais, je n'ai aucune idée d'où ça vient.

4)

 `cat ./test.csh | ssh user@host` 

Renvoie également la même chose que la tentative # 1

5)

 `cat ./test.csh | ssh -t user@host` 

Identique à # 1 et 4.

Je commence à épuiser d'autres solutions de stackoverflow / Ubuntu / serverfault … etc. La plupart des gens requestnt comment exécuter leur script sur une command line distante, et non comment exécuter des commands sur une distance d'un script exécuté localement.

modifier

Eh bien, je pense que j'ai une partie du problème compris. Avec le cas 3 ci-dessus par exemple, ce qui se passe est ls -l s'exécute localement, et la première partie de la sortie est ensuite envoyée sur SSH en tant que command.

Je l'ai remarqué car j'ai essayé ssh user@host $CMD , avec $CMD mis à "whoami" . La sortie était username: Command not found , puis j'ai réalisé que le total provient de la sortie ls. Toujours pas sûr de la façon de résoudre cela, cependant

    Si vous enveloppez la command entière que vous voulez exécuter dans les backticks, vous obtiendrez probablement la bonne solution. Il y a des problèmes concernant l'évaluation des variables et d'autres éléments interpolés, mais je vais les mettre de côté un moment.

    Cependant, je ne sais pas trop pourquoi vous voulez quelque chose dans les backticks. Votre question indique que vous voulez exécuter un script local à distance. Votre premier exemple le fait.

     ssh -q user@host << ENDSSH hostname ls -l id ENDSSH 

    Peut-être voulez-vous get la sortie de l'exécution distante dans une variable? Il ne dit pas ça n'importe où dans la Question, mais tu le ferais comme ça ( bash )

     RESULT=$(ssh user@host <<ENDSSH hostname id ENDSSH ) ... echo "$RESULT" 

    Ou, puisque vous avez mentionné csh , comme ça

     set result = `ssh -q user@host` <<ENDSSH hostname id ENDSSH ... echo "$result" 

    Notez que pour la variante csh toutes les lignes de sortie sont concaténées set.

    Je vois que vous avez signalé une erreur, stty: standard input: Invalid argument. Cela se produit probablement parce que vous avez une command stty dans votre script de connection sur le server distant. Cela devrait être enveloppé dans un test pour un shell interactif. En bash vous ferez quelque chose comme ceci:

     if test -n "$PS1" then # Interactive setup here stty ... fi 

    Pas certain de ce que vous essayez de faire, mais voici quelque chose qui a fonctionné pour moi.

    (Drat ayant du mal à garder l'éditeur de text stackexchange de traiter les tiques arrières en tant que caractères de mise en forme, en utilisant ceux vers l'avant où je veux dire les tiques arrières)

     R='ssh -t hostname <<EOF ls -l EOF' 

    Notez que je ne ferme pas le backtick avant EOF et utilise l'option -t pour créer un TTY virtuel même si stdio est redirigé.