63 votes

Exécuter la commande ssh à distance avec une connexion complète Shell.

Je voudrais faire quelque chose comme ssh example.com 'ls' Cependant, selon la page de manuel de ssh :

Si commande est spécifié, il est exécuté sur l'hôte distant au lieu de une connexion Shell.

Donc ce qui se passe c'est que ls affiche sa sortie et ensuite ssh se termine.

Ce que je n'arrive pas à comprendre, c'est comment avoir le login complet Shell ouvert et ensuite faire exécuter la commande à l'intérieur de ce Shell. En laissant le Shell ouvert après l'exécution de la commande. Comme si j'avais fait manuellement ce qui suit :

  localhost$ ssh example.com 
example.com$ ls
             /folder1 
             /folder2 
example.com$ _

Des idées ?

52voto

RobertoP Points 629

Dites juste à bash d'exécuter ls et ensuite lui-même dans un login Shell

$ ssh user@host  -t 'bash -l -c "ls;bash"'

38voto

James Mertz Points 390
ssh user@host -t 'ls; exec $SHELL -l'

-t Forcer l'allocation de pseudo-terminaux. Ceci peut être utilisé pour exécuter des programmes arbitraires à l'écran sur une machine distante. Est légèrement plus approprié que bash -i .

exec Aucun nouveau processus n'est créé.

-l recherche ~/.bash_profile, ~/.bash_login et ~/.profile, dans cet ordre, et lit et exécute les commandes de .... Sans cela, vous ne pouvez probablement pas exécuter les scripts/commandes du répertoire ~/bin, parce que ce code provenant de ~/.profile ne sera pas exécuté sans -l drapeau :

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

1voto

Schala Walls Points 66

Dans votre commentaire sur la réponse de fons, vous dites que cela ne fonctionne pas en utilisant screen .

Pouvez-vous nous en dire plus ? En regardant le code source d'openssh, sshd exécute la commande en appelant

YOUR_DEFAULT_SHELL -c COMMAND

Ainsi, par exemple, si votre Shell par défaut est screen alors cela ne fonctionnera pas très bien car screen 's -c remplace simplement son .scrreenrc . Ainsi, il n'y a pas vraiment de moyen d'envoyer des commandes à l'écran si c'est votre Shell par défaut. Vous devrez en fait exécuter screen en tant que commande donnée à ssh, mais avec un Shell par défaut qui n'est pas un écran .

Si c'est ce que vous essayez de faire, je pense que les choses vont devenir vraiment bizarres, puisque screen fermera également Windows avec les programmes non-interactifs, donc vous devrez faire une astuce similaire à celle de fons, mais un niveau plus profond. DONC, avec, par exemple, /bin/bash (et non l'écran) comme votre Shell par défaut. Quelque chose comme :

ssh user@host -t 'screen bash -l -c "ls;bash"'

Ce qui devrait - prenez une grande respiration - se connecter à l'hôte, exécuter bash -c avec une commande de screen, ce qui créera une nouvelle fenêtre. Si cette fenêtre ouvrait simplement ls, elle se terminerait, et screen se terminerait, donc nous utilisons l'astuce de fons à l'intérieur de la nouvelle fenêtre d'écran .

Je pense que ça va marcher, si c'est bien ce que vous vouliez faire ;)

1voto

J'utilise Windows et peut-être qu'à cause de cela, les -t Le drapeau ne fonctionne pas pour moi.

Pour exécuter le ssh avec journalisation, j'appelle d'abord les fichiers /etc/profile y ~/.profile .

Au total, ma commande a la forme suivante :

ssh user@169.254.220.61 'source /etc/profile; source ~/.profile; my bash code'

1voto

KamilCuk Points 191

Parce que j'ai souvent du mal à échapper correctement à ma commande, saisissez cette fonction :

sshlogin() { ssh -tt "$1" "$(printf "%q " bash -lc '"$@"' -- "${@:2}")"; };

avec elle, non seulement le login Shell est exécuté, mais aussi les espaces et la citation sont préservés :

$ sshlogin server echo "a    space    b"
a    space    b

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X