El comando SCP con el archivo y los directorios seleccionados para descargar solicita la contraseña para cada nuevo archivo o directorio


9

En mi sistema Fedora 20 uso mucho scp, y esta es la segunda vez que me encuentro con esto, cuando ejecuto este comando:

scp -r -P PORT user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

me pide la contraseña para cada archivo / directorio que transfiere.

user@host's password: "password here"

Pregunta:

¿Que está sucediendo aquí?

¿Es esto normal, creo que este es un comportamiento muy peculiar?

Respuestas:


13

Su shell local (probablemente bash) se está expandiendo

user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4}

dentro:

user@host:/home/user/something/file1 user@host:/home/user/something/folder1 user@host:/home/user/something/folder2 user@host:/home/user/something/folder3 user@host:/home/user/something/folder4

En cambio, puedes hacer:

scp -r -P PORT user@host:"/home/user/something/file1 /home/user/something/folder1 /home/user/something/folder2 /home/user/something/folder3 /home/user/something/folder4" folder/folder2/

o, si sabe que el shell de inicio de sesión del usuario en el extremo remoto es bash, también puede usar la expansión de llaves:

scp -r -P PORT user@host:"/home/user/something/{file1,folder1,folder2,folder3,folder4}" folder/folder2/

para que el shell remoto divida la cadena en argumentos en lugar del shell local.


5

Si, es normal. Lo que sucede es que su shell expande las llaves antes de ejecutar el comando, por lo que lo que realmente está ejecutando es

scp -r -P PORT user@host:/home/user/something/file1 \ 
               user@host:/home/user/something/folder1 \ 
               user@host:/home/user/something/folder3 \ 
               user@host:/home/user/something/folder4 folder/folder2

Básicamente, scpve múltiples solicitudes de conexión, por lo que abre una nueva conexión para cada una de ellas. De una sola manoLa forma mas sencilla(usar comillas sugeridas por @geirha es más simple para una operación única) para resolver esto es configurar sin contraseña ssh/ scp:

$ ssh-keygen 
$ ssh-copy-id -p PORT user@host

Después de ejecutar esos dos comandos una vez (y responder a las indicaciones según sea necesario), podrá ssh/ scpsin usar una contraseña para todas las conexiones ssh futuras. Esto es i) realmente más seguro y ii) mucho más conveniente.


+1, buena manera (por supuesto, ssh-keygen & ssh-copy-id solo se debe hacer una vez). Yo diría que es más seguro ... solo si se asegura de que la parte privada sea "inalcanzable" por alguien que no sea ese usuario ... Lo que no siempre es fácil.
Olivier Dulac

@ OlivierDulac, ¿qué quieres decir? El id.rsatendrá 600permisos por defecto y sshno va a trabajar incluso si no lo hace. Esto significa que está a salvo de cualquier persona, pero rootnada está realmente a salvo root, ciertamente no son contraseñas.
terdon

Solo quise agregar este comentario, para que las personas que configuran un acceso sin contraseña tengan en cuenta (y asimilen) el hecho de que la clave privada debe estar en un entorno seguro e ilegible / no compartido / etc. (es decir, es una forma amable de señalar esto, ya que los que preguntan pueden no conocer todas las implicaciones que podría tener compartir / dejar que se acceda a la clave privada)
Olivier Dulac

@ OlivierDulac ah, bastante justo. No creo que valga la pena mencionarlo porque 1) ocurre automáticamente cuando se usa ssh-keygeny 2) ssh / scp se quejará y solicitará una contraseña si alguien más puede leer el archivo. Al menos en Linux de todos modos.
terdon

4

scp no es muy inteligente: cuando se le dan múltiples argumentos de línea de comando que son archivos del mismo host remoto, abre una nueva conexión para cada argumento.

Puede usar en rsynclugar de scp, es más inteligente de esta manera (y de otras maneras).

rsync -r -e 'ssh -P PORT' user@host:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/

Otro enfoque es pasar un argumento único scpque describa múltiples archivos .

Un enfoque diferente es configurar su sistema para que no tenga que autenticarse todo el tiempo. Preferiblemente, configure la autenticación de clave , que en la mayoría de los escenarios es más conveniente y más segura. Alternativamente, o además, configure el uso compartido de la conexión , de modo que solo necesite autenticarse una vez por sesión. En cualquier caso, configure un alias para que no tenga que especificar el nombre de usuario y el puerto cada vez. En su ~/.ssh/config:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

Host nick
HostName real-host-name.example.com
User bob
Port 1234

Ejecutar ssh -Nf nickpara abrir una conexión, y luego todas las conexiones posteriores se conectarán a nickla conexión existente. Ahora puedes correr

scp -r nick:/home/user/something/{file1,folder1,folder2,folder3,folder4} folder/folder2/
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.