[unix] 터미널에서 단일 라인 SFTP

하루에 여러 번 원격 서버의 로그 파일을 살펴 봐야하는 테스트를 실행할 수 있습니다. 터미널을 사용 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에 내장 된 것을 사용하고 있습니다. 감사.



답변

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}'


답변

단일 파일을 업로드하려면 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는 배치 파일을 지원합니다.

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


답변

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


답변

perl 및 system () 호출 내에서 사용할 때 아래와 같은 사소한 수정이 저에게 효과적이었습니다.

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


답변

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


답변