Однолінійний sftp від терміналу


91

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

Сьогодні я переглядав варіанти, man sftpнамагаючись з’ясувати спосіб запуску наступних команд в основному в одному рядку, щоб мені не потрібно було вводити команду, натискати клавішу Enter, друкувати команду Натискати клавішу Enter тощо.

(що я роблю зараз)

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
@Kyle, набагато краще!
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.
Kyle

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

ОП згадала 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.