터미널에서 단일 라인 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있습니까?

다음과 같은 일반 UNIX 복사본과 유사한 sftp 또는 scp 명령을 실행할 수 있기를 바랐습니다.

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

TerminalMac OS X 10.8에 내장 된 것을 사용하고 있습니다. 감사.

답변:


201

2017 년 9 월 업데이트-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 년 2 월 업데이트

누군가가이 명령을 반대로 수행하고 한 줄 명령으로 로컬 컴퓨터에서 원격 서버로 파일을 푸시 하는 명령을 찾고 sftp있다면 아래의 @Thariama 사용자가이를 수행하기위한 솔루션을 게시했습니다. 추가 코드에 대한 모자 팁.

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

20
다른 방법 (원격 서버에 복사)을 요청했지만 직접 찾았습니다. sftp {user} @ {host} : {dir} <<< $ 'put {path to file}'
Thariama

2
내 사과, 오해. 나중에 누군가에게 도움이 될 수있는 경우에 대비하여 답변을 답변에 복사하겠습니다. 감사합니다 @Thariama
카일

1
우리에게 TL : DR
-types

1
@Kyle, 훨씬 낫다!
skoll

1
sftp에 단일 명령으로 파일을 업로드하는 옵션이 포함되어 있지 않다는 것이 이상합니다. 이것은 잘 작동하지만 그러한 간단한 작업에는 너무 엉망입니다. 그것이 실제로 상자에서 실제로 작동하는 유일한 것이므로 감사합니다. :)
Teekin dec.

7

단일 파일을 업로드하려면 bash 스크립트를 생성해야합니다. sshpass설치 한 경우 다음과 같은 것이 OS X에서 작동합니다 .

용법:

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와 함께 한 줄 명령을 사용하여 원격 서버에서 파일을 가져 와서 로컬 컴퓨터의 특정 위치에 파일을 저장합니다. sftp만으로 OS X에서 작동하는지 확인했습니다.
Kyle

2
예, 그것은 확실히 원격에서 로컬로 전송하는 가장 좋은 대답입니다. 그러나 나는 반대로 로컬에서 원격으로 솔루션을 추가 할 것입니다. 누군가에게 도움이되는 경우를 대비하여. 감사!
sstur

3

sftp는 배치 파일을 지원합니다.

man 페이지에서 :

-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하고 있습니다. 내 솔루션이 포함되어있을 수 있습니다.
Kyle

아마도 'expect'는 당신이 찾고있는 것입니다. linuxjournal.com/article/3065
synthesizerpatel

3

또는 echo 'put {path to file}' | sftp {user}@{host}:{dir}, unix와 powershell 모두에서 작동합니다.


이 구문은 puttyftp (psftp)에서도 작동합니다. 그것이 내가 여기에 온 이유이기 때문에 공유 할 것이라고 생각했습니다
9 Guy

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가 메시지를 내 보내면 충돌이 발생합니다. 그러나 사용성 측면에서 개발자는 몇 년 앞서있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.