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
HostNamee quella riga non ha errori. Un valore sbagliato lì compare nell'errore al posto dell'alias. - Sei lo stesso utente.
sudo ssh serverlegge 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 mDNSRespondere su Linux con systemd conresolvectl 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.