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?