Sftp a riga singola dal terminale


92

Diverse volte nel corso della giornata, è possibile che venga eseguito un test in cui è necessario esaminare un file di registro su un server remoto. Mi sono abituato a usare il mio terminale sftpnel server remoto e tirare il file di registro desiderato /tmpsulla mia macchina locale.

Oggi stavo esaminando le opzioni che utilizzavo man sftpnel tentativo di trovare un modo per eseguire i seguenti comandi fondamentalmente in una singola riga in modo da non dover digitare un comando, premere invio, digitare un comando premere invio, ecc.

(cosa faccio ora)

sftp myuser@myserver
--mypassword at prompt
lcd /tmp
get /dir/dir/dir/dir/file
quit

Ho trovato sfogliando man sftpun riferimento a scpcui non avevo mai usato prima. Penso che potrebbe essere quello che sto cercando, ma non ho visto un modo per specificare dove volevo che il file copiato in modo sicuro andasse.

Qualcuno potrebbe fornirmi un modo per ottenere /dir/fileda un server remoto e scaricarlo /tmp/file_plus-my-description?

Speravo di essere in grado di eseguire un comando sftp o scp simile a una normale copia di UNIX come:

scp myuser@myserver /dir/file /tmp/file_plus-my-description

Sto usando il built-in Terminalin Mac OS X 10.8. Grazie.

Risposte:


204

Aggiornamento settembre 2017 - tl; dr

Scarica un singolo file da un server ftp remoto sulla tua macchina:

sftp {user}@{host}:{remoteFileName} {localFileName}

Carica un singolo file dalla tua macchina su un server ftp remoto:

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

Risposta originale:

Ok, quindi mi sento un po 'stupido. Ma l'ho capito. L'ho quasi avuto in cima con:

sftp user@host remoteFile localFile

L'unica documentazione mostrata nel terminale è questa:

sftp [user@]host[:file ...]
sftp [user@]host[:dir[/]]

Tuttavia, mi sono imbattuto in questo sito che mostra quanto segue sotto la sinossi:

sftp [-vC1 ] [-b batchfile ] [-o ssh_option ] [-s subsystem | sftp_server ] [-B buffer_size ] [-F ssh_config ] [-P sftp_server path ] [-R num_requests ] [-S program ] host 
sftp [[user@]host[:file [file]]] 
sftp [[user@]host[:dir[/]]]

Quindi la semplice risposta è che devi solo fare :dopo il tuo utente e host, quindi il file remoto e il nome del file locale. Incredibilmente semplice!

Riga singola, copia sftp file remoto:

sftp username@hostname:remoteFileName localFileName
sftp kyle@kylesserver:/tmp/myLogFile.log /tmp/fileNameToUseLocally.log

Aggiornamento febbraio 2016

Nel caso in cui qualcuno è alla ricerca per il comando di fare il contrario di ciò e spingere un file dal computer locale a un server remoto in una sola riga sftp di comando, l'utente @Thariama sotto postato la soluzione per realizzare questo. Punta di cappello a loro per il codice extra.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'

20
stavo chiedendo il contrario (copia sul server remoto), ma l'ho trovato io stesso: sftp {user} @ {host}: {dir} <<< $ 'put {path to file}'
Thariama

2
Le mie scuse, frainteso. Copierò la tua risposta nella risposta nel caso in cui possa aiutare qualcuno in futuro. Grazie @Thariama
Kyle

1
Per noi TL: tipi DR, è un po 'confuso avere la soluzione sbagliata come prima riga evidenziata :-)
skoll

1
@ Kyle, molto meglio!
skoll

1
Trovo strano che sftp non includa un'opzione per caricare un file in un singolo comando. Funziona bene, ma è troppo complicato per un'operazione così semplice. È ancora l'unica cosa che riesco a trovare che funziona davvero fuori dagli schemi, quindi grazie. :)
Teekin

7

Per UPLOAD un singolo file, dovrai creare uno script bash. Qualcosa di simile al seguente dovrebbe funzionare su OS X se lo hai sshpassinstallato.

Utilizzo:

sftpx <password> <user@hostname> <localfile> <remotefile>

Metti questo script da qualche parte nel tuo percorso e chiamalo sftpx:

#!/bin/bash

export RND=`cat /dev/urandom | env LC_CTYPE=C tr -cd 'a-f0-9' | head -c 32`
export TMPDIR=/tmp/$RND
export FILENAME=$(basename "$4")
export DSTDIR=$(dirname "$4")

mkdir $TMPDIR
cp "$3" $TMPDIR/$FILENAME

export SSHPASS=$1
sshpass -e sftp -oBatchMode=no -b - $2 << !
   lcd $TMPDIR
   cd $DSTDIR
   put $FILENAME
   bye
!

rm $TMPDIR/$FILENAME
rmdir $TMPDIR

Grazie per la risposta, tuttavia, la risposta che ho indicato sopra utilizzerà il comando a riga singola con sftp per ottenere un file da un server remoto e salvare il file in una posizione specifica sulla tua macchina locale. Ho verificato che funzionerà su OS X con solo sftp.
Kyle

2
Sì, questa è sicuramente la migliore risposta per il trasferimento da remoto a locale. Tuttavia, ho pensato di aggiungere una soluzione per fare il contrario: da locale a remoto. Nel caso in cui sia utile a chiunque. Grazie!
sstur

3

sftp supporta i file batch.

Dalla pagina man:

-b batchfile

Batch mode reads a series of commands from an input batchfile instead of stdin.  
Since it lacks user interaction it should be used in conjunction with non-interactive
authentication.  A batchfile of `-' may be used to indicate standard input.  sftp 
will abort if any of the following commands fail: get, put, rename, ln, rm, mkdir, 
chdir, ls, lchdir, chmod, chown, chgrp, lpwd, df, symlink, and lmkdir.  Termination 
on error can be suppressed on a command by command basis by prefixing the command 
with a `-' character (for example, -rm /tmp/blah*).

Poiché questo è un processo che eseguo più volte al giorno per diversi file in luoghi diversi, sarebbe bello poter memorizzare un comando che potrei digitare su una singola riga nel mio terminale (che è sempre aperto) e premere Invio. L'utilizzo --batchmi richiederebbe di mettere i miei comandi in un file e poi di passare quel file come parametro. Ci sto ancora giocando scp, sento che potrebbe contenere la mia soluzione.
Kyle

Forse "aspettati" è quello che stai cercando allora. linuxjournal.com/article/3065
synthesizerpatel

3

Oppure echo 'put {path to file}' | sftp {user}@{host}:{dir}, che funzionerebbe sia in unix che in PowerShell.


Questa sintassi funziona anche con puttyftp (psftp). Ho solo pensato di condividerlo poiché è per questo che sono finito qui
9 Guy

1

Una piccola modifica come di seguito ha funzionato per me quando lo si utilizza da perl e system () chiama:

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'

1

Risposta SCP

L'OP ha menzionato SCP, quindi eccolo qui.

Come altri hanno sottolineato, SFTP crea confusione poiché la sintassi di caricamento è completamente diversa dalla sintassi di download . Diventa leggermente più facile da ricordare se usi la stessa forma:

echo 'put LOCALPATH REMOTEPATH' | sftp USER@HOST
echo 'get REMOTEPATH LOCALPATH' | sftp USER@HOST

In realtà, questo è ancora un disastro, ed è per questo che le persone usano ancora comandi "obsoleti" come SCP:

scp USER@HOST:REMOTEPATH LOCALPATH
scp LOCALPATH USER@HOST:REMOTEPATH

SCP è sicuro ma datato. Ha alcuni bug che non verranno mai risolti, ovvero il crash se il server .bash_profileemette un messaggio. Tuttavia, in termini di usabilità, gli sviluppatori erano anni avanti.

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.