OpenSSH: SSH_ORIGINAL_COMMAND에서 와일드카드 방지

OpenSSH: SSH_ORIGINAL_COMMAND에서 와일드카드 방지

OpenSSH 서버를 사용하여 특정 명령을 원격으로 실행하는 다음 설정이 있습니다 ssh.

authorized_keys파일에는 다음 항목이 있습니다.

command="/path/to/script.sh $SSH_ORIGINAL_COMMAND",no-port-forwarding,no-x11-forwarding,no-agent-forwarding ssh-rsa AAAA…qGDf my_special_key

이는 누군가 해당 키를 사용하여(예: 를 사용하여 ssh -i special_key_file user@server) 연결하면 내 서버에서 스크립트가 script.sh실행된다는 의미입니다. 이제 여기에 포함될 예정인 명령 $SSH_ORIGINAL_COMMAND의 추가 명령줄로 대체되는 자리 표시자도 있습니다 .sshssh -i special_key_file user@server foobar$1foobar

script.sh테스트하기 위해 다음과 같이 만들 수 있습니다 .

#!/bin/sh
printf '<%s>\n' "$@"

이제 ssh -i special_key_file user@server 'foo bar'아래와 ssh -i special_key_file user@server foo bar같은 결과를 얻게 됩니다.

<foo>
<bar>

분열 때문이다. 그것이 충분히 나쁘지 않다면 ssh -i special_key_file user@server '*'파일 목록을 얻었기 때문입니다.

<file1>
<file2>

따라서 전체 추가 명령줄이 내부에 삽입된 command=다음 모든 분할 및 전역 단계가 발생하면서 셸에서 실행됩니다. 분명히 "해당 섹션 내에서는 사용할 수 없으므로 이를 방지하기 위해 큰따옴표 안에 큰따옴표를 넣을 command="…"수 없습니다 . $SSH_ORIGINAL_COMMAND다른 해결책이 있나요?

그런데, 이 설명처럼RFE 도입 거부 $SSH_ESCAPED_ORIGINAL_COMMANDssh모든 추가 명령줄이 문자열로 전송되므로 프로토콜이 원인입니다 . 그럼에도 불구하고 이는 서버 측 셸이 모든 분할을 수행하도록 할 이유가 없습니다. 특히 글로벌 확장도 수행하는 경우(여기서는 유용할 것 같지 않습니다). RFE를 도입한 사람과 달리 나는 사용 사례 분할에 관심이 없으며 전역 확장을 원하지 않습니다.

OpenSSH가 이 작업에 사용하는 셸 환경 변경과 관련된 가능한 솔루션이 있습니까?

답변1

따옴표 사용:

cat bin/script.sh
#!/bin/sh
printf '<%s>\n' "$@"

command="/home/user/bin/script.sh \"${SSH_ORIGINAL_COMMAND}\"" ssh-rsa AA...

ssh -i .ssh/id_rsa.special hamilton '*'
<*>
ssh -i .ssh/id_rsa.special hamilton 'foo bar'
<foo bar>

하지만 다음과 같은 혜택도 누릴 수 있습니다.

ssh -i .ssh/id_rsa.special hamilton '*' 'foo bar'
<* foo bar>

이것이 당신에게 문제인지 확실하지 않습니다.

나는 혼란스럽다:

분명히 명령에 "="..."를 사용할 수 없습니다

이것이 귀하의 작업의 한계라고 생각하여 답변을 삭제했습니다.
제 답변이 귀하의 임무에 도움이 되어 기쁘네요!

답변2

$SSH_ORIGINAL_COMMAND를 명령줄에 넣을 필요가 전혀 없습니다. /path/to/script.sh에서 환경 변수로 사용할 수 있습니다. 그러면 쉘 평가의 한 계층이 자동으로 제거됩니다.

또한 쉘이 glob 문자를 확장하는 것을 원하지 않으면 쉘이 아닌 언어(예: perl/python/ruby/etc.)로 script.sh를 작성하는 것을 고려하십시오. 비쉘 언어는 명시적으로 지시된 경우에만 glob/파일 확장을 수행합니다. 그러나 $SSH_ORIGINAL_COMMAND 값을 명령줄을 통해 전달하지 않고 환경에서 직접 가져오는 경우에는 이것이 필요하지 않을 수 있습니다.

관련 정보