Source .profile e .bashrc su login ssh senza tty

3

Come posso assicurarmi che sorgenti ssh .profile e .bashrc al login senza tty?

Ho un Mac (10.6.8) che sto usando per varie attività UNIX-y come l'hosting di repository git. Ho accesso remoto abilitato tramite il pannello "Condivisione" delle Preferenze di Sistema. Quando I ssh nella macchina, bash origini ~/.profile , che ho impostato per generare il mio file ~/.bashrc e impostare il mio Percorso MacPorts . Il problema è che quando eseguo ssh senza tty , come questo:

ssh myhost echo \$PATH

O esegui un comando git che utilizza essenzialmente ssh nello stesso modo:

git clone ssh://myhost/~/code/myrepo.git

Il mio file ~/.profile non viene mai estratto, quindi la mia variabile $PATH manca /opt/local (dove MacPorts ha installato git ). Sono consapevole che:

  • Posso configurare git sul mio computer locale per utilizzare /opt/local/bin/git-* sulla mia macchina remota
  • Non avrei questo problema se forzassi un tty con ssh -t

Ma non voglio fare nessuna di quelle. Voglio che il mio computer remoto generi il mio file ~/.profile indipendentemente dal fatto che acceda o meno a un tty.

Come faccio a realizzare quel sogno?

Inoltre: ho controllato il comportamento su un paio di macchine Linux (Debian e Fedora), ed entrambi i sistemi sembrano aver trovato il file ~/.bashrc all'accesso, indipendentemente dal fatto che sia un tty . Ho avuto l'impressione che BSD e Linux usassero entrambi lo stesso OpenSSH e bash implementazioni, quindi sembra che la differenza di comportamento derivi da differenze nei file di configurazione /etc ?

    
posta aaronstacy 30.08.2011 - 19:48
fonte

3 risposte

2

Bash ha disposizioni speciali nel suo codice sorgente per generare ~/.bashrc quando è invocato da rshd o sshd . È un'opzione di compilazione, che non sembra essere attivata in OSX.

Se esegui il login con una chiave, puoi (ab) utilizzare l'opzione command= in ~/.ssh/authorized_keys file. Una chiave con un'opzione command è valida solo per eseguire il comando specificato; ma il comando nel file authorized_keys viene eseguito con la variabile di ambiente SSH_ORIGINAL_COMMAND impostata sul comando specificato dall'utente (vuoto per le sessioni interattive). Quindi puoi usare qualcosa di simile in ~/.ssh/authorized_keys (ovviamente non si applica se non usi questa chiave per autenticare):

command=". ~/.profile;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

Nota che ho inserito le interruzioni di riga sopra per leggibilità, ma in realtà deve essere tutto su una riga.

Come posso imposta variabili d'ambiente per un processo rsync remoto? potrebbe avere altri suggerimenti utili.

    
risposta data 30.08.2011 - 23:05
fonte
5

Ecco un metodo per avere bash source .bashrc su sessioni non interattive in modo da non dover modificare le variabili di ambiente in più punti:

  1. Imposta PermitUserEnvironment su yes in /etc/sshd_config ( man sshd )
  2. Imposta BASH_ENV su ~/.bashrc in ~/.ssh/environment ( man bash )
  3. Aggiungi questa riga all'inizio del tuo ~/.bashrc , le cui origini /etc/profile per le sessioni non interattive:

In pratica, questo duplica l'ambiente di accesso interattivo per accessi non interattivi, senza dover rispettare i valori dell'ambiente del codice (ad es. $ PATH) in più punti.

if [[ ! $- == *i* ]]; then
        . /etc/profile
fi

Il passaggio 3. è necessario solo se i percorsi Macports sono impostati in /etc/paths come faccio io. Ma se stai impostando quei percorsi (ad esempio /opt/local/bin ) in ~/.bashrc , suppongo che non ti occorrerà il passaggio 3.

Per la tua situazione, dovresti essere in grado di cambiare ~/.bashrc in ~/.profile .

Ho ~/.bash_profile fonte ~/.bashrc , e non uso ~/.profile . Con questa configurazione (e le modifiche precedenti), le variabili di ambiente bash (ad es. $PATH ) dovrebbero apparire identiche per le sessioni di accesso interattivo, non interattivo interattivo e non interattivo.

    
risposta data 31.12.2012 - 01:36
fonte
3

questo è stato molto fastidioso decommenta questa riga in config-top.h e ricompila:

/ * Definisci questo se vuoi che bash provi a controllare se è in esecuzione    sshd e sorgente il .bashrc se è così (come il comportamento di rshd). Questo controlla    per la presenza di SSH_CLIENT o SSH2_CLIENT nell'ambiente iniziale,    che può essere ingannato in determinate circostanze non comuni. * /

definisce SSH_SOURCE_BASHRC

secondo le MODIFICHE nella sorgente questo comportamento è stato modificato in bash-2.05a-rc1. ma la pagina man corrente reclama ancora il comportamento precedente:

   Bash attempts to determine when it is being run with its standard input
   connected  to a a network connection, as if by the remote shell daemon,
   usually rshd, or the secure shell daemon sshd.  If bash  determines  it
   is  being  run  in  this  fashion,  it reads and executes commands from
   ~/.bashrc, if that file exists and is readable.  It will not do this if
   invoked as sh.  The --norc option may be used to inhibit this behavior,
   and the --rcfile option may be used to force another file to  be  read,
   but  rshd  does  not  generally  invoke the shell with those options or
   allow them to be specified.
    
risposta data 17.11.2011 - 20:20
fonte

Leggi altre domande sui tag