"ssh: Could not resolve hostname": cause e come risolvere

SSH non è riuscito a trasformare il nome digitato in un indirizzo IP, quindi non è stata tentata alcuna connessione e il server non c'entra. I motivi usuali sono un errore di battitura, un alias mancante in ~/.ssh/config, una porta scritta come host:22 o un problema di DNS. Esegui ssh -G name | grep '^hostname ' per vedere quale nome cerca SSH, poi prova quel nome con il resolver del tuo sistema.

Aggiornata il . Messaggi riprodotti con OpenSSH 10.3 su macOS e OpenSSH 10.0 su Debian 13, compreso un container senza rete.

Il messaggio su ogni sistema

La prima parte viene da SSH. La parte dopo i due punti viene dal resolver del tuo sistema.

ssh: Could not resolve hostname server: nodename nor servname provided, or not known

Quello è macOS. Su Linux lo stesso errore dice:

ssh: Could not resolve hostname server: Name or service not known

Linux ha anche una terza forma, comune quando la rete o il server DNS è giù:

ssh: Could not resolve hostname server: Temporary failure in name resolution

La parola tra hostname e i due punti è esattamente ciò che SSH ha provato a cercare. Leggila per prima, perché spesso mostra l'errore.

Causa 1: un errore di battitura, o un alias che SSH non vede

ssh -G server | grep -E '^(hostname|port|user) '

Stampa ciò che SSH userebbe, senza connettersi. Se ti aspettavi un alias dalla tua configurazione e hostname ripete solo ciò che hai digitato, nessun blocco Host ha corrisposto. Controlla questi punti:

  • L'alias è scritto allo stesso modo in ~/.ssh/config.
  • Il blocco ha una riga HostName e quella riga non ha errori. Un valore sbagliato lì compare nell'errore al posto dell'alias.
  • Sei lo stesso utente. sudo ssh server legge la configurazione di root, non la tua.

Come corrispondono alias e blocchi Host lo spiegano gli esempi del file ssh config.

Causa 2: la porta o un URL fanno parte del nome

SSH non legge host:port né un indirizzo web. Questi due falliscono con lo stesso errore, e l'errore mostra l'intera stringa come nome:

ssh user@example.com:22
ssh https://example.com
ssh: Could not resolve hostname example.com:22: nodename nor servname provided, or not known

Usa una di queste forme:

ssh -p 2222 user@example.com
ssh ssh://user@example.com:2222

Uno spazio di troppo dà un messaggio diverso, hostname contains invalid characters. Controlla se hai incollato spazi o interruzioni di riga.

Causa 3: DNS

Controlla il nome fuori da SSH, usando il resolver che usa SSH.

Su macOS:

dscacheutil -q host -a name example.com

Su Linux:

getent hosts example.com

Un output vuoto significa che questa macchina non riesce a risolvere il nome. Allora interroga direttamente un resolver pubblico:

dig +short example.com @1.1.1.1
  • Una risposta dal resolver pubblico ma non dal tuo sistema: la colpa è della tua configurazione DNS locale o della cache. Svuotala, su macOS con sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder e su Linux con systemd con resolvectl flush-caches, oppure cambia server DNS.
  • Nessuna risposta da nessuna parte: il record non esiste. Può essere un record nuovo non ancora propagato, uno rimosso, o un errore di battitura nella zona.

Per un nome che usi solo tu, come un computer di casa, puoi fare a meno del DNS: aggiungi una riga a /etc/hosts, oppure metti l'indirizzo nella riga HostName del tuo ~/.ssh/config.

Per lavorare mentre sistemi il DNS, connettiti tramite l'indirizzo. Tieni presente che la chiave host viene salvata per nome, quindi SSH potrebbe chiederti di confermarla di nuovo:

ssh user@203.0.113.10

Causa 4: un nome che esiste solo su una rete privata

I nomi aziendali, i nomi .internal e i nomi MagicDNS di Tailscale si risolvono solo mentre sei su quella rete. Se ieri funzionava, controlla che la VPN sia attiva e che abbia impostato il suo server DNS.

I nomi che finiscono in .local dipendono da mDNS. macOS li gestisce di serie. Su Linux di solito servono Avahi e mdns4_minimal in /etc/nsswitch.conf. Le reti Wi-Fi per ospiti spesso bloccano mDNS tra i dispositivi.

Causa 5: nessuna rete

Temporary failure in name resolution di solito significa che il sistema non è riuscito a raggiungere alcun server DNS. Controlla con un indirizzo che non richiede un nome:

ping -c 1 1.1.1.1

Su un server Linux o in un container, guarda anche /etc/resolv.conf.

Domande

Cosa significa "nodename nor servname provided, or not known"?

È il modo in cui macOS segnala una ricerca del nome fallita. SSH non ha trovato un indirizzo IP per quel nome: controlla come è scritto, l'alias in ~/.ssh/config e il DNS.

Posso scrivere la porta dopo i due punti in ssh?

No. ssh legge host:22 come parte del nome. Usa ssh -p 22 utente@host, oppure la forma ssh://utente@host:22.

Perché fallisce solo con sudo?

sudo ssh legge il ~/.ssh/config di root, non il tuo, quindi lì i tuoi alias non esistono. Esegui ssh senza sudo.

Fonti

Altro in Messaggi di errore

Tutte le guide