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.
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
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.
~/.bash_profile
cd /path/to/your/destination
/path/to/your/destination
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é:
.bashrc_tmp
fichier dans /tmp
répertoire sur le serveur distant avec un contenu cd /path/to/dir
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
.alias
, donc sur l'invite de commande du client ssh, elle peut être appelée comme ssh_myserver
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
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?
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.
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
)
Vous pouvez également essayer ceci, avec l'option -t
:
ssh server -t "cd /my/remote/directory; bash"