2009-07-29 9 views
39

estoy tratando de ejecutar un comando de forma remota a través de SSH, ejemplo:ejecución del comando ssh no considera .bashrc | .bash_login | .ssh/rc?

ssh <user>@<host> <command> 

El comando que debe ser ejecutada es un alias, que se define en .bashrc, por ejemplo,

alias ll='ls -al' 

Así que lo que al final el siguiente comando debería se ejecutan:

ssh [email protected] "ll" 

ya me di cuenta que sólo se pone Bashrc originaria con shell interactivo, por lo que en .bash_login pongo:

if [ -f ~/.bashrc ]; then 
    . ~/.bashrc 
fi 

y también intenté definir el alias directamente en .bash_login.

También traté de poner la definición del alias/fuente de .bashrc en .bash_profile y también en .ssh/rc. Pero nada de esto funciona. Tenga en cuenta que no puedo cambiar la forma en que se invoca el comando ssh, ya que es parte de algún script de instalación binario. Lo único que puedo modificar es el medio ambiente. ¿Hay alguna otra posibilidad de obtener este alias de origen cuando se ejecuta el comando ssh? ¿Hay alguna configuración ssh que deba ser adaptada?

+0

Qué máquina son estos archivos (.bashrc, etc.) en? ¿La máquina con la que estás ssh-ing, o la que estás haciendo ssh-ing? –

+0

Los archivos están en la máquina Estoy ssh-ing a – blackicecube

+1

También he comprobado/etc/passwd para mi usuario. Tiene/usr/bin/bash definido. – blackicecube

Respuesta

7

EDIT:

Como se señaló here sobre conchas no interactivas ..


# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 
# execution returns after this line 

Ahora, para cada alias en el archivo .bashrc decir que tengo:


alias ll="ls -l" 
alias cls="clear;ls" 

Cree un archivo con el nombre de ese alias para ll:

 
[email protected]$ vi ssh_aliases/ll 
#inside ll,write 
ls -l 
[email protected]$ chmod a+x ll 

Ahora edite Bashrc incluir:


# If not running interactively, don't do anything 
[ -z "$PS1" ] && export $PATH=$PATH:~/ssh_aliases 

Esto hace el trabajo .. aunque no estoy seguro de si es la mejor manera de hacerlo
EDITAR (2)
Usted solo necesita hacer esto para los alias, otros comandos en bashrc se ejecutarán como lo señala David "debes tener ejecutable para que ssh ejecute comandos".

+0

Gracias por su sugerencia. Los alias invocados por el guión de instalación se definen en una base de datos personalizada que se encuentra en algún lugar del directorio de instalación. En ese bashrc personalizado además de los alias, también hay muchas exportaciones de variables definidas. Entonces, ¿con su solución necesitaría crear un archivo para cada alias/exportación? – blackicecube

+0

Espero que funcione para usted ahora .. – sud03r

+0

Lo probé, desafortunadamente todavía no funciona. No estoy seguro, pero parece que .bashrc no se obtiene al invocar ssh. – blackicecube

33

Desde las páginas del manual de bash:

Alias ​​no se expanden cuando el proyectil no es interactivo, a menos que la opción expand_aliases cáscara se ajusta con shopt

Hay un par de maneras de hacer esto, pero la más sencilla es simplemente añadir la siguiente línea a su archivo .bashrc:

shopt -s expand_aliases 
+0

Te he subido de categoría, pero debes explicar lo que hace. – bradlis7

+1

Como se explica en otro lugar aquí, el shell no está en modo interactivo. Esto permite la opción de expandir los alias. De los documentos: Si se establece, los alias se expanden como se describe arriba en ALIAS. Esta opción está habilitada de forma predeterminada para los shells interactivos. –

+0

Sí, lo encontré, solo estaba sugiriendo que lo agregue a su comentario. Intenté hacer ese comando en 'ssh $ HOST 'shopt -s expand_aliases; ll'', pero eso no funcionó. Probablemente funcione si lo puse en .bashrc, pero no lo intenté. – bradlis7

24

I n lugar de:

ssh [email protected] "bash -c ll" 

intento:

ssh [email protected] "bash -ic ll" 

para forzar fiesta de utilizar una "shell interactivo".

+4

Para mí, tuve que usar 'ssh user @ host" bash -lc ll "' - un l en lugar de i. (Lima en lugar de India.) – richardkmiller

+0

¡Intenté con '-ic' y funcionó perfectamente! Gracias! – CodeWarrior

+0

Pero, ¿esto significa que tengo que agregar todos y cada uno de los alias en la llamada SSH? Me refiero a la parte" ll "de" ssh user @ host "bash -ic ll" " –

-3

Abrir archivo ~/.bash_profile. Si este archivo no existe, no crear uno en el directorio de inicio y añadir la siguiente línea

fuente = $ HOME/.bashrc

salida de su ssh y al acceso alquilásemos y usted debe obtener la configuración .bashrc que trabajan para usted.

+0

Esto probablemente debería haber sido' source $ HOME/.bashrc' o '. $ HOME/.bashrc'. –

-1

una alternativa a los alias que será visible en toda la escritura es EXPORTACIÓN & Ejecutar VARIABLE

# shortcut to set enviroment to insensitive case 
export go_I="shopt -s nocasematch" 

Ahora en cualquier secuencia de comandos que puede utilizar

#!/bin/bash $go_I # go Insensitive [[ a == A ]] # evaluates TRUE ($? == 0) $go_C # maibe want to go back to casesensitive

es útil colocar todos los accesos directos/alias en /path/to/my_commands y editar /etc/bash.bashrc

source /path/to/my_commands

+0

Esto no responde la pregunta. – reinierpost

Cuestiones relacionadas