Come SSH in una riga


26

Come mi collegherei a un altro computer tramite SSH su una linea? Se dovessi farlo ssh host@IP, mi richiederebbe di inserire la password nella seconda riga. Pensavo di poter fare qualcosa del genere:, ssh host@IP | echo passwordma questo inserisce la password prima di chiedere la password.


3
Questo tipo di pensiero viene dai tempi di Telnet e ci si aspetta, quando Internet era un posto più sicuro. La risposta di Allen è corretta, la risposta di Jakuje è tecnicamente vera ma non lo strumento per il lavoro nella maggior parte dei luoghi.
Criggie,

3
Questa è una buona domanda per impostare l'accesso senza password. Ti chiederei di rivisitare la tua risposta accettata. Quale risposta di Jakuje è corretta e funzionerà, il modo corretto di farlo è con le chiavi SSH, descritte nella risposta di Allan.
Scot,

Se sshleggesse la password da stdin, allora echo password | ssh host@IPfunzionerebbe, ma di solito SSH prova a leggere direttamente dal terminale.
Paŭlo Ebermann,

Risposte:


82

Dovresti usare le chiavi SSH per autenticarti piuttosto che inserire la tua password nella riga di comando poiché è estremamente insicura.

Il modo in cui funziona è una volta configurate le chiavi SSH, tutto ciò che devi fare è emettere il comando:

ssh user@host

e senza digitare un'altra cosa, si accederà automaticamente.


Copia la chiave pubblica SSH su Mac / FreeBSD / Linux da macOS

Ciò presuppone che tu abbia accesso al server remoto tramite autenticazione basata su password (digitando una password) e che tu abbia già generato la tua coppia di chiavi privata / pubblica (in caso contrario, vedi sotto). Nel seguente esempio, stiamo usando RSA. Per cominciare, copiamo la chiave (tenere presente che la directory "home" differisce tra macOS, Linux, BSD, ecc.):

Utilizzando SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

O semplicemente catalogando il file su authorized_keys(preferisco questo metodo):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Il nome della chiave potrebbe essere diverso) Se la directory .ssh non esiste sul server remoto, dovrai accedere e crearla.

Ora la chiave è stata copiata dal mac al server remoto . Impostare le autorizzazioni corrette per la chiave pubblica SSH sul server remoto:

chmod 600  ~/.ssh/id_rsa.pub

Quindi aggiungere la chiave al file SSH authorized_keys, se il file non esiste crearlo.

Se il file authorized_keysesiste già in ~/.sshutilizzare il seguente comando:

cat id_rsa.pub >> authorized_keys

Se il file non esiste, immettere i seguenti comandi:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Genera chiave SSH pubblica / privata su macOS

Apri il Terminale andando su Applicazioni -> Utilità -> Terminale

Nel terminale, utilizzare il comando seguente per avviare la generazione della chiave

ssh-keygen -t rsa

Successivamente ti verrà richiesto di fornire la posizione in cui desideri creare il file della chiave privata:

Inserisci il file in cui salvare la chiave ( /Users/username/.ssh/id_rsa):

Lasciare vuoto per creare la chiave nella posizione predefinita, ovvero /Users/username/.ssh/id_rsa. Il file della chiave pubblica verrà creato nella stessa posizione e con lo stesso nome, ma con l'estensione .PUB.

Dopo ti verrà richiesto di scegliere una passphrase. Questa è la password opzionale per utilizzare la chiave privata.

Enter passphrase (empty for no passphrase):

La tua chiave SSH è generata.

Ora, tieni presente che se inserisci una passphrase ti verrà richiesto di inserirlo ogni volta che ti connetti. L'utilità ssh-agentmanterrà la passphrase in memoria, riducendo la necessità di inserirla manualmente ogni volta che ci si connette mentre ci si trova nella stessa sessione. Per maggiori dettagli vediman ssh-agent


6
Assolutamente questo: le chiavi possono e devono sostituire completamente le password per qualsiasi accesso ssh su Internet. Ti suggerirei di espandere la necessità di sicurezza della chiave privata, che non è qualcosa su cui avere a che fare su tutti i tuoi computer.
Criggie,

+1 Questa è davvero una buona risposta, non solo per quello che dice, ma anche per come l'hai spiegato. Tutto ciò che è più facile da seguire per gli utenti e che li aiuta a essere più sicuri è un vantaggio nei miei libri!
Monomeeth

7
Bella risposta. Volevo solo aggiungere che ssh-copy-idè un ottimo strumento per automatizzare alcuni dei precedenti.
Scot,

Una menzione di ssh-agent potrebbe anche aiutare. La maggior parte (tutte?) Delle versioni di OS X / macOS viene fornita con esso e consente l'accesso senza password anche quando la chiave è protetta da password.
Qsigma,

1
@Scot: non fa parte di macOS per impostazione predefinita e deve essere installato tramite Homebrew o MacPorts . Non sono un fan dell'installazione di software perché le cose possono essere realizzate in 1 riga o in una breve sceneggiatura scritta da solo e per quei motivi ho pensato che fosse al di fuori dell'ambito della risposta. Tuttavia, è una piccola utilità e vale la pena menzionarla.
Allan,

13

Esistono diverse possibilità. Il tuo esempio ovviamente non funzionerà, ma puoi ottenere qualcosa di simile usando l' sshpassutilità:

sshpass -p password ssh host@IP

Nota, questo non è raccomandato perché passwordsarà visibile per altri processi o nella cronologia della shell.

Un modo molto migliore per fare lo stesso è impostare l'autenticazione senza password usando le chiavi SSH. In breve:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP

Ho provato sshpasscome mi hai consigliato, ma ha detto che il comando non è stato trovato.
Ben A.

8
Bene ... Probabilmente dovrai installarlo. E no, non lo consiglio. Imposta l'autenticazione senza password usando le chiavi ssh.
Jakuje,

4
@BenA. impostare l'autenticazione senza password definendo una tastiera pubblica / privata e configurandola su entrambe le macchine coinvolte. È molto più facile (e in realtà più sicuro) di qualsiasi password
nohillside

8
Mille volte no. sshpass è un trucco sporco usato per connettersi a dispositivi che parlano ssh ma non eseguono correttamente le chiavi e il suo uso principale sono gli script di installazione. Non useresti sshpass su una macchina multiutente ps auxw | grep sshpass dirai ad altri utenti la password ssh.
Criggie,

1
@ Criggie, non del tutto. Mentre sono al 100% indietro rispetto alla soluzione basata su chiavi, ho sshpass su un paio di Raspberry Pis solo per uso interno (per attività casuali e accessibili da client casuali; passare le chiavi solo per uso interno è una seccatura). Il funzionamento del vostro comando fornisce il seguente output: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208. Il zzzzzzzzè letterale; sshpass maschera il contenuto della password. Forse le iterazioni precedenti erano meno sensibili alla privacy.
Flith,

3

Ho passato molto tempo a cercare la risposta anche a questo. Nonostante sia insicuro e tutte queste persone ti dicano di usare le chiavi RSA ( che è un'idea più sicura e affidabile ), è del tutto possibile.

Utilizzare un programma chiamato expectper questo. Expect guarderà stdout (e penso che stderr se configurato correttamente) per te, aspettando determinati messaggi e rispondendo ad essi con output. Expect in sé è in realtà un linguaggio di scripting e quando stavo facendo la stessa cosa, ho avuto delle difficoltà a far funzionare correttamente la mia sceneggiatura a causa dei tempi. Tuttavia, aspettati include anche una comoda utility chiamata autoexpect.

Con autoexpect, ti guarderà e genererà uno script di aspettativa per te. Basta eseguire autoexpect e il comando desiderato:

autoexpect ssh host@ip 

e fai quello che faresti normalmente. Quando si esce dal programma (digitando exitla shell ssh'd), genererà lo script. Nel caso in cui non desideri che l'intero script che stai scrivendo sia in uno script prevede, puoi modificare lo script da autoexpect (chiamato script.exp) per uscire prima di digitare il exitcomando nella shell. La linea che vuoi spostare per cambiare la fine dello script è:

expect eof

il che significa aspettarsi la fine del file. Spero che sia di aiuto!


1
Nel caso in cui nessun altro lo abbia ancora detto: benvenuto per chiedere diversamente!
Synoli,

2

L'uso expectè semplicemente sbagliato per accedere a una connessione ssh per qualsiasi cosa diversa da una suite di test.

Ciò che @ ben-a sta cercando è già implementato in ssh. Il trucco è come usarlo. Quindi ecco qui:

  1. Generare una coppia di chiavi pubblica / privata usando ssh-keygen. Utilizzare ECDSA o RSA come -t(o tipo) e per RSA utilizzare 2048 o 4096 come -b(o lunghezza BITS). Questo dovrebbe bastare al momento della scrittura. Utilizzare SEMPRE una PASSWORD!
  2. Utilizzare la ssh-copy-idmetodologia o sopra menzionata per creare sul computer su cui si sta accedendo (ovvero il server) il ~/.ssh/authorized_keysfile. All'interno c'è una copia della chiave pubblica che hai appena generato.
  3. Ora sulla macchina che usi per accedere al "server" (o client) apri il file ~/.ssh/config. Se non esiste, puoi crearlo.
  4. In questo file, aggiungi quanto segue per le tue esigenze

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Ora puoi usare solo ssh <name>per impostare la connessione, ma avrà comunque bisogno della password per la tua chiave. Per risolvere questo problema, usa lo ssh-agent sviluppato e incluso per questo scopo. Per aggiungere la chiave all'agente basta usare ssh-add <path to keyfile>. Ti verrà chiesta la password e memorizzerà la chiave in modo sicuro per questa sessione. Se genera l'errore "impossibile trovare l'agente ssh" (o simile), significa che probabilmente l'agente non è stato avviato. Puoi avviarlo per questa sessione usando ssh-agent bash. Questo avvierà una nuova shell con l'agente attivo in essa.

Quando si utilizzano questi passaggi, non solo si rende più difficile per qualcuno spacciarti dirottando le proprie credenziali, ma si mantiene anche l'usabilità in ordine (è più facile da usare delle semplici password).

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.