데이터를 sftp 연결로 파이프하는 방법?


9

ftp는 put "|..." "remote-file.name"데이터를 ftp 연결로 파이프 하는 명령을 지원합니다 . sftp와 비슷한 기능이 있습니까?

sftp에서 다음과 같은 오류가 발생합니다.

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

위의 sftp 클라이언트는 분명히 명령을 실행하지 않습니다.

pipe 명령을 사용하여 파일 스트림을 sftp로 직접 리디렉션하고 싶습니다. (sftp 서버로 업로드하기 전에 동일한 디스크에 백업 파일을 생성 할 공간이 충분하지 않기 때문에)


1
나는 이것을 위해 FIFO를 사용하려고 생각했지만 SFTP 나 SCP는 FIFO에서 읽을 수 없습니다.
Tom Anderson

1
또한 좋은 생각입니다, 이것은 내 것입니다 : qxs.ch/2012/07/05/sftp-upload-tool
JMW

답변:


4

나는이 문제에 대한 해결책을 알아내는 것이 즐거웠다. 두 시스템 모두에 도구 nc (netcat)와 SSH가 필요합니다 (SFTP는 필요하지 않음).

이 예에서는 linux-a를 백업해야하는 데이터가있는 머신과 linux-b 백업을 수신해야하는 머신을 호출합니다.

Linux-a에서 netcat이 포트에서 수신 대기하도록하고 (2000 년 소요) 파일로 리디렉션합니다. 이것은 거기에 앉아서 그 포트에서 무언가가 나올 때까지 기다립니다.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

linux-b에서 linux-a에 대한 ssh 터널을 열고 포트 2000을 다시 사용했습니다. 그러면 netcat이 수신하는 linux-a의 localhost에서 TCP 포트 2000에 던지는 모든 것을 리디렉션합니다.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

이제 tar 아카이브를 작성하되 출력을 stdout (-를 사용하여)으로 보내고 압축을 위해 gzip으로 파이프하십시오. 이제이를 포트 2000의 TCP에서 localhost로 보내는 다른 netcat으로 파이프하십시오.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

끝났습니다! linux-b에서 netcat은 더 이상 청취하지 않으며 새 파일이 작성됩니다. 가장 좋은 점은 tar 아카이브가 linux-a의 하드 디스크에 배치되지 않았다는 것입니다.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

나는 그것이 당신이 질문에서 정확히 요구 한 것이 아니라는 것을 알고 있지만 netcat을 사용할 수 있다면 문제의 유형에 대한 실용적인 해결책입니다.

편집 : 한 가지를 잊어 버렸습니다.이 지침을 따르면 여전히 Linux-a에 SSH 터널이 떠 있습니다. 프로세스 ID가 무엇인지 찾아서 종료하십시오.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741

3
나는 그것을 좋아하지만 두 가지 문제가 있습니다 : sftponly 사용자는 일반적으로 포트 전달을 사용할 수 없으며 sftponly 사용자는 sftp 서버에서 nc에 액세스 할 수 없습니다 (ssh 액세스 권한이 없음을 기억하십시오)
JMW

1
그것은 전적으로 유효한 비판입니다.
Kenny Rasschaert

주제를 벗어난 주제인데 왜이 게시물에 포함 된 "The Prestige"의 스크린 샷이 있습니까?
Rilindo

4

이것이이 질문에 대한 인터넷 검색에서 찾은 첫 번째 결과이므로 이미 언급되지 않았으므로 여기에서 찾은 솔루션을 추가 할 것입니다.

이를 위해 curls sftp 구현을 사용할 수 있습니다. curl은 이미 많은 시스템에 설치되어 있으므로 사용자 지정 클라이언트를 사용하는 솔루션보다 선호 될 수 있습니다.

사용법 예 :

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curl.ssh/known_hosts파일을 키 확인에 사용합니다 . ssh 클라이언트가 curl에 사용 된 라이브러리에서 지원하지 않는 최신 암호화 표준을 사용하는 경우 실패 할 수 있습니다.

이 문제를 해결하려면 다음 명령을 사용하여 알려진 키 파일에 다른 키 유형을 추가 할 수 있습니다.

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

또는 -k플래그를 사용하여 키 확인을 비활성화 할 수 있습니다 (권장하지는 않습니다)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' 원격 사용자에게 유효한 쉘이있는 경우 옵션입니다.


5
이것은 sftp 가 아닙니다 !
jirib

3
@JiriXichtkniha 아니요. 그렇지 않지만 SFTP는 거의 항상 SSH 서버의 하위 시스템으로 구현되며 이것은 질문에서 요청한 기능과 가장 가까운 아날로그입니다 (SFTP를 통한 파이프 데이터는 프로그램에서 처리합니다) 다른 쪽 끝에). 때때로 대답은 "잘못된 도구를 사용하고 this있습니다. 대신에"입니다. -이것은 그 때의 하나로서 나를 때린다.
voretaq7

2
sftp는 protol이며 ssh를 통한 파이핑과는 다릅니다. 원격 부품이 SFTP 일 경우 제안이 작동하지 않습니다.
jirib

1
ssh 사용자로 로그인 할 수 없습니다
JMW

1
이 경우 @JMW 당신이 여기에 잘 고정되어 있다는 것을 아는 한, 원격 시스템의 명령에 파이핑을 지원하는 sftp 버전을 본 적이 없습니다 S. 어쨌든 쉘 실행 프로그램이없는 상황). 나는 틀렸을 수도있다-나는 OpenSSH의 SFTP 기능과 썬이 제공 한 독점 SSH 서버에 대해 잘 알고있다.
voretaq7

1

voretaq7 은 sftp 클라이언트는 사용자를 위해 파이프 데이터 전송을 지원하지 않으며 sftp 만 사용하여 서버에 연결할 수 있다고 지적했습니다.

다행히 sftp를 지원하는 libssh2가 있습니다. 그래서 우리는 libssh2를 사용하는 2 명의 다른 클라이언트가 필요합니다.

  • sftp_stdin_upload (sftp 서버에 업로드)
  • sftp_stdout_download (sftp 서버에서 다운로드)

소스 코드는 다음 URL에서 찾을 수 있습니다. http://www.qxs.ch/2012/07/05/sftp-upload-tool/


나는 libssh2 프로그래밍에 익숙하지 않기 때문에 소스 코드에 대한 의견에 기쁘다.


나를 위해 작동하지 않습니다 :-( / usr / bin / ld : libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o) : 'EVP_sha1'/ usr / lib / libcrypto 기호에 대한 정의되지 않은 참조. so.1.0.0 : 오류 문자를 추가 : DSO는 명령 줄 collect2에서 누락 : 오류 : 신분증 1 개 종료 상태를 반환
tobixen

이 코드는 POC 상태입니다. 혼자서 고치십시오. :-)
JMW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.