@jakuje의 대답에 대한 문제는 소켓 에서만 작동 하지만 파일 을 기대하는 사용자 표준 UNIX 도구는 사용할 수 없다는 것입니다.
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash : /tmp/sock.remote : 해당 장치 나 주소가 없습니다.
또한 로컬 소켓 파일이 원격 호스트에서 삭제되지 않는 문제가 있습니다. 다음에 동일한 명령을 실행하면 경고가 표시되고 소켓이 올바르게 다시 작성되지 않습니다. 오래된 소켓을 연결 해제하는 옵션 -o StreamLocalBindUnlink=yes
을 제공 할 수 ssh
있지만 테스트에서는 충분하지 않습니다. 또한 해당 옵션이 작동 하도록 편집해야 sshd_config
합니다 StreamLocalBindUnlink=yes
.
하지만 당신은 사용할 수 있습니다 socat
또는 netcat
또는 지원하는 다른 유사한 도구 UNIX 지역 소켓 ( netcat-traditional
이다 NOT 충분히!) 파일 전송을위한 로컬 소켓 전달을 사용 :
# start local process listening on local socket, which receives the data when ssh opens the connections and saves it to a local file
nc -l -N -U /tmp/sock.local >/tmp/file.local &
# connect to remote $HOST and pipe the remote file into the remote socket end
ssh \
-o ExitOnForwardFailure=yes \
-o StreamLocalBindUnlink=yes \
-R /tmp/sock.remote:/tmp/sock.local \
"$HOST" \
'nc -N -U /tmp/sock.remote </tmp/file.remote'
대화식 명령을 실행할 수도 있습니다.이 경우 ssh -t
TTY를 할당하는 데 사용해야합니다.
이 솔루션의 문제점은 UNIX 로컬 소켓의 경로를 하드 코딩해야한다는 것입니다. 로컬 적으로 이것은 $$
프로세스 나 사용자별로 고유 한 디렉토리로 경로에 포함시킬 수있는만큼 큰 문제는 아니지만 remote-end /tmp/
내 예제에서와 같이 world-writeable 디렉토리 를 사용하지 않는 것이 좋습니다 . ssh
세션이 시작될 때 디렉토리도 이미 존재해야합니다 . 소켓 inode는 세션이 닫힌 후에도 유지되므로 "$ HOME / .ssh. $$"와 같은 것을 사용하면 시간이 지남에 따라 죽은 inode로 디렉토리가 복잡해집니다.
또한 TCP 소켓을 바인딩하여 사용할 수 있습니다. 그러면 localhost
죽은 inode로 파일 시스템을 어지럽히 지 않아도되지만 여전히 사용하지 않는 (고유 한) 포트 번호를 선택하는 데 문제가 있습니다. 여전히 이상적이지 않습니다. ( ssh
동적으로 포트를 할당하는 코드가 있지만 원격 호스트에서 해당 정보를 검색 할 방법이 없습니다.)
아마도 파일을 복사하는 가장 쉬운 해결책은 ssh의 내장 연결 공유 기능을 사용하고 대화식 세션이 여전히 병렬로 실행되는 동안 scp
또는 sfrp
명령 을 수행하는 것 입니다. ssh를 사용하여 파일을 로컬 시스템으로 다시 복사를 참조하십시오 .
closefrom(STDERR_FILENO + 1)
OpenSSH 소스 코드 아래의 다양한 호출을 고려할 때 까다로운 소스 편집이 없을 수 있습니다. 이것을 요구하는 것은 무엇입니까?