Normalement, si vous passez une commande à ssh comme ça
ssh [email protected] 'some-command.sh'
Vous obtenez une session non interactive et ssh se ferme dès que la commande (ou le script, ou autre) est exécutée. Comment puis-je obtenir une session interactive et exécuter une commande que j'ai spécifiée à partir de ma machine locale. Par exemple, j'aimerais pouvoir ouvrir l'écran et redémarrer une session d'écran spécifique:
ssh [email protected] 'screen -r 12345'
mais cela n'est pas autorisé, renvoyant l'erreur "Doit être connecté à un terminal". ce qui, je présume, signifie essentiellement "doit appeler cette commande à partir d'un shell interactif".
Comme autre exemple, j'utilise une tonne de machines au travail qui me demandent souvent d'utiliser un compte partagé pour avoir le droit de faire certaines choses (ouais je sais: mauvaise idée mais ne me blâmez pas, je n'ai pas mis en place des choses qui façon), et ils ont généralement ksh comme shell par défaut. Je souhaite me connecter, basculer vers bash (ou zsh) et rechercher le .bash_profile (ou .zshrc) de mon propre compte. Ce serait facile si je pouvais établir une session ssh interactive et passer une commande à la machine distante pour l'exécuter lors de la connexion.
J'ai une solution très louable (et non testée) à l'esprit que je publierai, mais j'espère que quelqu'un connaît une meilleure façon.
MISE À JOUR: pour ceux qui ne l'ont pas réalisé, je ne prévois pas de faire tout cela à la main, donc me dire d'ouvrir une session interactive et de le faire à la main ne résout rien.
2ème MISE À JOUR: Pour tenter une fois de plus de clarifier: j'essaie d'exécuter des commandes (arbitraires) sur le serveur (spécifié par programme sur le client) mais j'ai ensuite une session interactive ouverte qui est affectée par tout ce qui est fait par ces commandes programmatiques.
echo "command" | ssh user@remote_host
Réponses:
Vous pouvez essayer la commande suivante pour démarrer bash et source votre propre profil lorsque vous ssh:
la source
-t
commutateur résout également le problème du questionneurscreen
.ssh -t www.dev "echo 'hi there'"
, la connexion est immédiatement fermée après l'exécution de la commande.S'appuyant sur la réponse de dogbane, une solution complète ressemble à:
Ici, j'utilise
-t
pour forcer l'allocation d'un pseudo-terminal, qui est nécessaire pour un shell interactif. Ensuite, j'exécute deux commandes sur le serveur: d'abord la chose que je voulais faire avant d'ouvrir le shell interactif (dans mon cas, changer de répertoire dans un dossier spécifique), puis le shell interactif lui-même. bash voit qu'il a un pseudo-terminal et répond de manière interactive.Les guillemets simples garantissent que le tout est transmis au serveur distant en tant que commande à exécuter par votre shell par défaut.
Merci encore à Dogbane d'avoir fourni les indices nécessaires
-t
. J'avais l'habitude de résoudre ce problème avecexpect
, ce qui tue définitivement une souris avec un canon. (:la source
Essayez cette solution.
La connexion est interactive et votre commande est passée comme si vous l'aviez tapée sur la ligne de commande interactive. La session se termine comme si vous aviez tapé
la source
ssh
.-t
ou votre propre fichier bash. +1Utilisez ssh -X pour utiliser les cmds termIO.
Aussi - vous pouvez enchaîner vos cmds comme "ssh 'source ~ / .bashrc && cd && do'"
la source
pourquoi ne pas installer detach sur le système distant et utiliser:
la source
detach
,ls
ne garde pas la session ouverte et se déconnectera sans imprimer la sortie dels
mais elle continuera de fonctionner.la réponse de laggingreflex est proche ... Je la changerais comme suit:
Malheureusement, il est peu probable que vous aimiez la façon dont cela fonctionne, car "cat" met en mémoire tampon les lignes qu'il écrit sur stdout ... Si nous créons un script appelé "echo-cat" qui ressemble à ceci:
nous obtiendrons le même résultat sans mise en mémoire tampon:
Cela vous rapprochera probablement beaucoup plus de votre objectif ...
la source
C'est kludgey, et non testé, mais je pense que cela devrait fonctionner.
Créez un script nommé (par exemple) démarreur à distance qui prend un argument cité après un argument user @ host:
Ce script doit d'abord enregistrer la commande entre guillemets (sans guillemets) dans un fichier nommé (par exemple)
.onetime
sur la machine distante, puis exécuter une commande ssh normale, cette fois sans passer de commande à exécuter sur la machine distante. (Si vous exécutez ssh [email protected] à partir d'un script, cela peut fonctionner pour exécuter exec ssh [email protected].)Pour que cela fonctionne, la machine distante doit source à
.onetime
partir de son .bash_profile ou .zshrc ou autre. Après l'exécution.onetime
, il doit être supprimé.onetime
, afin que le fichier ne soit pas exécuté la prochaine fois que vous effectuez une connexion régulière.la source