GNU/Linux >> Znalost Linux >  >> Linux

Používejte .bashrc bez přerušení sftp

Řešení 1:

Zkuste to udělat místo toho

if [ "$SSH_TTY" ]
then
   source .bashc_real
fi

Řešení 2:

Mikeova odpověď bude pravděpodobně fungovat. Ale stojí za to zdůraznit, že toho můžete dosáhnout pečlivým výběrem spouštěcích souborů, do kterých vložíte podrobné informace. Z manuálové stránky bash:

Když je bash vyvolán jako interaktivní přihlašovací shell nebo jako neinteraktivní shell s volbou --login, nejprve načte a provede příkazy ze souboru /etc/profile, pokud tento soubor existuje. Po přečtení tohoto souboru hledá ~/.bash_profile, ~/.bash_login a ~/.profile v tomto pořadí a čte a provádí příkazy od prvního, který existuje a je čitelný. Volba --noprofile může být použita při spuštění shellu k potlačení tohoto chování.

Když je spuštěn interaktivní shell, který není přihlašovacím shellem, bash readsand provede příkazy z ~/.bashrc, pokud tento soubor existuje. Tomu lze zabránit použitím volby --norc. Volba --rcfile file vynutí číst a spouštět příkazy ze souboru namísto ~/.bashrc.

Nástroje sftp/scp spouštějí interaktivní nepřihlašovací shell, takže bude zdroj .bashrc. Mnoho distribucí pochází z .bashrc z .bash_profile nebo naopak, takže to může být matoucí. Dobrým trikem pro testování čistoty vašeho přihlašovacího prostředí je použít ssh pomocí příkazu, který simuluje stejný způsob připojení scp/sftp. Například:ssh myhost /bin/true vám přesně ukáže, co scp/sftp vidí, když se připojí.

Jednoduchá ukázka:

[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$

První test způsobí přerušení scp/sftp/rsync atd. Druhá verze bude fungovat dobře.

Řešení 3:

Pokud používáte csh:

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

A pokud je to bash:

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

nebo alternativně pomocí regulárních výrazů bash:

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

Tyto řádky by měly předcházet řádkům, kde něco odesíláte/ozvete zpět.


Linux
  1. Proč nemohu použít CD ve skriptu Bash?

  2. Použít Ts bez ztráty výstupní hodnoty?

  3. Který Shell bych měl použít – Tcsh vs Bash?

  1. Historie Bash bez čísel řádků

  2. jak použít kill SIGUSR2 v bash?

  3. Jaké je použití $# v Bash

  1. Použít $[ Expr ] místo $(( Expr ))?

  2. Použít rozšíření .sh nebo .bash pro skripty Bash?

  3. Použít proměnné uvnitř rozšíření {} bez `eval`?