Soluzione 1:
Prova invece a farlo
if [ "$SSH_TTY" ]
then
source .bashc_real
fi
Soluzione 2:
La risposta di Mike probabilmente funzionerà. Ma vale la pena sottolineare che puoi farlo selezionando attentamente i file di avvio in cui inserire le informazioni dettagliate. Dalla pagina man di bash:
Quando bash viene invocato come shell di login interattiva, o come shell non interattiva con l'opzione --login, prima legge ed esegue i comandi dal file /etc/profile, se quel file esiste. Dopo aver letto quel file, cerca ~/.bash_profile, ~/.bash_login e ~/.profile, in questo ordine, e legge ed esegue i comandi dal primo che esiste ed è leggibile. L'opzione --noprofile può essere usata quando la shell viene avviata per inibire questo comportamento.
Quando viene avviata una shell interattiva che non è una shell di login, bash legge ed esegue comandi da ~/.bashrc, se quel file esiste. Questo può essere inibito usando l'opzione --norc. L'opzione del file --rcfile costringerà bash a leggere ed eseguire i comandi dal file invece che da ~/.bashrc.
Gli strumenti sftp/scp avviano una shell interattiva non di accesso, quindi .bashrc verrà originato. Molte distribuzioni originano .bashrc da .bash_profile o viceversa, quindi può creare confusione. Un buon trucco per testare la pulizia del tuo ambiente di accesso è entrare con ssh con un comando, che simula lo stesso modo in cui scp/sftp si connette. Ad esempio:ssh myhost /bin/true
ti mostrerà esattamente cosa vede scp/sftp quando si connette.
Una semplice demo:
[email protected]:~$ echo "echo Hello from .profile" > .profile
[email protected]:~$ echo "echo Hello from .bashrc" > .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
Hello from .bashrc
sazerac:~ insyte$
[email protected]:~$ rm .bashrc
sazerac:~ insyte$ ssh mazer /bin/true
sazerac:~ insyte$
Il primo test causerà l'interruzione di scp/sftp/rsync ecc. La seconda versione funzionerà perfettamente.
Soluzione 3:
Se stai usando csh:
if ($?prompt)
... interactive stuff ...
E se è bash:
if [[ $- == *i* ]]; then
... interactive stuff ...
fi
o in alternativa usando le espressioni regolari di bash:
if [[ $- =~ i ]]; then
... interactive stuff ...
fi
Queste righe dovrebbero precedere le righe in cui emetti/ripeti qualcosa.