як передавати дані на з'єднання sftp?


9

ftp підтримує put "|..." "remote-file.name"команду передавання даних на ftp-з'єднання. Чи є щось подібне для sftp?

У sftp я отримую таку помилку:

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

як вище, sftp-клієнт очевидно не виконує команду.

Я хочу використовувати команду pipe для прямого перенаправлення потоку файлів на sftp. (оскільки не вистачає місця для створення резервного файлу на тому ж диску перед завантаженням його на sftp-сервер.)


1
Я думав використовувати FIFO для цього, але ні SFTP, ні SCP не читатимуть з FIFO.
Том Андерсон

1
також гарна ідея, це моє: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Відповіді:


4

Мені було дуже цікаво розшукувати рішення цієї проблеми. Для цього потрібен інструмент nc (netcat) на обох машинах і SSH (SFTP не потрібен).

У цьому прикладі я назву машину, яка має дані, для якої потрібно створити резервну копію linux-a, і машину, якій потрібно отримати резервну копію linux-b.

У linux-a майте netcat прослуховувати порт (я взяв 2000) і перенаправляйте його у файл. Це просто сидітиме там і чекатиме, поки щось не вийде на цьому порту.

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

У linux-b відкрийте ssh-тунель для linux-a, я знову використовував порт 2000. Це дозволить перенаправити все, що ви перекинете через порт TCP 2000 з localhost на порт TCP 2000 на linux-a, де netcat слухає.

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

Тепер створіть архів tar, але надішліть вихід у stdout (використовуючи -) і передайте його в gzip для певного стиснення. Тепер передайте це іншому netcat, який надсилає його до localhost на TCP на порт 2000.

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

Були зроблені! У Linux-b netcat вже не слухається, і створюється новий файл. Найкраще те, що архів tar ніколи не розміщувався на жорсткому диску 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

Я знаю, що це не зовсім те, про що ви запитували у запитанні, але якщо у вас є netcat, це є життєздатним рішенням вашого типу проблем.

Редагувати: я забув про одне: якщо ви будете виконувати ці вказівки, у вас все одно буде тунель SSH, що плаває навколо linux-a. Дізнайтеся, що таке ідентифікатор процесу, і вбийте його.

[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
мені це подобається, але є 2 проблеми: користувачі sftponly зазвичай не можуть використовувати переадресацію портів, а користувачі sftponly не можуть отримати доступ до nc на sftp-сервері (пам’ятайте, що вони не мають ssh доступу)
JMW

1
Це цілком справедлива критика.
Кенні Расшаерт

Поза темою, але чому в цій публікації вбудований знімок екрану "Престиж"?
Ріліндо

4

Оскільки це перший результат, який ви знайдете, гуглюючи за цим питанням, і це вже не згадувалось, я додам і тут знайдене рішення:

ви можете використовувати для цього реалізацію curls sftp. Оскільки curl, ймовірно, вже встановлений у багатьох системах, це може бути віддано перевагу рішенню за допомогою спеціальних клієнтів.

Приклад використання:

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

curlвикористовує ваш .ssh/known_hostsфайл для підтвердження ключа. Це може не вдатися, якщо ваш ssh-клієнт використовує новіші стандарти шифрування, не підтримувані бібліотекою, що використовується в curl

щоб виправити це, ви можете додати інші типи ключів до відомого файлу хостів за допомогою наступної команди:

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

або ви можете відключити перевірку ключа за допомогою -kпрапора (я б не рекомендував цього)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' це варіант, якщо ваш віддалений користувач має дійсну оболонку.


5
Це НЕ sftp!
jirib

3
@JiriXichtkniha Ні, це не так, проте SFTP майже завжди реалізується як підсистема вашого SSH-сервера, і це найбільш близький аналог до функціональності, який я бачу, як запитують із запитання (передача даних через SFTP для обробки програми з іншого кінця). Іноді відповідь - Ви використовуєте неправильний інструмент - робіть thisзамість цього. - це вражає мене одним із тих часів.
voretaq7

2
sftp є протолоном і відрізняється від простого перенесення файлів через ssh, ось так! Ваша пропозиція не працює, якщо віддаленою частиною буде лише SFTP.
jirib

1
Мені заборонено входити як користувач ssh
JMW

1
@JMW у такому випадку, наскільки я знаю, ти тут досить добре накрутився - я ніколи не бачив версії sftp, яка підтримує передачу даних на команду на віддаленій системі (можливо, тому, що це переможе Sбіт ecure, пускаючи когось у ваша ситуація, яка все одно не має програм для запуску оболонки). Я можу помилитися, хоча я здебільшого знайомий з функціоналом SFTP у OpenSSH та власним SSH-сервером, який використовується для доставки ...
voretaq7

1

voretaq7 вказував, що клієнт sftp не підтримує трубопровідну передачу даних для користувачів, яким дозволено використовувати sftp лише для підключення до сервера.

на щастя, є libssh2, який підтримує sftp. тому нам просто потрібні 2 інші клієнти, що використовують libssh2, яких я зателефонував:

  • sftp_stdin_upload (для завантаження на sftp-сервер)
  • sftp_stdout_download (для завантаження з sftp-сервера)

вихідний код можна знайти за такою URL-адресою: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


оскільки я не досвідчений в програмуванні libssh2, я радий будь-якому відгуку про вихідний код.


Для мене не працює :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): невизначене посилання на символ 'EVP_sha1' / usr / lib / libcrypto. so.1.0.0: помилка додавання символів: DSO відсутній у командному рядку collection2: помилка: ld повернув 1 статус виходу
tobixen

Цей код має лише статус POC. Не соромтеся це виправити самостійно. :-)
JMW
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.