Je veux ssh dans un ordinateur Ubuntu distant, source mon .bashrc
et exécuter une commande qui dépend des paramètres définis par cela .bashrc
. Tout cela dans un shell interactif qui ne se ferme pas une fois la commande terminée.
Ce que j'ai essayé jusqu'à présent, c'est
ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'
ou juste
ssh user@remote_computer -t "my_alias;bash"
Cela fonctionne pour les commandes générales (comme ls
par exemple) mais lorsque j'essaie d'exécuter un alias défini dans .bashrc
j'obtiens une erreur:
bash: my_alias: command not found
Mais quand je l'écris à nouveau manuellement et l'exécute, cela fonctionne!
Alors, comment puis-je m'assurer que le .bashrc
est originaire avant l'appel de la commande?
Réponses:
Le problème est que vous essayez d'exécuter un alias dans un shell non interactif. Lorsque vous exécutez
ssh user@computer command
,command
s'exécute de manière non interactive.Les shells non interactifs ne lisent pas les alias (de man bash):
Cela fonctionne si vous l'exécutez à nouveau manuellement car la
bash
commande finale démarre un shell interactif afin que vos alias soient désormais disponibles.Comme alternative, vous pouvez lancer un shell interactif (
bash -i
) au lieu d'un simple shell de connexion (bash -l
) sur la machine distante pour exécuter votre alias:Cela semble cependant une approche très compliquée. Vous n'avez pas expliqué pourquoi vous devez exactement le faire, mais envisagez ces alternatives:
Il suffit de démarrer un shell interactif de connexion normale sur la machine distante et d'exécuter la commande manuellement:
Si vous souhaitez toujours que cet alias soit exécuté lorsque vous vous connectez à cet ordinateur, modifiez
~/.profile
(ou~/.bash_profile
, s'il est présent) de l'ordinateur distant et ajoutez cette ligne à la fin:Parce que
~/.profile
est lu chaque fois qu'un shell de connexion est démarré (donc, à chaque connexion viassh
, par exemple), cela provoqueramy_alias
son exécution à chaque connexion.Notez que par défaut, les shells de connexion lisent
~/.profile
ou~/.bash_profile
ignorent~/.bashrc
. Certaines distributions (Debian et ses dérivés et Arch, par exemple) comme Ubuntu ont leur source par défaut~/.profile
ou~/.bash_profile
fichiers,~/.bashrc
ce qui signifie que vos alias définis dans~/.bashrc
seront également disponibles dans un shell de connexion. Ce n'est pas le cas pour toutes les distributions, vous devrez donc peut-être modifier~/.profile
manuellement votre source~/.bashrc
. Notez également que s'il~/.bash_profile
existe,~/.profile
il sera ignoré par bash.la source
~/.basyrc
est automatiquement lu par~./profile
, donc tous les alias définis dans~/.bashrc
seront également disponibles pour tous les shells en lecture~/.profile
. Tout ce que vous aviez vraiment besoin de faire pour que cela fonctionne était de démarrer explicitement un shell interactif (-i
).J'ai dû commenter une partie de mon .bashrc qui empêchait l'utilisation d'alias et ajouter une commande expand_aliases. Cela a été commenté
Et cela a été ajouté
Ensuite, ma commande a fonctionné:
la source