¿Cómo pasar la contraseña a scp?


297

Sé que no se recomienda, pero ¿es posible pasar la contraseña del usuario a scp?

Me gustaría copiar un archivo a través de scp como parte de un trabajo por lotes y, por supuesto, el servidor receptor necesita una contraseña y, no, no puedo cambiarla fácilmente a una autenticación basada en claves.


2
Consulte también la pregunta (posterior): stackoverflow.com/questions/1462284/… donde una respuesta menciona otra posible forma de hacerlo. (NB: esta no es una pregunta duplicada, es la original que el otro duplica).
Jonathan Leffler

Respuestas:


35

Puede escribirlo con una herramienta como esperar (también hay enlaces útiles, como Pexpect para Python).


1
El enlace a expect.nist.gov está roto. ¿Quizás esto ?: expect.sourceforge.net
Katapofatico

sudo apt-get install esperar
SDsolar

>> brew info sshpass Error: No hay una fórmula disponible con el nombre "sshpass" No agregaremos sshpass porque hace que sea demasiado fácil para los usuarios novatos de SSH arruinar la seguridad de SSH. ;)
Lukas NP Egger

528

Use sshpass :

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

o así la contraseña no se muestra en el historial de bash

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

Lo anterior copia el contenido de la ruta desde el host remoto a su local.

Instalar en pc :

  • ubuntu / debian
    • apt install sshpass
  • centos / fedora
    • yum install sshpass
  • mac con macports
    • port install sshpass
  • Mac con cerveza
    • brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb

14
En Ubuntu 12.04 solo funcionó para mí con comillas simples sobre la contraseña (por ejemplo, 'contraseña' en lugar de "contraseña").
odedfos

66
@odedfos, sí, necesita usar comillas simples porque algunos caracteres generados por contraseña pueden tener una interpretación especial en la interpolación de cadenas con comillas dobles
TerryE

77
Así es como se instala sshpassapt-get install sshpass
Jan-Terje Sørensen

66
En CentOS esyum -y install sshpass
jgritty

19
La forma más segura de hacerlo es con un archivo de contraseña , como este: sshpass -f passwdfile` scp [...] . This way, the password won't show up in ps`, etc., y puede proteger la contraseña con permisos de archivo.
Christopher Schultz

50

solo genera una clave ssh como:

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

copie el contenido ~/.ssh/id_rsa.pub y, por último, agréguelo a las máquinas remotas~/.ssh/authorized_keys

asegúrese de que la máquina remota tenga los permisos 0700 for ~./ssh foldery0600 for ~/.ssh/authorized_keys


35
Como escribí: No, no puedo cambiar fácilmente a la autenticación basada en claves.
Argelbargel

3
¿Te refieres a .authorized_keys en lugar de. autorización_claves?
HelloWorld

2
Un uso válido para esto sería un script bash que realiza múltiples llamadas scp / ssh a un servidor en el que desea pedirle al usuario la contraseña del servidor remoto. La contraseña no se mostrará en el historial y todavía tienes la posibilidad de desafiarla ... pero solo una vez. No quiero usar un archivo de clave porque todavía quiero autenticar al usuario del script.
Wes Grant

2
Otro uso válido sería si no puede habilitar fácilmente la autenticación basada en claves en el destino. Ejemplo: uno de los principales productores de NAS, Synology con su DSM 6.0, no lo admite incluso en 2016. Claro, podría meterse con los archivos de configuración y esperar que una actualización no lo sobrescriba nuevamente (actualizar DSM con frecuencia rompe las modificaciones personalizadas) ) A veces, especialmente cuando el OP escribe expresamente que ya saben que no es óptimo, las personas solo necesitan una solución.
Aaa

3
Debe usar ssh-copy-id -i ~/.ssh/id_rsa.pub <remote_server>para copiar la clave en el servidor remoto
RousseauAlexandre

39

Si se está conectando al servidor desde Windows, la versión Putty de scp ("pscp") le permite pasar la contraseña con el -pwparámetro.

Esto se menciona en la documentación aquí.


1
Muestra un ejemplo, por favor.
SDsolar

Además, es posible que desee agregar C: \ Archivos de programa (x86) \ PuTTY a su ruta para usar estos comandos.
SDsolar

1
@SDsolar aquí hay un ejemplo de sintaxis: pscp -pw 'MyPa$$word' username@servername:/somedir/somefile ~/somedest(Odio usar masilla como esta, pero funciona)
geneorama

29

curl se puede usar como una alternativa a scp para copiar un archivo y admite una contraseña en la línea de comandos.

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

Es bastante más lento que 'scp' pero funciona bien.
Victor

Encontré que esto es más rápido cuando el destino está configurado con un gran retraso de solicitud de contraseña. scptiene que esperar más de 30 segundos para permitirme ingresar una contraseña, pero curlfuncionó de inmediato.
Ghost8472

@ Ghost8472 configuró sí, pero a veces este retraso está resolviendo el nombre de host, y también ocurre para sftp.
mckenzm

1
Obtuve "curl: (1) Protocolo" sftp "no admitido o deshabilitado en libcurl"
kronuus

21

Puede usar el script 'esperar' en unix / terminal

Por ejemplo, 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}
                  }

ejecuta el script

expect test.exp 

Espero que eso ayude.


77
Requisito
previo

10

Aquí hay un ejemplo de cómo lo haces con la expectherramienta:

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
Esto está en Perl, lo siento, no escribí eso. (Hace 5 años :))
Espo


3

Puede usar ssh-copy-idpara agregar la clave ssh:

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

Si existe:

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

3

Una vez que configure ssh-keygencomo se explicó anteriormente, puede hacer

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

Si desea disminuir la escritura cada vez, puede modificar su .bash_profilearchivo y poner

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

Luego desde tu terminal hazlo source ~/.bash_profile. Luego, si escribe remote_scpen su terminal, debe ejecutar el scpcomando sin contraseña.


2
  1. asegúrese de tener la herramienta "esperar" antes, si no, hágalo

    # apt-get install expect

  2. cree un archivo de script con el siguiente contenido. (# 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. ejecutar el archivo de script con la herramienta "esperar"

    # expect /root/scriptfile


1

Aquí hay un ejemplo de Linux / Python / Expect de un hombre pobre basado en esta publicación de blog: Actualización de shells simples a TTY totalmente interactivos . Necesitaba esto para máquinas viejas donde no puedo instalar Expect o agregar módulos a Python.

Código:

(
    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")'

Salida:

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

Una alternativa sería agregar la mitad pública de la clave del usuario al archivo de claves autorizadas en el sistema de destino. En el sistema desde el que está iniciando la transferencia, puede ejecutar un demonio ssh-agent y agregar la mitad privada de la clave al agente. El trabajo por lotes se puede configurar para usar el agente para obtener la clave privada, en lugar de solicitar la contraseña de la clave.

Esto debería ser posible en un sistema UNIX / Linux o en una plataforma Windows usando pageant y pscp.


44
La pregunta decía que no puede usar la autenticación basada en claves.
Barmar

2
Además, si fuera yo, supongo que no puedo alterar el otro servidor; todo lo que quiero es copiar un archivo.
SDsolar

-1

Todas las soluciones mencionadas anteriormente pueden funcionar solo si la aplicación está instalada o si debe tener los derechos de administrador para instalar, excepto o sshpass.

Encontré este enlace muy útil para simplemente iniciar el scp en segundo plano.

$ 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
¿Cómo ejecutaría el scp en segundo plano ingresar la contraseña?
thomas.han


-9

Encontré esta respuesta realmente útil aquí .

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

No solo puede pasar allí la contraseña, sino que también mostrará la barra de progreso al copiar. Realmente asombroso.


22
y ¿cómo exactamente estás proporcionando contraseña aquí?
infografnet
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.