Tente fazer isso em vez
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
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.
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.
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.
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.