web-dev-qa-db-fra.com

Comment puis-je changer automatiquement de répertoire lors de la connexion ssh?

J'essaie d'obtenir que ssh passe automatiquement à un répertoire particulier lorsque je me connecte. J'ai essayé de faire fonctionner ce comportement en utilisant les directives suivantes dans ~/.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 certainement un dossier web dans mon répertoire personnel. Même l'utilisation d'un chemin absolu donne le même message. Pour être clair, si je tape cd web après avoir ouvert une session, j'arrive dans le bon dossier.

Qu'est-ce que j'oublie ici?

MODIFIER:

Différentes combinaisons de guillemets/chemins absolus donnent des messages d'erreur différents:

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 y a une autre erreur qui se produit.

91
Gareth

cd est un shell intégré. LocalCommand est exécuté comme:

/bin/sh -c <localcommand>

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

<Édition presque une décennie plus tard ...>

LocalCommand n'est pas ce que vous voulez, de toute façon. C'est exécuté sur votre machine. Vous voulez RemoteCommand. Quelque chose comme ça a fonctionné pour moi:

Host example.net
  RemoteCommand cd / && exec bash --login
  RequestTTY yes
29
BMDan

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 l'exécution de la commande cd. Et si vous n'ajoutez pas --login puis votre ~/.profile n'est pas d'origine.

81
Vladislav Lezhnev
  1. Connectez-vous à votre box
  2. Éditer ~/.bash_profile
  3. À la fin du fichier, ajoutez cd /path/to/your/destination
  4. Enregistrez-le et quittez
  5. Déconnexion de la boîte
  6. Connectez-vous à nouveau et vous devriez atterrir sur /path/to/your/destination
48
sobi3ch

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 fichier dans /tmp répertoire sur le serveur distant avec un contenu cd /path/to/dir
  2. La commande suivante 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 la valeur par défaut .bashrc.
  3. Cette commande entière est enveloppée sous la forme d'un alias, donc sur l'invite de commande du client ssh, elle peut être appelée comme ssh_myserver
5
Alex Skrypnyk

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. Vous pouvez également le copier dans un répertoire dans le $ 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

5
Aryan

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

PermitLocalCommand yes

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

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

4
EEAA

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 le faire en utilisant le passage de variables, y compris avec une variable exportée, mais ces commandes sont exécutées dans différents shells.

En testant ce que vous tentiez de faire, je n'ai pas eu d'erreur lorsque j'ai utilisé le chemin absolu non cité, soit dit en passant. J'ai ajouté ; pwd à la fin de la commande et le répertoire correct s'affiche, mais le répertoire dans lequel je me trouve est ~. Il n'y a pas de commandes cd dans mes fichiers de démarrage Shell. J'ai essayé de mettre un autre cd somedir; pwd dans ~/.ssh/rc (avec l'autre toujours en place). La commande config est exécutée avant l'émission du motd et la commande rc est émise par la suite, mais avant que les fichiers de démarrage du shell soient fournis. Encore une fois, cela se passe dans un autre Shell.

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

L'avez-vous essayé sans les guillemets qui l'entourent? Les seuls exemples que j'ai vus ne les ont pas, donc avec eux, il pourrait essayer d'exécuter cd\web en tant que commande.

2
James L

Essayez d'utiliser RemoteCommand à la place, par exemple.

Host myhost
  HostName IP
  User ubuntu
  IdentityFile ~/.ssh/id_rsa
  RemoteCommand cd web; $Shell -il

RemoteCommand: spécifie une commande à exécuter sur la machine distante après une connexion réussie au serveur. (man ssh_config)

1
kenorb

Vous pouvez également essayer ceci, avec l'option -t:

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