A resposta de Mike provavelmente funcionará. Mas vale ressaltar que você pode realizar isso cuidadosamente selecionando quais arquivos de inicialização colocar os itens detalhados. Na página de manual do bash:
Quando o bash é chamado como um shell de login interativo ou como um shell não interativo com a opção --login, ele primeiro lê e executa comandos do arquivo / etc / profile, se esse arquivo existir. Depois de ler esse arquivo, ele procura ~ / .bash_profile, ~ / .bash_login e ~ / .profile, nessa ordem, e lê e executa comandos do primeiro que existe e é legível. A opção --noprofile pode ser usada quando o shell é iniciado para inibir esse comportamento.
Quando um shell interativo que não é um shell de login é iniciado, o bash lê e executa comandos de ~ / .bashrc, se esse arquivo existir. Isso pode ser inibido usando a opção --norc. A opção --rcfile file forçará o bash a ler e executar comandos do arquivo em vez de ~ / .bashrc.
As ferramentas sftp / scp iniciam um shell interativo sem logon, portanto, o .bashrc será originado. Muitas distribuições usam o .bashrc como .bash_profile ou vice-versa, para que fique confuso. Um bom truque para testar a limpeza do seu ambiente de login é fazer o ssh com um comando, que simula da mesma maneira que o scp / sftp connect. Por exemplo: ssh myhost /bin/true
mostrará exatamente o que o scp / sftp vê quando eles se conectam.
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. quebre. A segunda versão funcionará bem.
.bashrc
que seria fonte parascp
oussh host command
.Bash
invocado porscp
oussh host command
é realmente não interativo . Acabei de encontrar isso no manual do bash: "O Bash tenta determinar quando está sendo executado com sua entrada padrão conectada a uma conexão de rede , como quando executada pelo daemon de shell remoto, geralmente rshd, ou pelo daemon de shell seguro sshd . Se o bash determinar está sendo executado dessa maneira, lê e executa comandos de~/.bashrc
, se esse arquivo existir e for legível. " Aqui está a história interessante .Se você estiver usando o csh:
E se é bash:
ou, alternativamente, usando expressões regulares do bash:
Essas linhas devem preceder as linhas nas quais você reproduz / reproduz algo de volta.
fonte
$?var
incsh
retorna 1 sevar
for definido e 0 caso contrário.$-
inbash
teria oi
char em seu valor se o shell for interativo.A solução de Mike também funcionou para mim. Mas como meu shell padrão é TCSH, tive que editar levemente a correção da seguinte maneira (em .tcshrc):
Apenas pensei em compartilhar para o benefício de todos.
fonte
Eu gosto mais de outras soluções mencionadas aqui, mas pensei em lançar a solução que atualmente uso em minhas VMs bash e csh para evitar desconexões de SFTP devido a comandos de eco nos meus scripts de inicialização, apenas caso alguém ache as informações úteis .
No BASH:
No csh:
É um pouco de força bruta, mas funciona.
fonte
Aqui estão as primeiras linhas do meu
.bashrc
arquivo (padrão) :A verificação de uma sessão interativa evita a bagunça com SCP, SFTP ou
ssh remote-host command
modo.Sem isso, se o seu arquivo
.bashrc
usarecho
ou imprimir outras coisas no stdout, você poderá obter este tipo de erro:Received message too long 168435779
protocol error: unexpected <newline>
fonte