`scp` 클라이언트->서버를 실행하면 (서버에서) scp 명령을 찾을 수 없습니다. 이유는 무엇입니까?

`scp` 클라이언트->서버를 실행하면 (서버에서) scp 명령을 찾을 수 없습니다. 이유는 무엇입니까?

우리는 의도적으로 다음 스위치를 사용하여 OpenSSH를 구축합니다: --with-default-path공백. 서버에 바이너리가 포함되지 않도록 OpenSSH를 배포하려고 합니다 scp.

scp이제 로컬 컴퓨터(클라이언트)에서 원격 컴퓨터(서버)로 이동 하려고 하면 다음 메시지가 나타납니다.

scp 명령을 찾을 수 없습니다

서버는 scp바이너리가 양쪽(클라이언트와 서버)에 존재할 것으로 예상하는 것 같습니다. 그렇다면 scp원격 측 바이너리가 왜 필요한가요 ? 그냥 로컬 머신(클라이언트)에 올려놓는 것만으로는 충분하지 않나요? 누군가 이것을 명확히 할 수 있습니까?

노트:scp복사하려는 일부 파일이 원격 서버에 없으면 원격(서버)에서 다음과 같은 오류가 발생합니다 .

scp 명령을 찾을 수 없습니다

답변1

scp나는 당신이 당신의 질문에 대답했다고 생각합니다. 양쪽이 모두 필요합니다.

로컬 인스턴스는 원격 scp호출의 문서화되지 않은 플래그를 사용하여 파일 전송 프로토콜을 처리합니다.scp-t

실제로는 그렇지 않지만 서버가 scp있는 경우 이를 사용하여 파일을 전송할 수 있습니다. 대부분의 경우 SFTP 서버 구성 요소가 서버에 내장되어 있기 때문입니다.sshsftpssh

답변2

총 길이 DR

SSH 프로토콜은 파일 복사가 하나인 여러 개의 겹치는 "서비스"를 용이하게 합니다. SSH 프로토콜이 이를 수행하는 방식은 클라이언트가 scp -t명령줄 도구를 사용하여 서버에 연결할 때 서버에서 하위 프로세스로 시작된다는 것입니다.scp

SSH가 설치된 모든 서버에는 SSH의 모든 "서비스"( ssh, scp, sftp)를 제공하기 위한 완전한 CLI 도구가 필요합니다. 디스크의 이 위치는 관리 서버 데몬에만 필요합니다 sshd. 이는 클라이언트가 어디에나 위치할 수 있고 클라이언트가 모르거나 알아야 할 필요가 있으며 sshdTCP 포트(보통 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

그런 다음 sshRaspberry 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연결이 작동하는 메커니즘을 보여주는 다이어그램이 있습니다 .

                SS1

위 이미지에서 scp <file> <server>:/<path>명령이 실행되면 클라이언트 측에서 다음과 같이 변환되는 것을 볼 수 있습니다.

/usr/bin/ssh -x -oForwardAgent=no -oPermitLocalCommand=no -oClearAllForwardings=yes -- 파이홀 scp -t /tmp/.

이 경우 클라이언트( scp)는 sshd클라이언트의 데몬에게 서버에 요청을 보내 sshd원격 측에서 시작하도록 지시합니다.scp -t /tmp

문서에 따르면 이것이 scpSSH 터널링을 사용하도록 설계된 방식입니다.

         SS2

추가적인 통찰력

나는 몇 가지 실험을 하고 바이너리를 복사하여 scp클라이언트 myscp에서 실행했습니다. 각 경우에 /usr/bin/ssh ...명령은 계속 표시됩니다 -- someserver scp -t /tmp/..

이로 인해 명령을 실행할 때 클라이언트가 참조 scp하더라도 실행 파일의 이름이 클라이언트에 직접 전달되지 않는다고 믿게 됩니다 . 대신 데몬에는 지원하는 다양한 클라이언트 도구의 이름이 하드 코딩되어 있습니다.scpsshsshd

이는 위에 표시된 세부정보를 통해 추가로 확인됩니다.

결론적으로

--with-default-path컴파일 타임에 정의를 완전히 제거/비활성화하는 것은 불가능합니다 sshd. 완전히 제거하면 sshd연결이 트리거된 scp -t <dir>시점을 찾는 기능이 손상됩니다.scp

이를 격리하는 가장 좋은 방법 sshd은 OpenSSH를 구성하는 다양한 바이너리만 포함하는 디렉터리를 지정하는 것입니다.

인용하다

답변3

분명히 이를 사용하려면 두 인스턴스 모두에 프로토콜이 있어야 합니다. 대안을 원한다면 아래와 같이 ssh를 사용할 수 있습니다.

ssh user@ip "cat > destination" < file.txt

관련 정보