Question Comment puis-je changer automatiquement de répertoire sur la connexion SSH?


J'essaie d'obtenir ssh pour passer automatiquement à un répertoire particulier lorsque je me connecte. J'ai essayé de résoudre ce problème en utilisant les directives suivantes: ~/.ssh/config:

Host example.net
LocalCommand "cd web"

mais chaque fois que je me connecte, je vois ce qui suit:

/bin/bash: cd web: No such file or directory

bien qu'il y ait vraiment un web dossier dans mon répertoire personnel. Même en utilisant un chemin absolu donne le même message. Pour être clair, si je tape cd web Une fois connecté, je me trouve dans le bon dossier.

Qu'est-ce que j'oublie ici?

MODIFIER:

Différentes combinaisons de guillemets / chemins absolus génèrent différents messages d'erreur:

LocalCommand "cd web"
/bin/bash: cd web: No such file or directory

LocalCommand cd web
/bin/bash: line 0: cd: web: No such file or directory

LocalCommand cd /home/gareth/web
/bin/bash: line 0: cd: /home/gareth/web: Input/output error

Cela me fait penser que les citations ne devraient pas être là et qu'il se produit une autre erreur.


77
2017-08-05 14:40


origine


LocalCommand est exécuté sur votre système local, pas sur le système distant. - Steve Kehlet
Vois ici superuser.com/a/124110/47962 - Nakilon


Réponses:


cd est un shell intégré. LocalCommand est exécuté en tant que:

/bin/sh -c <localcommand>

Ce que vous cherchez à faire ne peut pas vraiment être accompli via SSH; vous devez modifier le shell d’une certaine manière, par exemple: via bashrc / bash_profile.


18
2017-08-05 15:52



Oui, je voulais juste mentionner à même. Vous pouvez mettre le cd commande en ~/.bashrc sur le serveur distant à la place. - vdboor
C'est ennuyeux. Comme je l'ai mentionné dans un autre commentaire, le serveur a un certain nombre de noms d'hôte et je voulais avoir un comportement différent en fonction du type utilisé. Je suppose qu'il n'est pas possible de déterminer lequel a été utilisé à partir de .bashrc? - Gareth
C'est possible, mais probablement pas conseillé. Par exemple, remplacer ssh par un petit script shell ou un alias transmettant le nom d'hôte en tant que variable à exporter (par exemple, "ssh -t utilisateur @ hôte" export connhostname = hôte; bash --login '"). Mais vous commencez à entrer dans un territoire très étrange, en effet. Peut-être une meilleure question est la suivante: POURQUOI voulez-vous ce comportement? - BMDan
Pour être honnête, ce n'est pas vraiment un gros problème. Je suis dans la situation où la plupart du temps, je me connecte à ce serveur, je me dirige directement vers l'un des deux répertoires (en fonction de l'hôte utilisé) - Gareth


Cela marche:

ssh server -t "cd /my/remote/directory; bash --login"

Pour créer un répertoire s'il n'existe pas:

ssh server -t "mkdir -p newfolder; cd ~/newfolder; pwd; bash --login"

Si vous n'ajoutez pas bash à la fin du chemin, vous quittez après la cd la commande s'exécute. Et si vous n'ajoutez pas --login alors votre ~/.profile ne provient pas.


76
2017-12-21 21:29



Cela me termine au bon endroit, avec une invite bash. parfait! - Peter Ehrlich
Cela fonctionne aussi pour moi, mais si j'essaie de l'utiliser avec ssh jump-host, cela ne fonctionne pas. Je reçois un message de connexion fermée. - Riccardo


  1. Connectez-vous à votre boîte
  2. modifier ~/.bash_profile 
  3. À la fin du fichier, ajoutez cd /path/to/your/destination
  4. Enregistrez-le et quittez votre éditeur
  5. Déconnexion de la boîte
  6. Connectez-vous à nouveau et vous devriez atterrir dans /path/to/your/destination

39
2018-02-27 11:04



Sur certaines machines, vous devrez peut-être ajouter cd /path/to/your/destination à ~/.bashrc au lieu de ~/.bash_profile. Le résultat devrait être le même. - Matthias
Cela fonctionne parfaitement, merci - est-ce limité à mon identifiant utilisateur ou cela affectera-t-il également les connexions d'autres utilisateurs? - barry_allen
@BabyGroot si vous modifiez ~/.bash_profile ou ~/.bashrc cela n'affectera que l'utilisateur actuel. - rubenvarela


Solution plus robuste pour le cas où vous avez besoin de ssh et de remplacer le fichier .bashrc par défaut. Ceci est utile dans les cas où l'environnement de serveur distant a plusieurs docroots et est utilisé par plusieurs utilisateurs.

alias ssh_myserver='ssh server_name -t "echo cd /path/to/desired/dir>/tmp/.bashrc_tmp; bash --rcfile /tmp/.bashrc_tmp"'

Plus détaillé:

  1. La première commande crée .bashrc_tmp déposer dans /tmp répertoire sur le serveur distant avec un contenu cd /path/to/dir
  2. La commande suivante s'exécute bash avec le fichier de configuration spécifié à l’étape 1. Cela permet de basculer vers le répertoire souhaité et de supprimer les valeurs par défaut. .bashrc.
  3. Toute cette commande est emballée comme un alias, ainsi de suite, l'invite de commande du client ssh peut être appelée comme ssh_myserver

5
2017-08-21 11:53



Créatif ... tant que vous avez écrit des permanentes sur / tmp - smci


Avez-vous activé cette directive dans votre configuration ssh?

PermitLocalCommand yes

La valeur par défaut pour cela est no, auquel cas votre LocalCommand directive serait ignorée.

Sinon, avez-vous essayé d’ajouter la commande à votre .bashrc fichier?


4
2017-08-05 14:47



Cette directive est définie, oui (et je suppose que je ne verrais pas le message d'erreur affiché s'il ne l'était pas). Le problème lié à l’utilisation de .bashrc est que le serveur a différents noms d’hôte, et j’aimerais que différents noms d’hôte soient traduits dans différents répertoires de départ. - Gareth
À moins que chaque nom d'hôte ait une adresse IP différente, le serveur ne pourra pas savoir quel nom d'hôte vous avez demandé. Alors que les requêtes HTTP fournissent un en-tête Host: convivial pour identifier le nom d'hôte demandé, les connexions SSH ne le font pas. - Fosco


J'ai donc cherché beaucoup de sites Web (stackoverflow, celui-ci) mais je n'ai pas trouvé ce que je voulais. J'ai fini par créer mon propre script shell. Je le colle ici. Aussi, vous pouvez copier un répertoire dans $ PATH.

#!/bin/bash
ssh -t <username@hostname> "cd ~/$1; exec \$SHELL --login"

Donc après ça. Je fais:

connect <foldername>

Remarque: vous devrez peut-être vous déconnecter et vous reconnecter après avoir modifié la variable de chemin d'accès.


4
2017-11-25 03:10



Je préfère cela à la suggestion précédente car '$ SHELL' est toujours valide, alors que 'bash' peut ne pas l'être. Aussi, l'utilisation de 'exec' est une belle touche. - Dave
Un raffinement supplémentaire serait de s’assurer que «cd» est un succès - «cd ~ / $ 1 && exec ...» - Dave


Dans ton ~/.ssh/config:

LocalCommand echo '/home/%r/some/subdir' > /home/%r/.ssh/ssh_cd

À la fin de votre ~/.bashrc:

if [[ -f $HOME/.ssh/ssh_cd ]]
then
    cd $(<$HOME/.ssh/ssh_cd)
    # uncomment the line below and the file will be removed so the cd won't work
    # unless the file is regenerated since you may not want this to operate for
    # non-ssh logins or for ssh logins that you want to function differently
    # rm $HOME/.ssh/ssh_cd
fi

J'ai essayé de faire cela en passant des variables, y compris avec une variable exportée, mais ces commandes sont exécutées dans des shells différents.

Au fait, en testant ce que vous essayiez de faire, je n'ai pas eu d'erreur lorsque j'ai utilisé le chemin absolu non indiqué. J'ai ajouté ; pwd à la fin de la commande et le bon répertoire est affiché, mais le répertoire dans lequel je me trouve est ~. Il n'y a pas cd commandes dans mes fichiers de démarrage shell. J'ai essayé de mettre un autre cd somedir; pwddans ~/.ssh/rc (avec l'autre toujours en place). le config commande est exécutée avant que le motd ne soit émis et que le rc La commande est émise par la suite, mais avant la création des fichiers de démarrage du shell. Encore une fois, cela se passe dans une coquille différente.

Essayez la technique de passe par fichier et faites-moi savoir si cela fonctionne pour vous.


3
2017-08-05 18:21