web-dev-qa-db-fra.com

Comment puis-je SSH directement à un répertoire particulier?

Je dois souvent me connecter à l'un des serveurs et accéder à l'un des répertoires de ces ordinateurs. Actuellement, je fais quelque chose de ce genre:

 localhost ~] $ ssh somehost 

 Bienvenue chez quelquehost!

J'ai des scripts qui peuvent déterminer quel hôte et quel répertoire je dois accéder, mais je ne peux pas trouver un moyen de le faire:

 localhost ~] $ go_to_dir Foo 

 Bienvenue à quelhost!!

Y at-il un moyen facile, intelligent ou tout moyen de le faire?

185
Frosty

Vous pouvez faire ce qui suit:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted ; bash"

De cette façon, vous obtiendrez un shell directement sur le répertoire souhaité.


Explication

-t Forcer l'allocation pseudo-terminale. Cela peut être utilisé pour exécuter des programmes d'écran arbitraires sur une machine distante, ce qui peut s'avérer très utile, par exemple. lors de la mise en œuvre des services de menu.

Plusieurs options -t forcent l'attribution de tty, même si ssh n'a pas de tty local.

  • Si vous n'utilisez pas -t, aucune invite n'apparaîtra. 
  • Si vous n’ajoutez pas ; bash, la connexion sera fermée et le contrôle reviendra à votre ordinateur local.
338
rogeriopvl

Tu pourrais ajouter

cd /some/directory/somewhere/named/Foo

dans votre fichier .bashrc (ou .profile ou ce que vous appelez) de l'autre hôte. Ainsi, quoi que vous fassiez ou d'où vous veniez ssh, chaque fois que vous vous connecterez à ce serveur, cd ira dans le bon répertoire, et il vous suffira d'utiliser ssh comme d'habitude.

Bien sûr, la solution de rogeriopvl fonctionne aussi, mais elle est un peu plus verbeuse, et vous devez vous rappeler de le faire à chaque fois (à moins que vous ne fassiez un pseudonyme), donc cela semble un peu moins "amusant".

45
Chris Lutz

J'ai créé un outil pour SSH et CD sur un serveur de manière consécutive - bien nommé sshcd . Pour l'exemple que vous avez donné, vous utiliseriez simplement:

sshcd somehost:/some/directory/somewhere/named/Foo

Faites-moi savoir si vous avez des questions ou des problèmes!

18
christianbundy

En fonction des ajouts à la réponse de @ rogeriopvl, je suggère ce qui suit:

ssh -t xxx.xxx.xxx.xxx "cd /directory_wanted && bash"

En chaînant les commandes par &&, la commande suivante ne sera exécutée que lorsque la précédente aura réussi (au lieu d'utiliser ;, qui exécute les commandes de manière séquentielle). Ceci est particulièrement utile lorsque vous avez besoin de cd dans un répertoire exécutant la commande.

Imaginez ce qui suit:

/home/me$ cd /usr/share/teminal; rm -R *

Le répertoire teminal n'existe pas, ce qui vous oblige à rester dans le répertoire de base et à supprimer tous les fichiers qu'il contient à l'aide de la commande suivante.

Si vous utilisez &&:

/home/me$ cd /usr/share/teminal && rm -R *

La commande échouera après ne pas avoir trouvé le répertoire.

6
Bas Peeters

Dans mon cas très spécifique, je voulais juste exécuter une commande dans un hôte distant, dans un répertoire spécifique à partir d'une machine esclave Jenkins:

ssh myuser@mydomain
cd /home/myuser/somedir 
./commandThatMustBeRunInside_somedir
exit

Mais ma machine ne pouvait pas exécuter le SSH (elle ne pouvait pas allouer un pseudo-tty je suppose) et m'a gardé en donnant l'erreur suivante:

Pseudo-terminal will not be allocated because stdin is not a terminal

Je pourrais contourner ce problème en passant "cd à dir + ma commande" en tant que paramètre de la commande ssh (pour ne pas avoir à allouer de pseudo-terminal) et en passant l'option -T à indiquer explicitement à la commande ssh que je n'ai pas pas besoin d'allocation pseudo-terminale.

ssh -T myuser@mydomain "cd /home/myuser/somedir; ./commandThatMustBeRunInside_somedir"
2
Mauricio Reis

J'utilise la variable d'environnement CDPATH

2
Eddy

Mon approche préférée consiste à utiliser le fichier de configuration SSH (décrit ci-dessous), mais il existe quelques solutions possibles en fonction de vos utilisations.

Arguments de ligne de commande

Je pense que la meilleure réponse à cette approche est la réponse de christianbundy à la réponse acceptée:

ssh -t example.com "cd /foo/bar; exec \$Shell -l"

L'utilisation de guillemets doubles vous permettra d'utiliser des variables de votre machine locale, à moins qu'elles ne soient échappées (car $Shell est ici). Vous pouvez également utiliser des guillemets simples et toutes les variables que vous utiliserez seront celles de la machine cible:

ssh -t example.com 'cd /foo/bar; exec $Shell -l'

Fonction Bash

Vous pouvez simplifier la commande en l’enveloppant dans une fonction bash. Disons que vous voulez juste taper ceci:

sshcd example.com /foo/bar

Vous pouvez faire cela en ajoutant ceci à votre ~/.bashrc:

sshcd () { ssh -t "$1" "cd \"$2\"; exec \$Shell -l"; }

Si vous utilisez une variable existant sur la machine distante pour le répertoire, veillez à l'échapper ou à la mettre entre guillemets. Par exemple, ceci ira au répertoire qui est stocké dans la variable JBOSS_HOME sur la machine distante:

sshcd example.com \$JBOSS_HOME

Fichier de configuration SSH

Si vous souhaitez voir ce comportement tout le temps pour des hôtes spécifiques (ou des hôtes) avec la commande ssh normale sans devoir utiliser d'arguments de ligne de commande supplémentaires, vous pouvez définir les options RequestTTY et RemoteCommand dans votre fichier de configuration ssh.

Par exemple, j'aimerais ne taper que cette commande:

ssh qaapps18

mais je veux que ça se comporte toujours comme cette commande:

ssh -t qaapps18 'cd $JBOSS_HOME; exec $Shell'

J'ai donc ajouté ceci à mon fichier ~/.ssh/config:

Host *apps*
    RequestTTY yes
    RemoteCommand cd $JBOSS_HOME; exec $Shell

Maintenant, cette règle s'applique à tout hôte avec "apps" dans son nom d'hôte.

Pour plus d'informations, voir http://man7.org/linux/man-pages/man5/ssh_config.5.html

1
Drew

Une autre façon d’aller directement après la connexion est de créer "Alias". Lorsque vous vous connectez à votre système, tapez simplement cet alias et vous serez dans ce répertoire.

Exemple: alias = mon dossier "/ var/www/dossier" 

Après vous être connecté à votre type de système, cet alias (cela fonctionne à partir de n’importe quelle partie du système)
cette commande si pas dans bashrc fonctionnera pour la session en cours. Donc, vous pouvez aussi ajouter cet alias à bashrc pour l'utiliser à l'avenir 

$ myfolder => vous amène à ce dossier

1
insomiac

aller plus loin avec l'idée -t. Je conserve un ensemble de scripts appelant celui ci-dessous pour accéder à des endroits spécifiques de mes hôtes fréquemment visités. Je les garde tous dans ~/bin et garde ce répertoire dans mon chemin.

#!/bin/bash

# does ssh session switching to particular directory
# $1, hostname from config file 
# $2, directory to move to after login
# can save this as say 'con' then
# make another script calling this one, e.g.
# con myhost repos/i2c

ssh -t $1 "cd $2; exec \$Shell --login"
0
DKebler