Сохранить вывод команды на ресурсе SFTP

Если вы квалифицируетесь как «разработчик», вы можете получить подлинный RHEL бесплатно с учетом ограничений на использование (в основном, «без использования в производственной среде»)

https://techreport.com/forums/viewtopic. php? t = 117614

ISTR была также студенческая версия RHEL, но я не уверен, существует ли она до сих пор и каково ее определение студента. Это было не бесплатно, а просто дешево.

1
30.04.2017, 22:47
2 ответа

Без причудливых монтирований gvfs или sshfs вам нужно использовать sftp-клиент. Я выбираю lftp>=4.7, потому что он работает с каналами FIFO (scp, а sftp— нет ).

Работает с bashв Linux:

tar --exclude='./somefolder' -zc. \
 | tee >(lftp -c 'connect sftp://user:pass@server/path/ ;put /dev/stdin -o sth.tar.gz;') \
 | sha256sum

В качестве альтернативы можно использовать sshклиент (внешние скобки, необходимые для интерактивной аутентификации по паролю):

(tar --exclude='./somefolder' -zc. \
 | tee >(ssh user@server "cat > /path/sth.tar.gz") \
 | sha256sum)

Заметьте, tee'sаргумент тоже выглядит немного экзотично, но это не -переносимая bashмагия, позволяющая избежать дополнительных mkfifoкоманд, объясненных вman bash:

Process Substitution

Process substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files. It takes the form of <(list) or >(list). The process list is run with its input or output connected to a FIFO or some file in /dev/fd. The name of this file is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will provide input for list. If the <(list) form is used, the file passed as an argument should be read to obtain the output of list.

2
27.01.2020, 23:24

Nautilus использует gvfsдля подключения удаленных хранилищ, таких как SFTP-сервер в вашем вопросе. Это позволяет вам обращаться с удаленным сервером так, как если бы он был частью вашей локальной файловой системы. Путь, по которому он монтируется, обычно

/run/user/<your uid>/gvfs/<server specification>/<path>

Я совершенно уверен, что префикс всегда

/run/user/<your uid>

, так что вы можете найти эту точку монтирования с помощью lsили вкладки-в этом каталоге.

Как только вы нашли эту точку монтирования, вы можете использовать teeкак обычно (с добавлением разрывов строки -для ясности):

tar --exclude='./somefolder' -zc.  \
| tee "/run/user/1000/gvfs/sftp:host=mydomain.ending/storage/location/on/server/sth.tar"  \
| sha256sum

В качестве альтернативы вы можете избежать монтирования GVFS и по-прежнему избежать замены переносимого процесса -, используя SSH вместо SFTP:

tar --exclude='./somefolder' -zc.  \
| ssh mydomain.ending 'tee "/storage/location/on/server/sth.tar"' 2>/dev/null  \
| sha256sum

К сожалению, sftpпрограмма не позволяет отправлять файлы на удаленный хост с помощью одной командной строки, а только извлекать их.

Как указывает @rudimeier, описанный выше метод sshзагружает и загружает файл, чтобы избежать его локального хранения.Если вы не хотите -повторно загружать его, может быть лучше сделать это sha256sumудаленно:

tar --exclude='./somefolder' -zc.  \
| ssh mydomain.ending 'tee "/storage/location/on/server/sth.tar" | sha256sum' 2>/dev/null
1
27.01.2020, 23:24

Теги

Похожие вопросы