Come passare la password a scp?


297

So che non è raccomandato, ma è assolutamente possibile passare la password dell'utente a scp?

Vorrei copiare un file tramite scp come parte di un processo batch e il server di ricezione ha ovviamente bisogno di una password e, no, non posso facilmente cambiarlo in autenticazione basata su chiave.


2
Vedi anche la domanda (successiva): stackoverflow.com/questions/1462284/… dove una risposta menziona un altro modo possibile per farlo. (NB: questa non è una domanda duplicata - è l'originale che gli altri duplicano.)
Jonathan Leffler

Risposte:


35

Puoi copiarlo con uno strumento come previsto (ci sono anche utili collegamenti, come Pexpect per Python).


1
Il collegamento a explore.nist.gov è interrotto. Forse questo ?: explore.sourceforge.net
Katapofatico il

sudo apt-get install prevedono
SDsolar il

>> brew info Errore sshpass: nessuna formula disponibile con il nome "sshpass" Non aggiungeremo sshpass perché rende troppo facile per gli utenti principianti di SSH rovinare la sicurezza di SSH. ;)
Lukas NP Egger,

528

Usa sshpass :

sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path

o così la password non compare nella cronologia di bash

sshpass -f "/path/to/passwordfile" scp -r user@example.com:/some/remote/path /some/local/path

Quanto sopra copia i contenuti del percorso dall'host remoto al tuo locale.

Installa:

  • ubuntu / debian
    • apt install sshpass
  • CentOS / Fedora
    • yum install sshpass
  • mac w / macports
    • port install sshpass
  • mac w / brew
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
Su Ubuntu 12.04 ha funzionato solo con citazioni singole sulla password (ad es. "Password" anziché "password").
odedfos,

6
@odedfos, sì, è necessario utilizzare virgolette singole poiché alcuni caratteri generati da password possono avere un'interpretazione speciale nell'interpolazione di stringhe tra virgolette doppie
TerryE

7
Ecco come si installa sshpassapt-get install sshpass
Jan-Terje Sørensen,

6
Su CentOS èyum -y install sshpass
jgritty il

19
Il modo più sicuro per farlo è con un file di password , come questo: sshpass -f elenchi passwdfile` scp [...] . This way, the password won't show up in ps`, ecc. E puoi proteggere la password con i permessi dei file.
Christopher Schultz,

50

basta generare una chiave ssh come:

ssh-keygen -t rsa -C "your_email@youremail.com"

copia il contenuto ~/.ssh/id_rsa.pub e infine aggiungilo ai computer remoti~/.ssh/authorized_keys

assicurarsi che la macchina remota disponga delle autorizzazioni 0700 for ~./ssh foldere0600 for ~/.ssh/authorized_keys


35
Come ho scritto: No, non posso facilmente passare all'autenticazione basata su chiave.
Argelbargel,

3
Intendi .authorized_keys piuttosto che. authorization_keys?
HelloWorld,

2
Un uso valido per questo sarebbe uno script bash che esegue più chiamate scp / ssh a un server in cui si desidera chiedere all'utente la password per il server remoto. La password non verrà quindi mostrata nella cronologia e avrai ancora la possibilità di sfidare la password ... ma solo una volta. Non voglio usare un file chiave perché voglio ancora autenticare l'utente dello script.
Wes Grant,

2
Un altro uso valido sarebbe se non è possibile abilitare facilmente l'autenticazione basata su chiave sulla destinazione. Esempio: uno dei principali produttori di NAS - Synology con il loro DSM 6.0 - non lo supporta nemmeno nel 2016. Certo, potresti incasinare i file di configurazione e sperare che un aggiornamento non lo sovrascriva di nuovo (l'aggiornamento di DSM spesso interrompe le modifiche personalizzate ). A volte - specialmente quando l'OP scrive espressamente che sono già consapevoli che non è ottimale - le persone hanno solo bisogno di una soluzione.
Aaa,

3
Dovresti usare ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>per copiare la chiave sul server remoto
RousseauAlexandre

39

Se ci si connette al server da Windows, la versione Putty di scp ("pscp") consente di passare la password con il -pwparametro.

Questo è menzionato nella documentazione qui.


1
Mostra un esempio, per favore.
SDsolar,

Inoltre, potresti voler aggiungere C: \ Programmi (x86) \ PuTTY al tuo percorso per usare questi comandi.
SDsolar,

1
@SDsolar ecco un esempio di sintassi: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(odio usare lo stucco in questo modo, ma funziona)
geneorama

29

curl può essere usato come alternativa a scp per copiare un file e supporta una password da riga di comando.

curl --insecure --user username:password -T /path/to/sourcefile sftp://desthost/path/

È abbastanza più lento di "scp" ma fa bene il lavoro.
Victor,

Ho trovato questo per essere più veloce quando la destinazione è configurata con un enorme ritardo nella richiesta della password. scpdeve aspettare più di 30 secondi per farmi inserire una password, ma ha curlfunzionato immediatamente.
Ghost8472,

@ Ghost8472 configurato sì, ma a volte questo ritardo risolve il nome host e si verifica anche per sftp.
mckenzm,

1
Ho ottenuto "curl: (1) Protocollo" sftp "non supportato o disabilitato in libcurl"
kronuus

21

È possibile utilizzare lo script "prevede" su unix / terminal

Ad esempio, crea "test.exp":

#!/usr/bin/expect
        spawn scp  /usr/bin/file.txt root@<ServerLocation>:/home
        set pass "Your_Password"
        expect {
        password: {send "$pass\r"; exp_continue}
                  }

eseguire lo script

expect test.exp 

Spero che aiuti.


7
Prerequisito: sudo apt-get install prevedono
SDsolar il

10

Ecco un esempio di come lo fai con lo expectstrumento:

sub copyover {
    $scp=Expect->spawn("/usr/bin/scp ${srcpath}/$file $who:${destpath}
+/$file");
    $scp->expect(30,"ssword: ") || die "Never got password prompt from
+ $dest:$!\n";
    print $scp 'password' . "\n";
    $scp->expect(30,"-re",'$\s') || die "Never got prompt from parent 
+system:$!\n";
    $scp->soft_close();
    return;
}

2
Questo è in perl, mi dispiace non l'ho scritto. (5 anni fa :))
Espo,


3

È possibile utilizzare ssh-copy-idper aggiungere il tasto SSH:

$which ssh-copy-id #check whether it exists

Se esiste:

ssh-copy-id  "user@remote-system"

3

Una volta impostato ssh-keygencome spiegato sopra, puoi farlo

scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Se si desidera ridurre la digitazione ogni volta, è possibile modificare il .bash_profilefile e inserire

alias remote_scp='scp -i ~/.ssh/id_rsa /local/path/to/file remote@ip.com:/path/in/remote/server/

Quindi dal tuo terminale fai source ~/.bash_profile. Successivamente, se si digita remote_scpil terminale, è necessario eseguire il scpcomando senza password.


2
  1. assicurati di avere lo strumento "aspettati" prima, altrimenti, di farlo

    # apt-get install expect

  2. creare un file di script con il seguente contenuto. (# vi / root / scriptfile)

    spawn scp /path_from/file_name user_name_here@to_host_name:/path_to

    expect "password:"

    send put_password_here\n;

    interact

  3. eseguire il file di script con lo strumento "aspettati"

    # expect /root/scriptfile


1

Ecco un esempio simile a Linux / Python / Expect di un uomo povero basato su questo post del blog: aggiornamento di semplici shell a TTY completamente interattivi . Ne avevo bisogno per i vecchi computer in cui non è possibile installare Expect o aggiungere moduli a Python.

Codice:

(
    echo 'scp jmudd@mysite.com:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

python -c 'import pty; pty.spawn("/usr/bin/bash")'

Produzione:

scp jmudd@mysite.com:install.sh .
bash-4.2$ scp jmudd@mysite.com:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit

0

Un'alternativa sarebbe aggiungere la metà pubblica della chiave dell'utente al file delle chiavi autorizzate sul sistema di destinazione. Sul sistema da cui si avvia il trasferimento, è possibile eseguire un demone ssh-agent e aggiungere la metà privata della chiave all'agente. Il processo batch può quindi essere configurato per utilizzare l'agente per ottenere la chiave privata, anziché richiedere la password della chiave.

Questo dovrebbe essere fattibile su un sistema UNIX / Linux o su piattaforma Windows usando pageant e pscp.


4
La domanda diceva che non può usare l'autenticazione basata su chiave.
Barmar,

2
Inoltre, se fossi io, presumo di non poter modificare l'altro server: tutto ciò che voglio è copiare un file.
SDsolar,

-1

Tutte le soluzioni sopra menzionate possono funzionare solo se hai installato l'app o dovresti avere i diritti di amministratore da installare tranne o sshpass.

Ho trovato questo link molto utile per avviare semplicemente lo scp in Background.

$ nohup scp file_to_copy user@server:/path/to/copy/the/file > nohup.out 2>&1

https://charmyin.github.io/scp/2014/10/07/run-scp-in-background/


1
Come eseguendo lo scp in background inserire la password ??
Thomas.han

-3

passaggi per ottenere sshpass per rhel / centos 6:

# wget http://epel.mirror.net.in/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -ivh epel-release-6-8.noarch.rpm
# yum install sshpass

fonte: https://community.mapr.com/thread/9040


-9

Ho trovato questa risposta davvero utile qui .

rsync -r -v --progress -e ssh user@remote-system:/address/to/remote/file /home/user/

Non solo puoi passare lì la password, ma mostrerà anche la barra di avanzamento durante la copia. Davvero fantastico.


22
e come si fornisce esattamente la password qui?
infografnet,
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.