Однолинейный sftp от терминала


91

Несколько раз в течение дня я могу запустить тест, в котором мне нужно просмотреть файл журнала на удаленном сервере. Я привык использовать свой терминал для подключения к sftpудаленному серверу и извлекать нужный файл журнала /tmpна свой локальный компьютер.

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

(что я делаю сейчас)

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

Я нашел, просматривая man sftpссылку, scpкоторой раньше не пользовался. Я чувствую, что это может быть то, что я ищу, но я не видел способа указать, куда я хотел бы поместить надежно скопированный файл.

Может ли кто-нибудь предоставить мне способ получить /dir/fileс удаленного сервера и загрузить его /tmp/file_plus-my-description?

Я надеялся, что смогу запустить команду sftp или scp, аналогичную обычной копии UNIX, например:

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

Я использую встроенную Terminalв Mac OS X 10.8. Спасибо.

Ответы:


201

Обновление сентябрь 2017 - tl; dr

Загрузите один файл с удаленного ftp-сервера на свой компьютер:

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

Загрузите один файл со своего компьютера на удаленный ftp-сервер:

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

Оригинальный ответ:

Хорошо, я чувствую себя немного глупым. Но я разобрался. У меня это почти было наверху с:

sftp user@host remoteFile localFile

Единственная документация, отображаемая в терминале, такова:

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

Однако я наткнулся на этот сайт, на котором под синопсисом показано следующее:

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[/]]]

Итак, простой ответ - вы просто делаете :после своего пользователя и размещаете удаленный файл и локальное имя файла. Невероятно просто!

Одна строка, sftp копировать удаленный файл:

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

Обновление, февраль 2016 г.

В случае, если кто-то ищет команду, которая делает обратное этому и отправляет файл с локального компьютера на удаленный сервер в одну sftp команду, пользователь @Thariama ниже опубликовал решение для этого. Совет им за дополнительный код.

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

20
я просил наоборот (скопировать на удаленный сервер), но нашел сам: sftp {user} @ {host}: {dir} <<< $ 'put {path to file}'
Thariama

2
Приношу свои извинения, неправильно понял. Я скопирую ваш ответ в ответ на случай, если он кому-то поможет в будущем. Спасибо @Thariama
Kyle

1
Для нас, TL: DR -типы, немного сбивает с толку неправильное решение в качестве первой выделенной строки :-)
skoll

1
@ Кайл, намного лучше!
skoll

1
Мне кажется странным, что sftp не включает в себя возможность загрузки файла с помощью одной команды. Это прекрасно работает, но для такой простой операции это слишком сложно. Это все еще единственное, что я могу найти, что действительно работает из коробки, так что спасибо. :)
Teekin

7

Чтобы ЗАГРУЗИТЬ отдельный файл, вам необходимо создать сценарий bash. Что-то вроде следующего должно работать в OS X, если вы sshpassустановили.

Применение:

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

Поместите этот скрипт где-нибудь на своем пути и назовите его 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

Спасибо за ответ, однако ответ, который я обозначил выше, будет использовать однострочную команду с sftp, чтобы получить файл с удаленного сервера и сохранить файл в определенном месте на вашем локальном компьютере. Я подтвердил, что он будет работать на OS X только с sftp.
Кайл

2
Да, это, безусловно, лучший ответ для передачи с удаленного на локальный. Однако я бы добавил решение для обратного: от локального к удаленному. На всякий случай кому пригодится. Благодарность!
sstur

3

sftp поддерживает командные файлы.

На странице руководства:

-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*).

Поскольку это процесс, который я выполняю несколько раз в день для разных файлов в разных местах, было бы неплохо иметь возможность просто запомнить команду, которую я мог бы ввести, в одну строку в моем терминале (который всегда открыт) и нажать Enter. Использование --batchпотребовало бы, чтобы я поместил свои команды в файл, а затем передал этот файл в качестве параметра. Я все еще играю scp, думаю, это может содержать мое решение.
Кайл

Может быть, «ожидать» - это то, что вы тогда ищете. linuxjournal.com/article/3065
synthesizerpatel

3

Или echo 'put {path to file}' | sftp {user}@{host}:{dir}, что будет работать как в unix, так и в powershell.


Этот синтаксис также работает с puttyftp (psftp). Просто подумал, что поделюсь, потому что я здесь оказался
9 Парень

1

Небольшая модификация, подобная приведенной ниже, сработала для меня, когда я использовал ее из вызова perl и system ():

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

1

Ответ SCP

OP упомянул SCP, так что вот это.

Как отмечали другие, SFTP сбивает с толку, поскольку синтаксис загрузки полностью отличается от синтаксиса загрузки . Это становится немного легче запомнить , если вы используете один и тот же вид:

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

На самом деле это все еще беспорядок, и поэтому люди до сих пор используют "устаревшие" команды, такие как SCP:

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

SCP безопасен, но устарел. В нем есть некоторые ошибки, которые никогда не будут исправлены, а именно сбой, если сервер .bash_profileвыдает сообщение. Однако с точки зрения удобства использования разработчики опередили нас на годы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.