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?
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.
-t
, aucune invite n'apparaîtra. ; bash
, la connexion sera fermée et le contrôle reviendra à votre ordinateur local.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".
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!
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.
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"
J'utilise la variable d'environnement CDPATH
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.
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'
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
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
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
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"