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

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 서버로 업로드하기 전에 동일한 디스크에 백업 파일을 생성 할 공간이 충분하지 않기 때문에)



답변

나는이 문제에 대한 해결책을 알아내는 것이 즐거웠다. 두 시스템 모두에 도구 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


답변

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

이를 위해 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플래그를 사용하여 키 확인을 비활성화 할 수 있습니다 (권장하지는 않습니다)


답변

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


답변

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 프로그래밍에 익숙하지 않기 때문에 소스 코드에 대한 의견에 기쁘다.


답변