¿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.

Argelbargel
fuente
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).

Pat Notz
fuente
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 [email protected]:/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 [email protected]:/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
KevinS
fuente
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 "[email protected]"

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

Mustafaturan
fuente
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í.

gWay
fuente
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/
MBerg
fuente
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.

Prabhjeet
fuente
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;
}
Espo
fuente
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"
Shen JI
fuente
3

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

scp -i ~/.ssh/id_rsa /local/path/to/file [email protected]:/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 [email protected]:/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.

hola15
fuente
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

Kevin Chui
fuente
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 [email protected]:./install.sh .'
    sleep 5
    echo 'scp-passwd'
    sleep 5
    echo 'exit'
) |

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

Salida:

scp [email protected]:install.sh .
bash-4.2$ scp [email protected]:install.sh .
Password: 
install.sh                                 100%   15KB 236.2KB/s   00:00    
bash-4.2$ exit
exit
JohnMudd
fuente
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.

rjray
fuente
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/

Yash
fuente
1
¿Cómo ejecutaría el scp en segundo plano ingresar la contraseña?
thomas.han
-3

pasos para obtener sshpass para 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

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

Largo
fuente
-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.

valk
fuente
22
y ¿cómo exactamente estás proporcionando contraseña aquí?
infografnet