Use .bashrc sem interromper o sftp

18

Meu problema é que preciso definir algumas variáveis e gerar algumas linhas toda vez que eu fizer login no shell ssh e, ao mesmo tempo, precisar usar o sftp para arquivos tarnsfer via Filezilla.

Agora, de acordo com a FAQ do openssh no link , se os seus scripts de inicialização ecoam qualquer tipo de saída, isso atrapalha com sftp. Por isso, atrasa indefinidamente ou erros com uma "Conexão fechada pelo servidor com o código de saída 128".

Eu tentei soluções como mover o .bashrc para .bash_profile ou usar o seguinte código em .bashrc:

if [ "$TERM" != "dumb" ]
then
   source .bashc_real
fi

E:

if [ "$TERM" = "xterm" ]
then
   source .bashc_real
fi

No entanto, nada funciona. Meu terminal do shell é bash e eu me conecto ao sftp com o filezilla.

    
por Joel G Mathew 07.03.2013 / 07:24

4 respostas

22

Tente fazer isso em vez

if [ "$SSH_TTY" ]
then
   source .bashc_real
fi
    
por 07.03.2013 / 07:28
15

A resposta de Mike provavelmente funcionará. Mas vale a pena ressaltar que você pode fazer isso cuidadosamente selecionando quais arquivos de inicialização para colocar as coisas verbosas. Da página man bash:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

As ferramentas sftp / scp iniciam um shell interativo de não-login, então .bashrc será originado. Muitas distribuições obtêm o .bashrc de .bash_profile ou vice-versa, por isso pode ficar confuso. Um bom truque para testar a limpeza do seu ambiente de login é o ssh com um comando, que simula da mesma forma que o scp / sftp se conecta. Por exemplo: ssh myhost /bin/true mostrará exatamente o que o scp / sftp vê quando se conecta.

Uma demonstração simples:

insyte@mazer:~$ echo "echo Hello from .profile" > .profile
insyte@mazer:~$ echo "echo Hello from .bashrc" > .bashrc

sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$

insyte@mazer:~$ rm .bashrc

sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$

O primeiro teste fará com que scp / sftp / rsync etc. seja interrompido. A segunda versão funcionará bem.

    
por 07.03.2013 / 07:48
3

Se você estiver usando csh:

if ($?prompt)
  ... interactive stuff ...

E se for bash:

if [[ $- == *i* ]]; then
  ... interactive stuff ...
fi

ou, alternativamente, usando expressões regulares bash:

if [[ $- =~ i ]]; then
  ... interactive stuff ...
fi

Essas linhas devem preceder as linhas nas quais você envia / retorna algo.

    
por 07.03.2013 / 12:11
1

A solução de Mike também funcionou para mim. Mas como meu shell padrão é TCSH, tive que editar um pouco a correção da seguinte maneira (em .tcshrc):

if ( $?SSH_TTY ) then
    exec /bin/bash
endif

Pensei em compartilhar para o benefício de todos.

    
por 12.01.2017 / 06:07