come reindirizzare i dati alla connessione sftp?


9

ftp supporta il put "|..." "remote-file.name"comando per reindirizzare i dati a una connessione ftp. C'è qualcosa di simile disponibile per sftp?

In sftp ottengo il seguente errore:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

come sopra il client sftp non esegue ovviamente il comando.

voglio usare il comando pipe per reindirizzare direttamente il flusso di file su sftp. (perché non c'è abbastanza spazio per creare un file di backup sullo stesso disco prima di caricarlo sul server sftp.)


1
Ho pensato di usare un FIFO per questo, ma né SFTP né SCP leggeranno da un FIFO.
Tom Anderson,

1
anche una buona idea, questa è mia: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Risposte:


4

Mi sono divertito molto a trovare una soluzione a questo problema. Richiede lo strumento nc (netcat) su entrambe le macchine e SSH (SFTP non è necessario).

In questo esempio, chiamerò la macchina che ha i dati di cui è necessario eseguire il backup di linux-a e la macchina che deve ricevere il backup linux-b.

Su linux-a, ascolta netcat su una porta (ho preso 2000) e reindirizzalo su un file. Questo siederà lì e aspetterà che qualcosa accada su quella porta.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

Su linux-b, apri un tunnel ssh su linux-a, ho usato di nuovo la porta 2000. Questo reindirizzerà qualsiasi cosa lanciate dalla porta TCP 2000 su localhost alla porta TCP 2000 su linux-a, dove netcat è in ascolto.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

Ora crea l'archivio tar, ma invia l'output a stdout (usando -) e invialo a gzip per una certa compressione. Ora instradalo a un altro netcat che lo invia a localhost su TCP sulla porta 2000.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

Sono stati fatti! Su linux-b netcat non è più in ascolto e viene creato un nuovo file. La parte migliore è che l'archivio tar non è mai stato posizionato sul disco rigido di Linux-a.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

So che non è esattamente quello che hai chiesto nella domanda, ma se hai netcat disponibile, è una soluzione praticabile per il tuo tipo di problema.

Modifica: ho dimenticato una cosa: se segui queste istruzioni, avrai ancora un tunnel SSH che gira su Linux-a. Scopri qual è l'ID processo e uccidilo.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741

3
mi piace, ma ci sono 2 problemi: gli utenti sftponly di solito non possono usare il port forwarding e gli utenti sftponly non possono accedere a nc sul server sftp (ricorda che non hanno accesso ssh)
JMW

1
Questa è una critica assolutamente valida.
Kenny Rasschaert,

Fuori tema, ma perché c'è uno screenshot di "The Prestige" incorporato in questo post?
Rilindo,

4

Dato che questo è il primo risultato che trovi cercando su Google per questa domanda e non è già stato menzionato, aggiungerò anche la soluzione che ho trovato qui:

per questo puoi usare l'implementazione di curls sftp. Poiché curl è probabilmente già installato su molti sistemi, questo potrebbe essere preferito alla soluzione usando client personalizzati.

esempio di utilizzo:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curlusa il tuo .ssh/known_hostsfile per la verifica chiave. Questo potrebbe non riuscire nel caso in cui il tuo client SSH utilizzi standard di crittografia più recenti non supportati dalla libreria utilizzata in arricciatura

per risolvere questo problema puoi aggiungere gli altri tipi di chiave al file hosts noto usando il seguente comando:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

oppure puoi disabilitare la verifica dei tasti usando il -kflag (non lo consiglierei comunque)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' è un'opzione, se l'utente remoto ha una shell valida.


5
Questo NON è sftp!
jirib,

3
@JiriXichtkniha No, non lo è, tuttavia SFTP è quasi sempre implementato come sottosistema del tuo server SSH, e questo è l'analogo più vicino alla funzionalità che vedo essere richiesto dalla domanda (i dati di pipe tramite SFTP devono essere gestiti da un programma dall'altra parte). A volte la risposta è "Stai usando lo strumento sbagliato - fai thisinvece". - Questo mi sembra una di quelle volte.
voretaq7,

2
sftp è protol ed è diverso dal semplice piping tramite ssh, tutto qui! Il tuo suggerimento non funzionerebbe se la parte remota fosse solo SFTP.
jirib,

1
non posso accedere come utente ssh
JMW il

1
@JMW in quel caso, per quanto ne so che sei abbastanza fregato qui - non ho mai visto una versione di sftp che supporti il ​​piping a un comando sul sistema remoto (probabilmente perché avrebbe sconfitto il Sbit ecologico lasciando entrare qualcuno la tua situazione che non ha comunque programmi shell run). Potrei sbagliarmi però - ho principalmente familiarità con la funzionalità SFTP in OpenSSH e il server SSH proprietario usato da Sun ...
voretaq7

1

voretaq7 ha sottolineato che il client sftp non supporta il trasferimento di dati in piping per gli utenti, a cui è consentito utilizzare sftp solo per connettersi al server.

fortunatamente, c'è libssh2, che supporta sftp. quindi abbiamo solo bisogno di altri 2 client che usano libssh2, che ho chiamato:

  • sftp_stdin_upload (per caricare su un server sftp)
  • sftp_stdout_download (per scaricare da un server sftp)

il codice sorgente è disponibile al seguente URL: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


dal momento che non sono così esperto nella programmazione di libssh2, sono felice per qualsiasi feedback sul codice sorgente.


Per me non funziona :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): riferimento indefinito al simbolo 'EVP_sha1' / usr / lib / libcrypto. so.1.0.0: errore durante l'aggiunta di simboli: DSO mancante dalla riga di comando collect2: errore: restituito 1 stato di uscita
tobixen

Questo codice ha solo uno stato POC. Sentiti libero di ripararlo da solo. :-)
JMW
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.