GNU/Linux >> Linux Esercitazione >  >> Linux

Usa .bashrc senza violare sftp

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.


Linux
  1. Utilizzare $[ Espr ] invece di $(( Espr ))?

  2. Perché non posso usare Cd in uno script Bash??

  3. Utilizzare Ts senza perdere il valore di uscita?

  4. Usa variabili all'interno di {} Espansione senza `eval`?

  5. Usa SFTP e SCP

Come utilizzare il comando di lettura Bash

.bashrc vs .bash_profile

Rigenerare .bashrc dalla shell corrente?

Come usare il comando echo senza Newline

Cos'è Zsh? Dovresti usarlo?

Qual è l'uso di $# in Bash