Interrompere l'accesso ssh dalla stampa di motd dal client?


44

Ho SSH impostato senza password, tuttavia stampa il MoTD quando effettua l'accesso. Esiste un modo per impedire che ciò accada dal lato client?

Ci ho provato ssh -qma non funziona. Non voglio usare ~/.hushloginné voglio cambiare la configurazione del server. L'unica cosa che può funzionare è silenziare tutto l'output, con >/dev/null 2>&1. Tuttavia, non voglio ignorare gli errori nel caso in cui ci sia effettivamente un problema. Anche fare >/dev/nullnon funziona, poiché sshsembra stampare il motd sullo stderr.

Aggiornamento e ragionamento Sto eseguendo il backup in un cron. Non desidero ricevere un'e-mail cron a meno che non si sia verificato un errore. Tuttavia, se il motivo è stampato, riceverò sempre un'e-mail.

Voglio continuare a stampare il motivo perché ciò ha implicazioni legali. Il motd dice "accesso non autorizzato vietato". Devi avere questo tipo di affermazione lì per impedire legalmente alle persone di accedervi (come un segno senza sconfinare). Quindi non voglio disabilitarlo per tutto il tempo.


1
Puoi aggiungere alcuni dettagli sul cron job ...
Kyle Brandt

1
Il motivo è stampato solo per sessioni interattive. L'ho appena provato ed è così:> $ ssh host → MOTD stampato> $ ssh host ls → stampa solo il contenuto della home directory In altre parole, stai facendo qualcosa di molto sbagliato; hai mai provato?
niXar,

Vale anche la pena notare il check-in /etc/profile.dper eventuali script che possono essere eseguiti lì e stampare alcuni output sulla console al momento dell'accesso.
Dave,

4
Esiste davvero una legge che richiede di dire "accesso non autorizzato proibito"? Pensavo che il DMCA rendesse illegale la rottura di qualsiasi tipo di sistema elettronico ( non importa quanto scarsamente protetto ), quindi fintanto che hai una sorta di requisiti di password / chiave SSH, questo sembra una pura vetrina.
Nick T,

Risposte:


58

Non sono sicuro del motivo per cui hai un'avversione per farlo correttamente, sia sul server alla volta

PrintMotd no
PrintLastLog no

e

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

O aggiungendo ~ / .hushlogin per ogni utente.

Suggerimento, per ~ / .hushlogin, aggiungilo a / etc / skel in modo che le nuove directory home dell'utente vengano create con il file.

Aggiornare:

Senza ulteriori informazioni sul processo cron di backup, il mio unico suggerimento è di reindirizzare l'output del comando su un file (o lasciare che cron lo catturi via e-mail) e l'output della sessione ssh su / dev / null. Qualcosa di simile a:

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null

O

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null

Dovrei giocare un po 'con i comandi, ma questo dovrebbe iniziare.


3
Mi piace il "fare correttamente".
Benoit,

14
Non desidero rimuoverlo dal server poiché devo mantenere un avviso di "accesso vietato" per motivi legali.
Rory,

3
In seguito, l'avviso non impedisce l'accesso non autorizzato, ma semplicemente notifica alle persone che è possibile (e si intende) intraprendere azioni legali appropriate e può monitorare il loro utilizzo, proprio come la notifica relativa alla registrazione di una conversazione telefonica.
jtimberman,

Inoltre, sarebbe di grande aiuto se hai incollato il cron job che stai utilizzando.
jtimberman,

3
.hushloginè bello
andrewtweber il

16

Se lo desideri su una base per utente, fai semplicemente un touch ~/.hushlogine sei pronto con OpenSSH.

Aggiornamento : come indicato altrove, pam_motdpuò essere configurato per non utilizzare un utente .hushlogin; controllare /etc/login.defsper HUSHLOGIN_FILE. Può essere configurato per avere tutti gli utenti elencati /etc/hushloginso simili.


2
Ci ho provato, ma non ha funzionato. Come altri hanno sottolineato, il motivo potrebbe essere stampato da pam
Rory il

11

@note Tutti gli esempi presuppongono che tu abbia impostato una variabile connectionStringcon qualcosa del genere connectionString=user@server.

Come sono arrivato alla soluzione

L'uso ssh -Tdovrebbe funzionare per semplici comandi. Ad esempio, questo non stampa alcuna informazione aggiuntiva:

ssh -T $connectionString "echo 'blah'"

Il problema è quando si tenta di utilizzare here-doc per eseguire molti comandi. Ad esempio - muggito NON funzionerà - farà eco al messaggio del giorno (MoTD) e potrebbe anche mostrarti "stdin: non è un tty".

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

Per risolvere il problema, devi prima salvare i comandi nella variabile locale e inviarli al server remoto.

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"

Ma è disordinato ...

Soluzione finale

Crea una funzione universale (nota che può prendere una stringa o HEREDOC come comandi).

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}

Esempi

Usa questo in questo modo:

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

O così:

silentSsh $connectionString "echo 'blah'"

O così:

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC

O anche così:

silentSsh $connectionString < getlines.sh

Vorrei avere più voti per questo. Molto utile per capire alcuni script over-ssh che dovevamo fare.
csexton,

Risposta fantastica !! Grazie mille!!
Scottie H,

10

Che ne dici di questo hack? ;-P

ssh -t user@machineName '/bin/bash'

Quanto segue non è valido:

Passando -Ta ssh per disabilitare l'allocazione tty:

ssh -T machineName 'echo foo'

3
ssh user @ machine 'your command here' non mostra comunque il motd (non è una shell interattiva).
Marie Fischer,

Oh bene, punto ....
Kyle Brandt,

ma cosa significa "non è una shell interattiva" da quando ho provato e posso eseguire comandi cosa mi mancherebbe usando-t
Ciasto piekarz

si noti che l'aggiunta di "-t" modifica il comportamento (viene visualizzato in base alle impostazioni TERM, aggiunge caratteri di controllo quando necessario, ecc.). Può cambiare il risultato di alcuni comandi (potrebbe ad esempio introdurre errori in: ssh -t somehost "tar cf - alcuni file"> local.tar # NON usare -t qui ... specialmente se si usa un host unix da uno di Windows, ma molti altri problemi possono sorgere in altri casi). Guarda la meravigliosa risposta di @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Olivier Dulac,

3

Che sistema operativo è questo? Su alcuni sistemi (come Ubuntu) il motd non viene stampato dal server ssh (PrintMotd in / etc / ssh / sshd_config), ma da pam con pam_motd. In questo caso, probabilmente non puoi controllarlo dal client.


non puoi controllarlo nel client ssh, ma puoi sicuramente sul lato client :) .. vedi la mia risposta per i dettagli
drAlberT

No, hai proposto un trucco piuttosto interessante / intelligente attorno al motivo in fase di stampa, non una soluzione per impedirne la stampa da parte del cliente, che era la domanda.
theotherreceive

2

Devi farlo sul server:

PrintMotd no
PrintLastLog no

Su debian / ubtuntu anche hash la linea con pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

No non lo fai. Vedi la risposta di Kyle Brandt di seguito.
Stobor,

-1 - La risposta non riflette la domanda modificata. Non più pertinente.
Romandia,

2

Non eseguire il comando ssh direttamente da cron.

Crea invece uno script di supporto bash , eseguendo il lavoro ssh e recuperando l'output, gli errori e il codice di errore, se necessario; alla fine analizzarli per rimuovere stringhe indesiderate dai messaggi di errore (il MoTD nel tuo caso) e quindi ristampare sull'output dello script bash e gli stream di errore che cosa hai ottenuto in questo modo.

Quindi metti questo script bash in cron e vivi felice :)

Nota: questa è una soluzione generale e deve funzionare qualunque sia il lavoro che devi svolgere tramite ssh. È anche solo il lato client, che dovrebbe soddisfare le tue esigenze ... l'unica dipendenza del client dalla configurazione del server è la conoscenza del messaggio esatto che vuoi tagliare dallo std err o dal client ssh


2
Questa non è una soluzione alternativa.
niXar,

Non posso essere d'accordo con te, scusa. IMHO questo è il modo in cui le cose dovrebbero essere fatte in modo pulito ... Avevo concordato con te se ci fosse stato un modo per configurare esplicitamente il client ssh per ignorare il motd, ma non può esistere, semplicemente perché non è sotto il controllo sshd !
drAlberT,

2

Solo un sidenote (sarebbe stato un commento, se potessi postarlo): i contenuti di motd vengono mostrati dopo aver effettuato correttamente l'accesso al sistema. Se mi piacerebbe legalmente impedire alle persone di accedere a una casella, preferirei farlo tramite un "Banner" in sshd_config. I contenuti vengono visualizzati dopo aver inserito il nome utente ma prima dell'autenticazione.


4
si, ma puoi disabilitare il banner usando -q sul client ssh, quindi non posso essere d'accordo con la tua nota
drAlberT

1
Oh ragazzo, posso assolutamente vederlo, "-q" sconfiggendo l'intera difesa del team legale di crack che lavora per la Dynacorp Inc. Accidenti! Non l'avevano visto arrivare. Torna coi piedi per terra. Se qualcuno che dovrebbe vedere lo stendardo lo elude intenzionalmente ... lo stendardo è ancora vincolante, dal momento che dovevi conoscerlo per evitarlo.
niXar,

2

O non hai provato quello che stai descrivendo, oppure i tuoi server sono configurati in modo errato!

Ecco cosa ho appena provato su RHEL5:

workstation ~ $ ssh root@server
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh root@server
MOTD
server ~ # ^D
workstation ~ $ ssh root@server echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

Suppongo che tu non abbia bisogno del disclaimer per essere inviato a shell non interattive, vero? (Se qualcuno ti dice di fare, fammi un favore, prendili a calci.) Perché è esattamente per questo che c'è una distinzione tra shell interattive e non interattive.

Ma in ogni caso, ecco cosa faccio perché non mi piace la posta di cron: invio l'output al logger. Basta passare attraverso la coda per rimuovere le prime (diciamo 3) righe del tuo disclaimer inutile in quanto tale (codice non testato, non ho accesso ai miei script):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job

Se guardi man sshd, vedrai che dice: PROCESSO DI LOGIN Quando un utente accede con successo, sshd procede come segue: 1. Se il login è su un tty e non è stato specificato alcun comando, stampa l'ora dell'ultimo accesso e / etc / motd (a meno che non sia impedito nel file di configurazione o da ~ / .hushlogin; vedere la sezione FILES). 2. ... Notare che se un comando viene inserito nella directory nel login ssh, non viene visualizzato
MOTD

Lo so, è quello che stavo dimostrando. Qual è il tuo punto?
niXar,

1

Se ti capisco, hai bisogno di motd per altri motivi, ma non hai bisogno di motd per il backup. Nella configurazione di sshd non è possibile configurarlo in base all'utente solo a livello globale. Pertanto è necessario risolvere la soppressione motd nel lato client. Ma non c'è differenza tra il testo di motd e i messaggi di errore del software di backup. Entrambi sono testo nel terminale. L'unica soluzione che vedo per fare la differenza tra questi due messaggi quindi filtrare quella del motd. Poiché i messaggi del software sono difficili da modificare, suggerisco di modificare il testo di motd. Ad esempio metti una cornice in giro:

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

Quindi dovresti filtrare il testo tra la cornice e rilasciarlo.


1

SOLUZIONE QUI:

Nel caso in cui non sei responsabile del server e non puoi cambiare motd o sshd config, usa il comando come segue:

Reindirizzare STDERR su STDOUT per i comandi remoti in modo da poterlo vedere. E quindi reindirizzare STDERR di ssh su / dev / null. MOTD va su STERR e finisce in / dev / null. Verrà mostrato qualsiasi messaggio di errore AND standard dal comando remoto (come va a STDOUT)

Variante 1: se ti interessa lo stato di uscita del comando eseguito in remoto:

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

Variante 2 - se si desidera ignorare il codice di uscita del comando remoto - eseguire true come ultimo comando remoto

ssh remotehost "(remote_command; true) 2>&1" 2>/dev/null || echo SSH connection failed

Esempi di messaggi di errore:

Esempio 1:

ssh remotehost " failed_ remote_command 2> & 1" 2> / dev / null || echo connessione SSH non riuscita o comando remoto restituito codice di uscita diverso da zero
 bash: failed_remote_command: comando non trovato
Connessione SSH o comando remoto non riusciti - uno dei due ha restituito un codice di uscita diverso da zero 127

Esempio 2:

ssh remotehost " failed_ remote_command 2> & 1; true " 2> / dev / null || echo connessione SSH non riuscita
 bash: failed_remote_command: comando non trovato

Esempio 3a:

ssh remotehost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo Connessione SSH non riuscita
 # non viene visualizzato alcun messaggio

Esempio 3b:

ssh nonexistinghost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo Connessione
 SSH non riuscita Connessione SSH non riuscita

0

Hai provato a rimuovere il testo nel file motd? Solo un pensiero.

Hint: /etc/motd

4
Disse dal lato client, dal lato server impostare PrintMotd su no in sshd_config sarebbe probabilmente meglio
Kyle Brandt,

0

Cosa stai cercando di fare e perché il MoTD ti dà fastidio? Sto indovinando l'esecuzione di un comando remoto e l'analisi dell'output? In tal caso, ciò potrebbe essere fatto in vari modi senza invocare una shell interattiva (che fa apparire il motd).


Oh, come? Preferirei davvero usare il pensiero ssh ..
Rory,

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.