scp non funziona ma ssh lo fa


57

Se voglio inviare qualcosa tramite scp al server:

$ scp file server:
                   _____  _____  _____
$

, quindi vengono stampate tre righe e il file non viene copiato. Tuttavia, posso collegarmi al server tramite ssh senza problemi:

$ ssh server

Come far funzionare scp?


Fornisci ulteriori informazioni come il sistema operativo, il file di configurazione ssh, ecc.
qroberts,

E quali sono queste tre righe che sono stampate?
jjlin,

Nel caso normale, quando si esegue scp file server:(presupponendo che "server" sia un nome host valido), il file viene copiato nella directory dell'account.
dan_linder

3
È possibile fornire l'output quando si esegue "scp -v file server:".
dan_linder

Potresti provare scpin una posizione diversa sul server, quindi un cpo mvdopossh
Jesse W. Collins

Risposte:


68

Una possibile causa di questo tipo di comportamento è la stampa di qualsiasi messaggio durante il processo di accesso sul server. Scp dipende da ssh per fornire un tunnel crittografato totalmente trasparente tra il client e il server.

Controlla tutti gli script di accesso sul server e prova anche a utilizzare un altro utente. Un altro metodo per identificare l'origine dell'errore è usare -v nel comando, per tracciare l'avanzamento della transazione e vedere dove fallisce. È possibile utilizzare fino a -vvv per aumentare la verbosità, se necessario. Controllare le varie forme di scp può anche essere istruttivo, come elencato nel post da InChargeOfIT.

scp, sotto il cofano, imposta un tunnel usando ssh, quindi trasferisce il file su quel tunnel, con un comando ssh all'estremità opposta per catturare il file appena viene. Ciò è illustrato dall'uso di tar e ssh per copiare una struttura di directory preservando i tempi di proprietà e creazione con i seguenti comandi:

  tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

per inviarlo, e

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

per riaverlo.


È davvero utile
maple

È possibile rilevare scp all'interno di .bashrc? In modo che sia possibile controllare e stampare l'output solo quando la shell non è SCP?
Alexandros,

L'utente deve anche essere il livello di privilegio 15. Se l'utente non è il livello di privilegio 15, ASA chiuderà la connessione dopo l'autenticazione senza alcun messaggio di errore che indica un problema di privilegio. Inoltre, solo perché il tuo utente può digitare enablee inserire una password non significa che sono privati ​​15. Se non vedi "privilegio 15" da qualche parte show run | inc USERNAME, non saranno in grado di scp.
Tyler Abair,

Ho praticamente rimosso "zsh" dal mio .bashrc sul server remoto e scp ha iniziato a funzionare!
Geek

Si interrompe anche se si modifica la variabile SHELL (es. export SHELL=/bin/zsh) In ~/.bashrc. Questo viene talvolta utilizzato in assenza di chsh.
Suuuehgi,

58

Controllare il .bashrc dell'utente di destinazione o un file equivalente. ~ / .bashrc proviene da accessi non interattivi. Se c'è un'eco o un comando che emette qualcosa, si romperà il protocollo SCP.


10
EUREKA! Questo era il mio problema perché avevo una fortuna | cowsay su ogni accesso nel mio .bashrc remoto. Ora funziona perfettamente.
Thomas Browne,

3
Signore, salvavita. :)
Gaurav Manchanda,

4
Se vuoi ancora il tuo fortune | cowsay, inseriscilo in .bash_profile. Questo è solo per accessi interattivi e non deve essere fornito durante la sessione SCP.
spoulson,

Il mio problema era che cercavo un altro file nel mio .bashrc, che non esisterebbe sull'altro computer. Puoi usare la logica in questa risposta per saltare ~/.bashrcquando non interattivo (che è il caso scp).
Wisbucky,

15

Modifica: sei sicuro di entrare in un percorso valido nel comando scp? Per esempio:

scp test.txt username@remoteserver.com

fallirà (infatti, stamperà semplicemente il comando come stai vedendo). In questo caso, dovrai fornire un percorso valido al server remoto. Ad es.scp test.txt username@remoteserver.com:~/

Esempi di utilizzo:

Invia un file:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

Ottieni un file:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

Esempi:

Invia un file dal mio desktop alla mia cartella principale su un server remoto:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

Ricorda che ~è una scorciatoia per la tua directory home ... ad es., / Home /

Invia un file al webroot:

scp ~/Documents/working/index.html john_doe@johndoe.com:/var/www/index.html

In questo esempio, l'utente john_doe avrebbe bisogno dei privilegi di scrittura sulla directory remota / var / www.


2
non stai rispondendo alla domanda. la riga di comando fornita da OP sembra abbastanza buona, la parte interessante è che ------... nessuno dei tuoi esempi si riferisce a questo.
Akira,

@akira forse, forse no. Se non si forniscono percorsi validi, il comando scp non funzionerà. Ad esempio, scp somefile user@host.com:inoltre, non disporre delle autorizzazioni corrette per la directory remota potrebbe causare problemi. Modificata la mia risposta per renderla un po 'più chiara
InChargeOfIT

1
nessuno dei tuoi esempi copre "il file non esiste", nessuno dei tuoi esempi copre "permessi errati sul lato server" ...
Akira

4

Su alcuni host hanno erroneamente origine .bash_profileaccessi non interattivi come scp. I messaggi che vengono stampati sul terminale potrebbero scpnon funzionare correttamente. Se hai messaggi nel tuo .bash_profilequesto può essere la causa.

Per visualizzare ancora i tuoi messaggi di accesso, banner, ecc. Sugli accessi interattivi e poter comunque utilizzare scptramite un accesso non interattivo, aggiungi quanto segue prima di qualsiasi messaggio che verrebbe stampato nel tuo .bash_profilefile.

# ********** If not running interactively, don't do anything more! ***********

[ -z "$PS1" ] && return

Il codice alternativo è:

[[ $- == *i* ]] || return

E un altro codice alternativo:

case $- in
    *i*) ;;
      *) return;;
esac

Che credo sia la versione più lunga del primo codice alternativo. Ho trovato su alcuni host il primo codice non funziona correttamente ma il secondo funziona.

Durante un login scp non interattivo interromperà l'ulteriore esecuzione di .bash_profile e consentirà a scp di funzionare, ma mostrerà i tuoi messaggi di login quando accedi tramite ssh.

Nota: questo può essere utilizzato anche nel tuo .bashrcfile se lo provieni da .bash_profile(per $ PATH), quindi solo una parte di esso proviene da accessi non interattivi.


grazie funziona come un fascino ........
qualcosa di

0

Questo non risponde direttamente alla domanda, ma potrebbe essere utile per persone come me, alla ricerca di una soluzione con un blocco SCP durante il trasferimento di file tra 2 host remoti.

Se si scpblocca a causa dei messaggi di ssh, potrebbe essere d'aiuto sorprenderli:

scp -o "StrictHostKeyChecking no"

e / o

scp -B

Dall'uomo scp:

-B Seleziona la modalità batch (impedisce di richiedere password o passphrase).

-o ssh_option Può essere usato per passare le opzioni a ssh nel formato usato in non c'è un flag separato da riga di comando scp. Per i dettagli completi delle opzioni elencate di seguito e i loro possibili valori, vedere ssh_config (5).

Nel mio caso ciò sembrava aiutare, ma non ha risolto l'intero problema. Non siamo riusciti a scoprire perché scp si blocca durante il trasferimento da remoto a remoto. È appeso nel mezzo del file. 9 volte ha funzionato, il tentativo numero 10 no. Abbiamo sospettato che potrebbe bloccarsi quando la nostra connessione VPN subisce un picco di traffico per un momento e quindi SCP non si ripristina. Si blocca davvero per sempre e non dà nemmeno un messaggio di errore.

Tuttavia, ho rinunciato e sono passato a sftp. Questo è ragionevolmente più veloce, poiché utilizza una connessione diretta tra gli host remoti. Devi abilitare

Host example.com
    AgentForward yes

nel file ~ / .shh / config della macchina che esegue lo script però. Ovviamente questa è una soluzione solo se le macchine remote sono entrambe all'interno della tua rete fidata.


0

Ho chiamato exec /bin/bashin .cshrc.

Rimuovendo questo risolto il problema per me.

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.