Execute um comando em um shell interativo com o ssh após o sourcing .bashrc

6

Eu quero ssh em um computador Ubuntu remoto, fonte meu .bashrc e executar um comando que depende dos parâmetros definidos por esse .bashrc . Tudo isso em um shell interativo que não fecha após o comando ser feito.

O que eu tentei até agora é

ssh user@remote_computer -t 'bash -l -c "my_alias;bash"'

ou apenas

ssh user@remote_computer -t "my_alias;bash"

Isso funciona para comandos gerais (como ls , por exemplo), mas quando tento executar um alias definido em .bashrc , recebo um erro:

bash: my_alias: command not found

Mas quando eu escrevo manualmente novamente e o executo, funciona!

Então, como posso ter certeza de que o .bashrc é originado antes que o comando seja chamado?

    
por Mehdi 18.11.2015 / 12:09

2 respostas

6

O problema é que você está tentando executar um alias em um shell não interativo. Quando você executa ssh user@computer command , command é executado de forma não interativa.

Shells não interativos não lêem aliases (do man bash):

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).

Funciona se você executá-lo novamente manualmente porque o comando final bash inicia um shell interativo para que seus aliases estejam disponíveis agora.

Como alternativa, você poderia lançar um shell interativo ( bash -i ) em vez de um simples shell de login ( bash -l ) na máquina remota para executar seu alias:

ssh user@remote_computer -t 'bash -ic "my_alias;bash"'

Esta parece ser uma abordagem muito complicada. Você não explicou por que exatamente precisa fazer isso, mas considere estas alternativas:

  1. Basta iniciar um shell interativo de login normal na máquina remota e executar o comando manualmente:

    user@local $ ssh user@remote
    user@remote $ my_alias
    
  2. Se você quiser sempre que o alias seja executado quando se conectar a este computador, edite o ~/.profile (ou ~/.bash_profile , se presente) do computador remoto e adicione essa linha no final:

    my_alias
    

    Porque ~/.profile é lido toda vez que um shell de login é iniciado (assim, sempre que você se conecta via ssh , por exemplo), isso fará com que my_alias seja executado toda vez que você se conectar.

    Observe que, por padrão, os shells de login leem ~/.profile ou ~/.bash_profile e ignoram ~/.bashrc . Algumas distribuições (Debian e seus derivados e Arch, por exemplo) distribuições como o Ubuntu têm seus ~/.profile ou ~/.bash_profile arquivos% source ~/.bashrc padrão, o que significa que seus aliases definidos em ~/.bashrc também estarão disponíveis em um shell de login. Isso não é verdadeiro para todas as distribuições, portanto, talvez seja necessário editar manualmente o ~/.profile para que ele tenha a origem ~/.bashrc . Observe também que, se existir ~/.bash_profile , ~/.profile será ignorado pelo bash.

por 18.11.2015 / 13:56
3

Eu tive que comentar uma parte do meu .bashrc que impedia que aliases fossem usados e adicione um comando expand_aliases. Isso foi comentado

# If not running interactively, don't do anything
#case $- in
#    *i*) ;;
#      *) return;;
#esac

E isso foi adicionado

if [ -z "$PS1" ]; then
  shopt -s expand_aliases
fi

Então meu comando funcionou:

ssh user@remote_computer -t "my_alias;bash"
    
por 18.11.2015 / 13:49