Quiero ssh en una computadora Ubuntu remota, buscar mi .bashrc
y ejecutar un comando que depende de los parámetros establecidos por eso .bashrc
. Todo eso en un shell interactivo que no se cierra después de que se realiza el comando.
Lo que intenté hasta ahora es
ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'
o solo
ssh user@remote_computer -t "my_alias;bash"
Esto funciona para comandos generales (como ls
por ejemplo) pero cuando intento ejecutar un alias definido en .bashrc
aparece un error:
bash: my_alias: command not found
Pero luego, cuando lo escribo de nuevo manualmente y lo ejecuto, ¡funciona!
Entonces, ¿cómo puedo asegurarme de que la .bashrc
fuente se obtiene antes de que se llame al comando?
Respuestas:
El problema es que está intentando ejecutar un alias en un shell no interactivo. Cuando ejecuta
ssh user@computer command
,command
se ejecuta de forma no interactiva.Los shells no interactivos no leen alias (de man bash):
Funciona si lo ejecuta de nuevo manualmente porque el
bash
comando final inicia un shell interactivo para que sus alias estén ahora disponibles.Como alternativa, puede iniciar un shell interactivo (
bash -i
) en lugar de un simple shell de inicio de sesión (bash -l
) en la máquina remota para ejecutar su alias:Sin embargo, este parece un enfoque muy complicado. No ha explicado por qué exactamente necesita hacer esto, pero considere estas alternativas:
Simplemente inicie un shell interactivo de inicio de sesión normal en la máquina remota y ejecute el comando manualmente:
Si siempre desea que se ejecute ese alias cuando se conecta a esta computadora, edite el
~/.profile
(o~/.bash_profile
, si está presente) de la computadora remota y agregue esta línea al final:Debido a que
~/.profile
se lee cada vez que se inicia un shell de inicio de sesión (ssh
por ejemplo , cada vez que se conecta , por ejemplo), eso harámy_alias
que se ejecute cada vez que se conecte.Tenga en cuenta que, de forma predeterminada, los shells de inicio de sesión leen
~/.profile
o~/.bash_profile
ignoran~/.bashrc
. Algunas distribuciones (Debian y sus derivados y Arch, por ejemplo) distribuciones como Ubuntu tienen su fuente predeterminada~/.profile
o de~/.bash_profile
archivos, lo~/.bashrc
que significa que sus alias definidos~/.bashrc
también estarán disponibles en un shell de inicio de sesión. Esto no es cierto para todas las distribuciones, por lo que es posible que tenga que editar su~/.profile
manual para tener su fuente~/.bashrc
. También tenga en cuenta que si~/.bash_profile
existe,~/.profile
será ignorado por bash.fuente
~/.basyrc
se lee automáticamente~./profile
, por lo que cualquier alias definido en~/.bashrc
también estará disponible para cualquier lectura de shells~/.profile
. Todo lo que realmente necesitaba hacer para que esto funcionara era iniciar explícitamente un shell interactivo (-i
).Tuve que comentar una parte de mi .bashrc que impedía el uso de alias y agregar un comando expand_aliases. Esto fue comentado
Y esto fue agregado
Entonces mi comando funcionó:
fuente