Spingendo il mio prompt di PS1 su ssh


19

Uso un prompt "PS1" specifico che mi piace. Condivido alcuni accessi con altre persone su alcuni server diversi. Mi chiedevo se c'era un modo per specificare nel mio profilo bash locale un prompt remoto, o in altro modo se non quello di copiare e incollare ogni volta che mi collegavo.

Risposte:


17

Carica un file su ogni macchina remota, ad esempio ~/.my_custom_bashrc, con la tua bashconfigurazione personalizzata (in questo caso PS1=...), quindi avvialo sshcon:

ssh user@host -t "bash --rcfile ~/.my_custom_bashrc -i"

È possibile utilizzare facilmente una bashfunzione come wrapper per la leggibilità.


10

Se vuoi solo inviare la PS1variabile e non contiene una '(virgoletta singola), prova:

ssh targethost -t "PS1='$PS1'; exec bash"

Il locale .bashrcpotrebbe benissimo sovrascrivere PS1(grazie a Dennis Williamson per averlo sottolineato).

Esistono modi per trasmettere variabili di ambiente su ssh , ma in genere sono disabilitate nella configurazione del server. Se la PermitUserEnvironmentdirettiva è abilitata nella configurazione del server e ogni utente ha la propria coppia di chiavi (sì, potresti non essere così fortunato), puoi aggiungere environment="PS1=…"alla riga ~/.ssh/authorized_keyscorrispondente alla tua chiave.

Se desideri mantenere la tua configurazione su un account utente condiviso, puoi creare la tua directory del file di configurazione e impostare la HOMEvariabile di ambiente in modo che punti a quella directory.

ssh targethost mkdir mrstatic.home
scp .bashrc targethost:mrstatic.home/

Creare collegamenti simbolici nella mrstatic.homedirectory che punta alla voce corrispondente nella directory principale quando si desidera condividere un file con gli altri utenti.

Quindi, accedi con

ssh targethost -t 'HOME=~/mrstatic.home; exec bash'`

Se sei disposto a modificare il telecomando .profile(o altro file di inizializzazione), probabilmente puoi automatizzare le tue impostazioni. Molti siti consentono LC_*le variabili di ambiente (normalmente vengono utilizzate per le impostazioni locali). Se entrambe queste condizioni sono soddisfatte, è possibile impostare una variabile che non viene effettivamente utilizzata per le versioni locali, ad esempio LC_USERsul lato client, e testarla sul server .profile.

(Naturalmente gli account condivisi sono una cattiva idea, ma mi rendo conto che potresti non essere in grado di cambiare quella situazione.)


3
ssh -t user@host "remote='$PS1' bash -i"

Quindi, al prompt:

PS1=$remote

1
È probabile che un sofisticato prompt di bash si interrompa se non viene citato (proveniente da te, sono sorpreso). E perché il comando extra, e non solo "PS1='$PS1' bash -i"(e perché no exec, anche)?
Gilles 'SO- smetti di essere malvagio' l'

1
@Gilles: citazione mancante: sciatteria. Comando extra: non sarebbe inusuale PS1essere sovrascritto durante l'avvio della shell. No exec: durante i test sul mio sistema non sembrava fare alcuna differenza - nessun processo aggiuntivo.
In pausa fino a nuovo avviso.

1
Oh, sì, è un buon punto, .bashrcè probabile che il locale sovrascriva PS1.
Gilles 'SO- smetti di essere malvagio' il

2

Inserisci il tuo prompt di PS1 in ~ / .ssh / environment e la sessione ssh lo porterà a tutti gli host a cui accedi. Funziona per me con openssh 4.3p2.


1
Funziona solo se la configurazione del server è abilitata PermitUserEnvironment, che è disattivata per impostazione predefinita.
Flimm,

1

puoi specificare le variabili di ambiente sul lato client e se lo ssh-server lo consente (controlla man sshd-config), queste variabili vengono copiate nella sessione quando accedi al computer.

quindi, dovresti configurare .bashrc sul server per controllare una PS1 esistente (o qualunque altra variabile) e impostare PS1 solo se non è già impostata.

oppure, il che semplifica le cose, raggruppate le vostre impostazioni in una funzione .. e distribuite quella funzione come un file speciale il vostro sorgente on demand ( source joes_bashrc) o direttamente nel .bashrc. avere il tuo file sembra un po 'più robusto. le altre persone potrebbero usare le tue impostazioni ma non sono obbligate a farlo.


1

Non condividere accessi. SSH come te stesso, quindi fai sudo -su shareduser( -ssignifica "shell").

Fai sudomantenere la vostra directory home:

Defaults env_keep += "HOME"

Quando sarò promosso cercherò di attuare quella politica, ma per ora sono bloccato con questo.
Noce non finanziata

1

Se vuoi farlo senza aver bisogno di un extra SCP puoi fare qualcosa del genere:

ssh -t srvname ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'

Ciò genererà un .bashrc.n basato sul server bashrc ma con le tue sostituzioni.


Questo è il motivo per cui alcune persone hanno paura dei terminali.

0

Se siete disposti a inserirsi impercettibilmente sui vostri colleghi, e ci si può fidare loro di non interferire con la vostra preferenza, allora vi consiglio una combinazione di risposta di Ciro , risposta di Akira e la risposta di Dennis Williamson .

  1. Su ciascun server, modifica ~/.bashrce aggiungi
    if ["$ Unf" = 1] # Codice speciale per Unfundednut
    poi
        PS1 = " (il prompt desiderato) "
         (qualsiasi altra personalizzazione desiderata) 
    fi
    alla fine. Mentre i tuoi colleghi "non gradirebbero [tu] scrivere sul profilo di base", non ne saranno consapevoli a meno che non vadano a cercarlo.
  2. Quando si accede a un server remoto, fare
    ssh -t user @ host "Unf = 1 bash -i"
    Anche se probabilmente vorrai metterlo in una funzione alias o shell nel tuo account locale, è abbastanza breve - più breve di qualsiasi altra risposta - che puoi semplicemente digitarlo manualmente.

Credo che questo sia abbastanza chiaro, ma: il sshcomando fa sì che la Unfvariabile venga impostata sul server remoto quando ci si collega. Ciò invocherà il tuo codice nel telecomando .bashrc, che renderà effettive le tue personalizzazioni. Poiché hai inserito il tuo codice alla fine di .bashrc, sovrascriverà le impostazioni generali precedentemente nel file.

Divulgazione: non l'ho testato.


-1

Il modo più semplice è IMHO:

ssh user@server 'PROMPT_COMMAND=export PS1="changeme $" bash -li;'

Non sono sicuro che funzioni; sembra che manchi uno strato di virgolette. Anche se lo fosse, l'impostazione PROMPT_COMMAND(che viene eseguita ogni volta che la shell emette un prompt) sembra essere un modo molto pesante per risolvere questo problema. E, dato che è in qualche modo arcano, ogni risposta che suggerisce che dovrebbe davvero avere una spiegazione di come funziona.
Scott

-2

Potresti fare cose come montare la tua casa su sshfs / nfs, ma la soluzione più semplice è quella di trasferire il tuo bashrc alla nuova macchina. Questo porta anche alias e cose.


Come ho affermato nella mia domanda, condivido questi accessi con altre persone. Sono abbastanza sicuro che non mi apprezzerebbero se scrivo sul profilo di base.
Nofundednut,

1
Montare $ HOME su NFS è folle. Sto solo dicendo.
Wesley Rice,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.