Es posible transferir ficheros y directorios entre máquinas de forma segura - vía ssh - sin hacer uso de ningún programa adicional:
portatil@user:/tmp$ ssh europa 'tar -cvzf - /tmp/*.tex' > eutex.tar.gz tar: Eliminando la `/' inicial de los nombres /tmp/modulemaker.tex /tmp/ModuleMaker.tex /tmp/module-starter.tex /tmp/PBP.tex /tmp/Starter.texLa idea es que el comando dado como argumento a
ssh
produce como salida el contenido del fichero que nos interesa transferir.
Dicha salida es redirigida en la máquina local a un fichero.
Usaremos tar
cuando, como en el ejemplo anterior, nos interese transferir
un conjunto de ficheros y directorios.
Comprobemos que los ficheros han sido efectivamente transferidos:
portatil@user:/tmp$ tar tvzf eutex.tar.gz -rw-r--r-- casiano/casiano 9702 2009-03-05 11:49 tmp/modulemaker.tex -rw-r--r-- casiano/casiano 42178 2009-03-05 11:18 tmp/ModuleMaker.tex -rw-r--r-- casiano/casiano 3116 2009-03-05 11:39 tmp/module-starter.tex -rw-r--r-- casiano/casiano 8471 2009-03-05 11:42 tmp/PBP.tex -rw-r--r-- casiano/casiano 4418 2009-03-05 11:38 tmp/Starter.tex
El protocolo SCP implementa la transferencia de ficheros.
El cliente se conecta a la máquina remota usando SSH y solicita la ejecución
de un programa servidor (normalmente el mismo programa cliente scp
es capaz de funcionar
como servidor).
Para la subida de ficheros el cliente alimenta al servidor con los ficheros que deberán ser cargados, incluyendo opcionalmente los atributos básicos como permisos y fechas.
Para las descargas el cliente envía una solicitud indicando los ficheros y directorios que deben ser descargados.
Veamos un ejemplo:
nereida:~> scp mm.c orion:/tmp/ mm.cLa sintáxis de scp es:
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 ... [[user@]host2:]file2Es posible copiar entre dos máquinas remotas emitiendo la orden desde una tercera máquina:
portatil@user:/tmp$ scp europa:/tmp/prueba.batch nereida:/tmp/prueba.batchEs posible usar comodines (wildcards), protegiéndolos de la shell local:
portatil@user:/tmp$ scp 'europa:/tmp/*.tex' nereida:/tmp/Es posible copiar de dos máquinas remotas a una tercera:
pp2@europa:~/Lnet-parscp$ scp orion:Makefile.PL nereida:texput.log beowulf: pp2@europa:~/Lnet-parscp$ ssh beowulf ls -ltr | tail -2 -rw-r--r-- 1 casiano casiano 615 mar 26 13:56 texput.log -rw-r--r-- 1 casiano casiano 1485 mar 26 13:56 Makefile.PLHemos copiado desde la máquina orion y desde la máquina nereida diferentes ficheros. La máquina
beowulf
es la máquina de destino
a la que fueron transferidos.
La opción -r
permite copiar subdirectorios.
La opción -p
permite preservar permisos.
Un comando como este edita dos ficheros en sendos tabs:
vi -p scp://orion/AUTOMATICBACKUPCHECKOUT /home/casiano/europabackup.log
El primero es un fichero ~/AUTOMATICBACKUPCHECKOUT
en una máquina remota con nombre orion
. El segundo
es un fichero local. El editor vim
emite el comando scp
apropiado para copiar el fichero remoto en un fichero temporal.
Durantre la edición, cada vez que salve el fichero
~/AUTOMATICBACKUPCHECKOUT
de orion
, vim
tasladará la orden :w
en el comando scp
adecuado:
:!scp -q '/tmp/v611122/1' 'orion:AUTOMATICBACKUPCHECKOUT'
o bien podemos emitir una orden de edición de un nuevo fichero remoto:
:vsplit scp://casiano@some.machine.com/somefile.txt
Es incluso posible ver los contenidos de un directorio:
:tabedit scp://orion/pp2/
Entre otros, el módulo Net::SCP
permite tener una API de acceso a las funcionalidades de scp
:
pp2@nereida:~$ perl -MNet::SCP -wde 0 main::(-e:1): 0 DB<3> $scp = Net::SCP->new({ host => "machine", user => "loginname" } ) DB<4> $scp->put("hello.txt", "helloremote.txt") or die $scp->{errstr} DB<5> q pp2@nereida:~$ ssh loginname@machine ls -ltr | tail -1 -rw-r--r-- 1 loginname loginname 12 2007-03-21 12:46 helloremote.txt pp2@nereida:~$ ssh loginname@machine cat helloremote.txt hello machine