우리는 의도적으로 다음 스위치를 사용하여 OpenSSH를 구축합니다: --with-default-path
공백. 서버에 바이너리가 포함되지 않도록 OpenSSH를 배포하려고 합니다 scp
.
scp
이제 로컬 컴퓨터(클라이언트)에서 원격 컴퓨터(서버)로 이동 하려고 하면 다음 메시지가 나타납니다.
scp 명령을 찾을 수 없습니다
서버는 scp
바이너리가 양쪽(클라이언트와 서버)에 존재할 것으로 예상하는 것 같습니다. 그렇다면 scp
원격 측 바이너리가 왜 필요한가요 ? 그냥 로컬 머신(클라이언트)에 올려놓는 것만으로는 충분하지 않나요? 누군가 이것을 명확히 할 수 있습니까?
노트:scp
복사하려는 일부 파일이 원격 서버에 없으면 원격(서버)에서 다음과 같은 오류가 발생합니다 .
scp 명령을 찾을 수 없습니다
답변1
scp
나는 당신이 당신의 질문에 대답했다고 생각합니다. 양쪽이 모두 필요합니다.
로컬 인스턴스는 원격 scp
호출의 문서화되지 않은 플래그를 사용하여 파일 전송 프로토콜을 처리합니다.scp
-t
실제로는 그렇지 않지만 서버가 scp
있는 경우 이를 사용하여 파일을 전송할 수 있습니다. 대부분의 경우 SFTP 서버 구성 요소가 서버에 내장되어 있기 때문입니다.ssh
sftp
ssh
답변2
총 길이 DR
SSH 프로토콜은 파일 복사가 하나인 여러 개의 겹치는 "서비스"를 용이하게 합니다. SSH 프로토콜이 이를 수행하는 방식은 클라이언트가 scp -t
명령줄 도구를 사용하여 서버에 연결할 때 서버에서 하위 프로세스로 시작된다는 것입니다.scp
SSH가 설치된 모든 서버에는 SSH의 모든 "서비스"( ssh
, scp
, sftp
)를 제공하기 위한 완전한 CLI 도구가 필요합니다. 디스크의 이 위치는 관리 서버 데몬에만 필요합니다 sshd
. 이는 클라이언트가 어디에나 위치할 수 있고 클라이언트가 모르거나 알아야 할 필요가 있으며 sshd
TCP 포트(보통 22)를 통해서만 클라이언트/서버로서 통신한다는 것을 의미합니다.
배경
scp
와 같은 rsync
애플리케이션은 ssh
그 자체가 클라이언트/서버 애플리케이션입니다. 즉, 클라이언트 애플리케이션 scp
과 서버 애플리케이션이 필요합니다. 이 경우에는 scp
둘 다입니다.
이것은 예이다
$ scp /Users/user1/thumbnails-digikam.db pi-hole:/tmp/.
thumbnails-digikam.db 0% 0 0.0KB/s --:-- ETA^Z
[1]+ Stopped scp /Users/sammingolelli/thumbnails-digikam.db pi-hole:/tmp/.
랩톱에서 Raspberry Pi 서버(파이홀)로 부팅한 다음 scp
+ 중간에 일시 중지했습니다.CtrlZ
그런 다음 ssh
Raspberry Pi 서버로 이동하여 다음을 수행합니다 ps
.
$ ps -eaf | grep [s]cp
pi 9688 6147 0 11:11 ? 00:00:00 scp -t /tmp/.
애플리케이션 서버가 scp
실행 중이고 파일을 /tmp
디렉토리에 쓰는 것을 볼 수 있습니다. 일시 중지된 파일이 다음 위치에도 기록되고 있음을 확인할 수 있습니다.
$ ls -l /tmp/thumbnails-digikam.db
-rw-r--r-- 1 pi pi 2260992 Jul 6 11:12 /tmp/thumbnails-digikam.db
노트북(클라이언트)
$ ls -l ~/thumbnails-digikam.db
-rw-r--r-- 1 user1 staff 38551552 Jun 4 00:47 /Users/user1/thumbnails-digikam.db
scp
랩톱(클라이언트)에서 일시 중지를 해제하여 계속하는 경우 :
$ fg
scp /Users/user1/thumbnails-digikam.db pi-hole:/tmp/.
thumbnails-digikam.db
$
완료되고 Raspberry Pi(서버)를 다시 보면 애플리케이션이 scp
더 이상 실행되지 않는 것을 볼 수 있습니다.
$ ps -eaf|grep [s]cp
$
OpenSSH는 특정 작업 중에 필요할 때만 서버 애플리케이션(데몬)을 시작하고 전송이 완료되면 종료한다는 점에서 다소 독특합니다.
이를 용이하게 하는 원래 데몬은 ssh
다음 데몬입니다.
$ ps auxf | less
...
root 6132 0.0 0.6 11524 5812 ? Ss 02:53 0:00 \_ sshd: pi [priv]
pi 6147 0.0 0.4 11812 4016 ? S 02:53 0:03 \_ sshd: pi@pts/0
pi 6150 0.0 0.4 6172 4036 pts/0 Ss 02:53 0:00 \_ -bash
root 6172 0.0 0.3 7232 3336 pts/0 S 02:53 0:00 | \_ sudo -Es
root 6176 0.0 0.4 6120 4180 pts/0 S 02:53 0:00 | \_ /bin/bash
root 9772 0.0 0.3 7888 3076 pts/0 R+ 11:20 0:00 | \_ ps auxf
root 9773 0.0 0.0 3800 480 pts/0 S+ 11:20 0:00 | \_ less
pi 9745 0.2 0.1 3988 1872 ? Ss 11:19 0:00 \_ scp -t /tmp/.
...
scp
하위 프로세스인 상위/하위 계층 구조에 유의하세요 ssh
.
scp
대화 프로파일링
당신이 보면오라일리 SSH 도서scp
연결이 작동하는 메커니즘을 보여주는 다이어그램이 있습니다 .
위 이미지에서 scp <file> <server>:/<path>
명령이 실행되면 클라이언트 측에서 다음과 같이 변환되는 것을 볼 수 있습니다.
/usr/bin/ssh -x -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes -- 파이홀 scp -t /tmp/.
이 경우 클라이언트( scp
)는 sshd
클라이언트의 데몬에게 서버에 요청을 보내 sshd
원격 측에서 시작하도록 지시합니다.scp -t /tmp
문서에 따르면 이것이 scp
SSH 터널링을 사용하도록 설계된 방식입니다.
추가적인 통찰력
나는 몇 가지 실험을 하고 바이너리를 복사하여 scp
클라이언트 myscp
에서 실행했습니다. 각 경우에 /usr/bin/ssh ...
명령은 계속 표시됩니다 -- someserver scp -t /tmp/.
.
이로 인해 명령을 실행할 때 클라이언트가 참조 scp
하더라도 실행 파일의 이름이 클라이언트에 직접 전달되지 않는다고 믿게 됩니다 . 대신 데몬에는 지원하는 다양한 클라이언트 도구의 이름이 하드 코딩되어 있습니다.scp
ssh
sshd
이는 위에 표시된 세부정보를 통해 추가로 확인됩니다.
결론적으로
--with-default-path
컴파일 타임에 정의를 완전히 제거/비활성화하는 것은 불가능합니다 sshd
. 완전히 제거하면 sshd
연결이 트리거된 scp -t <dir>
시점을 찾는 기능이 손상됩니다.scp
이를 격리하는 가장 좋은 방법 sshd
은 OpenSSH를 구성하는 다양한 바이너리만 포함하는 디렉터리를 지정하는 것입니다.
인용하다
답변3
분명히 이를 사용하려면 두 인스턴스 모두에 프로토콜이 있어야 합니다. 대안을 원한다면 아래와 같이 ssh를 사용할 수 있습니다.
ssh user@ip "cat > destination" < file.txt