'ssh foo “comando /”' não está carregando aliases remotos?

5

resumo: por que isso falha

$ ssh foo 'R --version | head -n 1'
bash: R: command not found

mas isso é bem-sucedido

$ ssh foo 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh foo 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux86_64/bin/R'
$ ssh foo '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)

detalhes:

Eu sou um usuário (sem raiz) em dois clusters. Um usa módulos de ambiente, portanto, qualquer servidor nesse cluster pode fornecer (via module add ) praticamente os mesmos recursos. O outro cluster, no qual devo infelizmente também trabalhar, tem servidores gerenciados individualmente, então eu tenho o hábito de fazer, por exemplo,

EXEC_NAME='whatever'
for S in 'foo' 'bar' 'baz' ; do
  ssh ${SERVER} "${EXEC_NAME} --version"
done

Isso funciona bem para pacotes instalados normalmente / consistentemente, mas muitas vezes (por razões desconhecidas para mim) os pacotes não são: por exemplo, (compare alias abaixo ao alias acima),

$ ssh bar 'R --version | head -n 1'
bash: R: command not found
$ ssh bar 'grep -nHe 'bashrc' ~/.bash_profile'
/home/me/.bash_profile:3:# source the users .bashrc if it exists
/home/me/.bash_profile:4:if [ -f "${HOME}/.bashrc" ] ; then
/home/me/.bash_profile:5:  source "${HOME}/.bashrc"
$ ssh bar 'grep -nHe "\WR\W" ~/.bashrc'
/home/me/.bashrc:118:alias R='/share/linux/bin/R'
$ ssh bar '/share/linux86_64/bin/R --version | head -n 1'
R version 2.14.1 (2011-12-22)

O uso de aliases lida bem com essas diferenças de instalação quando eu interajo de forma interativa no servidor, mas falha quando tento script de comandos ssh (como acima); ou seja,

# interactively
$ ssh foo
...
foo> R --version

chama meu alias para R no host remoto = foo , mas

# scripting
$ ssh foo 'R --version'

não. O que preciso fazer para que ssh foo "<command/>" carregue meus aliases no host remoto?

    
por TomRoche 04.09.2012 / 03:13

2 respostas

6

Na% man_de% manpage:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt (see the description of shopt under SHELL BUILTIN COMMANDS below).

Você precisa bash no seu controle remoto shopt -s expand_aliases s e verifique se esses .bashrc são processados quando não interativos; o .bashrc predefinido para a sua distribuição pode incluir um cheque para terminar mais cedo quando não é interactivo, por ex. O Ubuntu usa:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return
    
por 04.09.2012 / 03:46
2

A resposta de Andrew explicou o motivo. Eu só dou mais uma solução:

Em vez de usar aliases , use seu function equivalents .

Por exemplo:

Em vez de usar: alias ll='ls -lah'

Use isto:

function ll{ ls -lah "$@" }

    
por 10.06.2014 / 17:15