sshd가 정확히 어떤 명령을 실행하는지 확인하는 방법은 무엇입니까?

엑스 유리

ssh를 통해 환경 변수를 명령에 전달할 생각이었습니다.

$ ssh HOST A=1 set | grep ^A
$ ssh HOST A=1 sh -c set | grep ^A
A='1'
$ ssh HOST A=1 echo '$A'
$ ssh HOST A=1 sh -c 'echo $A'

따라서 set환경 변수는 보이지 않지만 별도의 프로세스에서 수행됩니다. 같은 일이 echo.

정확히 무엇이 전송되고 정확히 어떻게 실행되는지 (어떤 명령이 실행되는지) 알 수있는 방법이 sshd있습니까?

프라 산

를 실행하면 ssh user@host command의 확장으로 인한 토큰 이 사이에 공백으로 command연결되어 ssh원격 호스트에 문자열로 전송됩니다. 그런 다음 원격 호스트는 원격 사용자의 기본 셸 (에서 지정된 것 /etc/passwd) 의 인스턴스를 실행 하여 클라이언트로부터받은 문자열을 셸의 -c옵션에 대한 인수로 전달합니다 (아래에서 자세히 설명).

예를 들어

$ foo="bar    baz"
$ ssh user@host echo "$foo"
bar baz

로컬 ssh은 두 개의 인수 echobar baz. 그것들을 연결하여 문자열을 형성 echo bar baz하고 서버로 보냅니다. 서버는 라인을 따라 무언가를 실행 /bin/sh -c 'echo bar baz'하고이 명령의 출력은 로컬 ssh의 표준 출력 에 인쇄됩니다 .

클라이언트가 실제로 서버에 보내는 내용을 어떻게 알 수 있습니까?

으로 카밀 Maciorowski 지적 질문에 대한 코멘트에, ssh -v디버그 메시지 명령 문자열로 출력은 서버에 전송되는 :

$ ssh -v host A=1 sh -c set | grep ^A
...
debug1: Sending command: A=1 sh -c set
...

sshd실제로 무엇이 실행 되는지 어떻게 알 수 있습니까?

클라이언트에게 자체 작업의 흔적을 보여달라고 서버에 요청하는 방법을 알지 못합니다. 그러나 테스트 목적으로 strace데몬의 인스턴스 를 사용할 수 있습니다 .

$ sudo strace -e execve -f /usr/bin/sshd -p 2222

원격 실행을 위해 명령 줄을 작성할 때 인용을 제대로하지 않기가 쉽기 때문에 특히 유용합니다. 예를 들어 (귀하의 질문에 제공된 예제의 변형) :

$ ssh -p 2222 host bash -c 'A=1 set'
                                        # Prints nothing

strace는 명령 문자열로 볼 수있는 것이 실제로 원격 호스트에서 분할되어 사용자의 기본 셸에서 전체 명령 줄을 먼저 실행 함을 보여줍니다 (에 대한 인수 목록을 만들 때 로컬 셸에서 작은 따옴표가 제거되었습니다 ssh).

... execve("/bin/bash", ["bash", "-c", "bash -c A=1 set"] ...

그리고:

... execve("/usr/bin/bash", ["bash", "-c", "A=1", "set"] ...

명령 문자열 (에 대한 인수 -c)이 어떻게되는지 주목하십시오 A=1. 0 번째 인수로 set전달됩니다 bash( $0명령 이름으로 사용 가능 하고 사용됨).

원격 쉘이 실제로 무엇을 실행하는지 확인하는 방법은 무엇입니까?

다시 말하지만, 나는 쉬운 방법을 알지 못합니다. 간단한 경우에는 쉘 xtrace옵션을 사용하는 것이 간단합니다. 예를 들어 다음과 같이 ssh host A=1 set될 수 있습니다.

$ command=$(printf '%s ' A=1 set); printf '%s\n' "${command% }" |
  ssh host sh -x

sh 원격 사용자의 기본 셸로 바꿔야합니다.

ssh이 형식은 변경되지 않은 입력을 허용하기 때문에 명령은 의 표준 입력으로 파이프됩니다 ( ssh host sh -xc A=1 set위에 표시된 이유로 작동하지 않으며 인용을 추가하면이 연습의 목적 자체가 어느 정도 실패합니다).

단순하지 않은 경우, 특히 ssh탐색중인 호출이 이미 표준 입력을 사용하는 경우 원격 호스트가 xtrace켜진 상태에서 쉘을 실행하도록 강제 할 수 있습니다 . 실험 목적으로 오류로 인해 원격 시스템에 로그인 할 수 없다는 점을 분명히 알고 있는 경우 (대략적인) 방법은에서 원격 사용자의 기본 셸을 대체하는 것입니다 /etc/passwd. 라고 가정하고로 /bin/sh변경 /home/your_user/bin/sh하고 후자를 실행 가능한 스크립트로 만듭니다.

#!/bin/sh
exec /bin/sh -x "$@"

그러면 쉘이 실행중인 내용을 추적 할 수 있습니다.

$ ssh host A=1 echo foo
foo
+ A=1
+ echo foo

마지막으로 샘플 명령에 대해 :

  • ssh HOST A=1 set인쇄되지 않는 이유 A=1사용자의 기본 셸이 Bash (으로 호출 될 수 있음 sh) 이기 때문일 수 있습니다 . 에서 일어나는 것과는 달리 dash, ksh, yash, zsh, set강타 (적어도 버전 내가 가지고있는 5.0.17) 설정되지 않은 출력 변수 않습니다 에 대한 set명령 자체를 . 반면에 다음을 확인할 수 있습니다.

    $ ssh host 'A=1
    > set' | grep ^A
    A=1
    

    Ie A호출 set되기 전에 선언 된 경우의 출력에 표시 set됩니다.

  • 이어 A=1 sh -c set, A의 환경에 첨가 sh되므로 당연히 의해 인쇄된다 set.

  • A=1 echo '$A'의 확장 후 (내장되어 있다고 가정) 실행을 위해 환경에만 추가 A되기 때문에 의 값을 인쇄하지 않습니다 . 그것을 인쇄 하는과 비교하십시오 .Aecho$Assh host 'A=1; echo $A'1

  • A=1 sh -c 'echo $A'위에 표시된대로 원격 호스트는 -c옵션과 A=1 sh -c echo $A인수로 원격 사용자의 기본 쉘을 실행 한 다음 해당 쉘이 실행 되기 때문에 아무것도 인쇄하지 않습니다 sh -c echo $A. 명령 문자열은 echo인수없이.

    당신이 있는지 주위에 따옴표를 만들 필요가 작동하게하려면 echo $A원격 호스트로 전송을 하고 $A 예를 들면 : (로컬 쉘에 의해 또는 "외부"원격 하나) 너무 일찍 확장되는 보호 ssh host A=1 sh -c '"echo \$A"'ssh host A=1 sh -c "'echo \$A'".

    원격 셸을 명시 적으로 호출 할 때 표준 입력에서 명령을 읽는 것이 더 쉬울 것입니다.

    $ echo 'echo $A' | ssh host A=1 sh -s
    1
    

또한보십시오

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

프로젝트를 실행하기 위해 Netbeans에서 어떤 명령을 실행하고 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

Mac OS X에서 어떤 프로세스가 어떤 창을 실행하고 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

누가 sudo 명령을 실행하는지 확인하는 방법은 무엇입니까?

분류에서Dev

정확히 어떤 공백을 식별하는 방법은 무엇입니까?

분류에서Dev

명령 줄을 통해 httpd가 실행 중인지 여부를 확인하는 방법은 무엇입니까?

분류에서Dev

어떤 명령이 수행되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

어떤 함수가 유형을 사용하는지 확인하는 방법은 무엇입니까?

분류에서Dev

명령 실행 후 종료 코드가 bash 또는 실행 된 명령에 의해 설정되었는지 확인하는 방법은 무엇입니까?

분류에서Dev

원격 git 사용자가 수신 후 후크에서 특정 명령을 실행하는지 확인하는 방법은 무엇입니까?

분류에서Dev

VSCode : 어떤 확장 기능이 무엇을하는지 확인하는 방법은 무엇입니까?

분류에서Dev

명령을 보내기 전에 Elastic Search가 정상인지 확인하는 방법은 무엇입니까?

분류에서Dev

중지하지 않고 실행중인 명령을 확인하는 방법은 무엇입니까?

분류에서Dev

SSHD가 작동하는지 확인하는 방법은 무엇입니까?

분류에서Dev

"eval"명령을 확인하는 방법은 무엇입니까?

분류에서Dev

dpkg --configure -a가 호출되면 어떤 작업을 수행하는지 확인하는 방법은 무엇입니까?

분류에서Dev

스크립트가 명령 줄을 통해 실행되었는지 두 번 클릭했는지 확인하는 방법은 무엇입니까?

분류에서Dev

스크립트가 명령 줄을 통해 실행되었는지 두 번 클릭했는지 확인하는 방법은 무엇입니까?

분류에서Dev

어떤 마운트 인수가 유효하지 않은지 확인하는 방법은 무엇입니까?

분류에서Dev

Laravel 명령이 여전히 실행 중인지 확인하는 방법은 무엇입니까?

분류에서Dev

sudo 사용자가 특정 명령을 실행하지 못하도록하는 방법은 무엇입니까?

분류에서Dev

런타임에 어떤 인증서 haproxy가 사용하는지 확인하는 방법은 무엇입니까?

분류에서Dev

실제로 실행하기 전에 어떤 일이 발생하는지 확인하기 위해 명령을 시뮬레이션하는 방법은 무엇입니까?

분류에서Dev

어떤 배경 이미지 div가 포함되어 있는지 확인하는 방법은 무엇입니까?

분류에서Dev

병렬 실행을 확실히 방지하는 방법은 무엇입니까?

분류에서Dev

파이프가 비어 있는지 확인하고 그렇지 않은 경우 데이터에 대해 명령을 실행하는 방법은 무엇입니까?

분류에서Dev

파이프가 비어 있는지 확인하고 그렇지 않은 경우 데이터에 대해 명령을 실행하는 방법은 무엇입니까?

분류에서Dev

어떤 버전의 Google Analytic 코드가 작동하는지 확인하는 방법은 무엇입니까?

분류에서Dev

어떤 (Java) 빌드 시스템 Eclipse가 사용하는지 확인하는 방법은 무엇입니까?

분류에서Dev

JSP에서 어떤 입력 필드가 채워 졌는지 확인하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    프로젝트를 실행하기 위해 Netbeans에서 어떤 명령을 실행하고 있는지 확인하는 방법은 무엇입니까?

  2. 2

    Mac OS X에서 어떤 프로세스가 어떤 창을 실행하고 있는지 확인하는 방법은 무엇입니까?

  3. 3

    누가 sudo 명령을 실행하는지 확인하는 방법은 무엇입니까?

  4. 4

    정확히 어떤 공백을 식별하는 방법은 무엇입니까?

  5. 5

    명령 줄을 통해 httpd가 실행 중인지 여부를 확인하는 방법은 무엇입니까?

  6. 6

    어떤 명령이 수행되었는지 확인하는 방법은 무엇입니까?

  7. 7

    어떤 함수가 유형을 사용하는지 확인하는 방법은 무엇입니까?

  8. 8

    명령 실행 후 종료 코드가 bash 또는 실행 된 명령에 의해 설정되었는지 확인하는 방법은 무엇입니까?

  9. 9

    원격 git 사용자가 수신 후 후크에서 특정 명령을 실행하는지 확인하는 방법은 무엇입니까?

  10. 10

    VSCode : 어떤 확장 기능이 무엇을하는지 확인하는 방법은 무엇입니까?

  11. 11

    명령을 보내기 전에 Elastic Search가 정상인지 확인하는 방법은 무엇입니까?

  12. 12

    중지하지 않고 실행중인 명령을 확인하는 방법은 무엇입니까?

  13. 13

    SSHD가 작동하는지 확인하는 방법은 무엇입니까?

  14. 14

    "eval"명령을 확인하는 방법은 무엇입니까?

  15. 15

    dpkg --configure -a가 호출되면 어떤 작업을 수행하는지 확인하는 방법은 무엇입니까?

  16. 16

    스크립트가 명령 줄을 통해 실행되었는지 두 번 클릭했는지 확인하는 방법은 무엇입니까?

  17. 17

    스크립트가 명령 줄을 통해 실행되었는지 두 번 클릭했는지 확인하는 방법은 무엇입니까?

  18. 18

    어떤 마운트 인수가 유효하지 않은지 확인하는 방법은 무엇입니까?

  19. 19

    Laravel 명령이 여전히 실행 중인지 확인하는 방법은 무엇입니까?

  20. 20

    sudo 사용자가 특정 명령을 실행하지 못하도록하는 방법은 무엇입니까?

  21. 21

    런타임에 어떤 인증서 haproxy가 사용하는지 확인하는 방법은 무엇입니까?

  22. 22

    실제로 실행하기 전에 어떤 일이 발생하는지 확인하기 위해 명령을 시뮬레이션하는 방법은 무엇입니까?

  23. 23

    어떤 배경 이미지 div가 포함되어 있는지 확인하는 방법은 무엇입니까?

  24. 24

    병렬 실행을 확실히 방지하는 방법은 무엇입니까?

  25. 25

    파이프가 비어 있는지 확인하고 그렇지 않은 경우 데이터에 대해 명령을 실행하는 방법은 무엇입니까?

  26. 26

    파이프가 비어 있는지 확인하고 그렇지 않은 경우 데이터에 대해 명령을 실행하는 방법은 무엇입니까?

  27. 27

    어떤 버전의 Google Analytic 코드가 작동하는지 확인하는 방법은 무엇입니까?

  28. 28

    어떤 (Java) 빌드 시스템 Eclipse가 사용하는지 확인하는 방법은 무엇입니까?

  29. 29

    JSP에서 어떤 입력 필드가 채워 졌는지 확인하는 방법은 무엇입니까?

뜨겁다태그

보관