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
의 추가 명령줄로 대체되는 자리 표시자도 있습니다 .ssh
ssh -i special_key_file user@server foobar
$1
foobar
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_COMMAND
ssh
모든 추가 명령줄이 문자열로 전송되므로 프로토콜이 원인입니다 . 그럼에도 불구하고 이는 서버 측 셸이 모든 분할을 수행하도록 할 이유가 없습니다. 특히 글로벌 확장도 수행하는 경우(여기서는 유용할 것 같지 않습니다). 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 값을 명령줄을 통해 전달하지 않고 환경에서 직접 가져오는 경우에는 이것이 필요하지 않을 수 있습니다.