Sftp jednoliniowy z terminala

91

Kilka razy w ciągu dnia mogę przeprowadzać test, w którym muszę przejrzeć plik dziennika na zdalnym serwerze. Przyzwyczaiłem się do korzystania z terminala do sftpzdalnego serwera i ściągania żądanego pliku dziennika /tmpna mój lokalny komputer.

Przeglądałem dziś opcje, których używam man sftp, próbując znaleźć sposób na uruchomienie następujących poleceń w zasadzie w jednym wierszu, aby nie musieć wpisywać polecenia, naciskać enter, wpisywać polecenia, wciskać enter itp.

(co ja teraz robię)

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

Znalazłem, przeglądając man sftpodniesienie, scpktórego wcześniej nie używałem. Wydaje mi się, że to może być to, czego szukam, ale nie widziałem sposobu, aby określić, gdzie ma się znaleźć bezpiecznie skopiowany plik.

Czy ktoś mógłby mi udostępnić sposób na uzyskanie dostępu /dir/fileze zdalnego serwera i pobranie go /tmp/file_plus-my-description?

Miałem nadzieję, że uda mi się uruchomić polecenie sftp lub scp podobne do zwykłej kopii UNIX, takiej jak:

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

Używam wbudowanego Terminalw Mac OS X 10.8. Dzięki.

Kyle
źródło

Odpowiedzi:

201

Aktualizacja wrzesień 2017 - tl; dr

Pobierz pojedynczy plik ze zdalnego serwera ftp na swój komputer:

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

Prześlij pojedynczy plik ze swojego komputera na zdalny serwer ftp:

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

Oryginalna odpowiedź:

Ok, więc czuję się trochę głupio. Ale rozgryzłem to. Prawie miałem to na górze z:

sftp user@host remoteFile localFile

Jedyna dokumentacja pokazana w terminalu to:

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

Jednak natknąłem się na tę stronę, która pokazuje następujące pod streszczeniem:

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

Tak więc prosta odpowiedź jest taka, że :po prostu wykonaj dane użytkownika i hosta, a następnie zdalny plik i lokalną nazwę pliku. Niesamowicie proste!

Pojedyncza linia, kopia zdalna sftp:

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

Zaktualizuj luty 2016 r

W przypadku, gdy ktoś szuka polecenia zrobić odwrocie tej i pchania pliku z komputera lokalnego do zdalnego serwera w jednej linii sftp polecenia, użytkownik @Thariama poniżej pisał rozwiązanie do osiągnięcia tego. Cynk kapelusza do nich za dodatkowy kod.

sftp {user}@{host}:{remote_dir} <<< $'put {local_file_path}'
Kyle
źródło
20
Pytałem na odwrót (skopiuj na zdalny serwer), ale znalazłem to sam: sftp {użytkownik} @ {host}: {dir} <<< $ 'put {ścieżka do pliku}'
Thariama,
2
Moje przeprosiny, niezrozumiane. Skopiuję twoją odpowiedź do odpowiedzi na wypadek, gdyby mogła komuś pomóc w przyszłości. Dzięki @Thariama
Kyle
1
Dla nas TL: typy DR, to trochę mylące mieć nieprawidłowe rozwiązanie jako pierwszy podświetlony wiersz :-)
skoll
1
@Kyle, znacznie lepiej!
skoll
1
Uważam za dziwne, że sftp nie zawiera opcji przesyłania pliku za pomocą jednego polecenia. To działa dobrze, ale jest zbyt hakerskie na tak prostą operację. To wciąż jedyna rzecz, jaką mogę znaleźć, która faktycznie działa po wyjęciu z pudełka, więc dzięki. :)
Teekin
7

Aby przesłać pojedynczy plik, musisz utworzyć skrypt bash. Coś takiego powinno działać na OS X, jeśli sshpasszainstalowałeś.

Stosowanie:

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

Umieść ten skrypt gdzieś na swojej ścieżce i nazwij go 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
sstur
źródło
Dziękuję za odpowiedź, jednak odpowiedź, którą wskazałem powyżej, wykorzysta polecenie jednowierszowe z sftp, aby pobrać plik ze zdalnego serwera i zapisać go w określonej lokalizacji na komputerze lokalnym. Sprawdziłem, że będzie działać na OS X tylko z sftp.
Kyle
2
Tak, to z pewnością najlepsza odpowiedź przy przenoszeniu ze zdalnego na lokalny. Jednak pomyślałem, że dodam rozwiązanie, które zrobi odwrotnie: lokalnie na zdalnie. Na wszelki wypadek, gdyby było to pomocne dla kogoś. Dzięki!
sstur
3

sftp obsługuje pliki wsadowe.

Ze strony podręcznika:

-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*).
synthesizerpatel
źródło
Ponieważ jest to proces, który wykonuję kilka razy dziennie dla różnych plików w różnych miejscach, byłoby miło móc po prostu zapamiętać polecenie, które mógłbym wpisać w jednej linii w moim terminalu (który jest zawsze otwarty) i nacisnąć Enter. Używanie --batchwymagałoby umieszczenia moich poleceń w pliku, a następnie przekazania tego pliku jako parametru. Wciąż się bawię scp, czuję, że może zawierać moje rozwiązanie.
Kyle
Może wtedy „oczekuj” jest tym, czego szukasz. linuxjournal.com/article/3065
synthesizerpatel
3

Lub echo 'put {path to file}' | sftp {user}@{host}:{dir}, który działałby zarówno w systemie UNIX, jak i PowerShell.

js2010
źródło
Ta składnia działa również z puttyftp (psftp). Pomyślałem, że podzielę się tym, ponieważ to jest powód, dla którego tu wylądowałem
9 Guy
1

Niewielka modyfikacja, jak poniżej, działała dla mnie podczas używania go z poziomu wywołania perl i system ():

sftp {user}@{host} <<< $'put {local_file_path} {remote_file_path}'
user2443447
źródło
1

Odpowiedź SCP

OP wspomniał o SCP, więc oto to.

Jak zauważyli inni, SFTP jest mylące, ponieważ składnia wysyłania jest zupełnie inna niż składnia pobierania . To staje się nieznacznie łatwiejsze do zapamiętania, jeśli użyjesz tego samego formularza:

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

W rzeczywistości jest to nadal bałagan i dlatego ludzie nadal używają „przestarzałych” poleceń, takich jak SCP:

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

SCP jest bezpieczny, ale przestarzały. Ma kilka błędów, które nigdy nie zostaną naprawione, mianowicie powoduje awarię, jeśli serwer .bash_profilewyśle ​​wiadomość. Jednak jeśli chodzi o użyteczność, twórcy byli o wiele lat do przodu.

cz
źródło