Come eseguire automaticamente i comandi sul login SSH?


13

Ogni volta che accedo al mio server Linux vorrei avere diversi comandi eseguiti automaticamente (impostare alcune variabili, cambiare posizione, ecc.)

Questo deve essere fatto al login dell'utente, non all'avvio del sistema.

Come posso impostarlo per farlo?


Devi leggere la sezione INVOCAZIONE in bash (1) ( man bash).
Andrew Schulman,

Risposte:


27

Inserisci i comandi ~/.bashrc. Tutto ciò che viene eseguito viene eseguito ogni volta che accedi.

Se è necessario eseguire comandi solo quando si accede tramite ssh (ma non quando si accede fisicamente), è possibile verificare la presenza della SSH_CONNECTIONvariabile di ambiente ed eseguire i comandi solo se si trova che esiste.


Non eseguo l'accesso come root, è un server AWS, quindi devo accedere come "ec2-user", quindi passare a root usando "sudo su -". Quindi dovrei mettere i comandi in "/home/ec2-user/.bashrc"?

5
Ciò presuppone che ~ / .bashrc provenga dal proprio ~ / .bash_profile. ~ / .bash_profile sarà lo script che viene invocato per una shell di login come ssh. Credo che ~ / .bashrc verrà chiamato se apri un Terminale Gnome, ad esempio, DOPO aver già effettuato l'accesso.
Dgrant

Mi hai confuso, lasciami spiegare di più: questa è un'istanza di Amazon Web Services, che è praticamente un server, quindi nessuno accederà mai fisicamente (non sono nemmeno sicuro che esista fisicamente come una macchina). Accedo usando PUTTY con il nome utente ec2. Questo mi porta nella directory / home / ec2-user. Poi cambio utente root digitando "sudo su -", che poi mi lascia cadere in "/ root", quindi devo digitare una serie di comandi, incluso cambiarmi in "/ home / ec2-user" e impostare alcuni variabili, alias, ecc. Quindi ... come potrei farlo per farlo?

Inoltre, poiché sto cambiando utente, mi aspetto che nel profilo bash dell'utente ec2 dovrei inserire solo "sudo su -", e quindi il resto dei comandi nel file bash root?

NOTA: in realtà, è .profile che viene chiamato se esiste, a meno che non esista .bash_profile, viene invece chiamato.
Dgrant

11

Basta inserirlo in ~ / .bashrc o /etc/bash.bashrc se lo si desidera per tutti gli utenti:

if [[ -n $SSH_CONNECTION ]] ; then
    echo "I'm logged in remotely"
fi

e come posso perdere la sessione dopo aver chiuso l'esecuzione?
e-info128,

1
@WHK Cosa intendi con perdita della sessione?
Llamageddon,

@Llamageddon: penso che si stia chiedendo la stessa cosa che sono. Se volessi mettere tutta la mia sessione SSH in screen, potrei usare la tua risposta e inserirla al screenposto dell'eco. Il problema è che terminando la sessione dello schermo tornerà al prompt SSH invece di disconnettersi. Basta scrivere questo commento mi ha dato la risposta, però: aggiungere il logoutcomando dopo il screencomando.
zondo,

Questo tuttavia non funziona per la sessione ssh che non usa bash, ad esempio quando apro una sessione sftp.
Fabio,

@zondo @ e-info128 exec commandsostituirà la shell corrente con qualunque cosa tu esegua.
Llamageddon,

3

In alternativa, è possibile specificare un comando da eseguire durante l'invocazione di ssh:

$ ssh -t server 'cmd; exec bash -l'

L'ultimo comando nell'elenco dovrebbe iniziare una sessione interattiva nella shell preferita. Se hai molti comandi da eseguire, considera la possibilità di creare un file di script sul tuo server SSH.


1
Questo è molto utile. Non sono sicuro che sia esattamente la risposta che l'interrogante ha chiesto, ma la gente dovrebbe saperlo, dal momento che potrebbe non essere ovvio. Ad esempio "ssh user @ host" export x = 5; bash "Quindi nel terminale che compare echo $ x visualizza 5.
cancella il

2

In realtà ~/.ssh/rcè il posto giusto per aggiungere un comando

 ~/.ssh/rc
         Commands in this file are executed by ssh when the user logs in,
         just before the user’s shell (or command) is started.  See the
         sshd(8) manual page for more information.

Non necessariamente. È una posizione in cui è possibile inserire comandi.
Daniel B,


Ciò potrebbe VERAMENTE mettere qualcuno nei guai se non sapessero cosa stanno facendo. È potenzialmente utile in casi angolari, ma ciò potrebbe davvero rovinare qualcuno se si dimenticava di inserire comandi lì o il nome e il percorso di quel file. Generalmente sarebbe altamente preferito mettere i comandi di accesso all'avvio nella posizione prevista, .bashrc sul lato remoto e testare $ SSH_CONNECTION, come suggerito da altre risposte qui.
chiarimento

0

Per prima cosa eseguire .bashrc sull'host remoto, quindi eseguire i comandi passati sulla riga di comando (che sarà in grado di utilizzare gli alias e le funzioni definite in .bashrc sull'host remoto), quindi lasciarti su un prompt di bash (supponendo che i comandi che esegui tornano al prompt):

$ ssh user@host "bash -lc cmd; cmd; ..."

-l opzione lo rende una shell di login (es. esegui .bashrc)

-c opzione fornisce l'esecuzione del comando esplicito bash

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.