![원격 스크립트가 로컬 셸에서 실행되는지 아니면 원격 셸에서 실행되는지 확인하는 방법이 있습니까?](https://linux55.com/image/160912/%EC%9B%90%EA%B2%A9%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EB%A1%9C%EC%BB%AC%20%EC%85%B8%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%EC%A7%80%20%EC%95%84%EB%8B%88%EB%A9%B4%20%EC%9B%90%EA%B2%A9%20%EC%85%B8%EC%97%90%EC%84%9C%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
을 사용하여 작동하는 원격 스크립트가 있습니다 ssh user@host "bash /path/to/remote/script.sh"
.
나는 이 스크립트가 원격 셸에서 직접 실행되는 것이 아니라 SSH를 통해 로컬로 실행되는 경우에만 실행되기를 원합니다. 유사한 값을 스크립트에 전달하고 ssh user@host "bash /path/to/remote/script.sh local"
스크립트가 $1
아닌 경우 종료하는 것을 고려했지만 local
이를 테스트할 수 있는 더 안정적인 방법이 있습니까?
정말 고마워요, 스티브.
답변1
스크립트의 상위 프로세스 pid의 프로세스 이름이 일치하는지 확인할 수 있습니다 sshd
.
예를 들어 스크립트의 초기 부분(이 #!
줄 바로 뒤가 좋은 위치)입니다.
#!/bin/bash
if [ "$(ps h -o comm -p "$PPID")" != "sshd" ] ; then
echo "This script can only be run directly from ssh." > /dev/stderr
exit 1
fi
이는 bash의 내장 읽기 전용 변수 "$PPID"를 사용합니다. 이는 bash의 모든 인스턴스에서 자동으로 정의됩니다.
스크립트에 대한 읽기 액세스 권한이 있는 사람은 누구나 해당 줄을 복사하고 삭제할 수 있으므로 이는 의미가 없습니다. 이는 스크립트가 이 작업을 수행하기 위해 사용하는 방법에 관계없이 적용됩니다.
또한 프로세스 이름은 쉽게 위조됩니다. sshd
스크립트를 실행하기 전에 프로세스 이름을 로 설정하는 래퍼 스크립트를 작성하는 것은 쉽습니다.
다른 사용자가 스크립트를 실행할 수 있다는 우려가 있는 경우 스크립트에 대한 권한 설정을 고려해 보셨나요?오직스크립트 소유자가 스크립트를 읽거나 실행할 수 있나요? (예를 들어 chmod 700 /path/to/script
)
답변2
다소 나쁜 저해상도 방법은 SSH 세션 변수가 존재하는지 테스트하는 것입니다.
SSH_CLIENT='10.10.11.11 48052 22'
SSH_CONNECTION='10.10.11.11 48052 10.20.30.40 22'
SSH_TTY=/dev/pts/2
그러나 원격 컴퓨터의 신뢰할 수 없는 사용자가 이러한 변수를 쉽게 위조한 다음 스크립트를 실행할 수 있습니다.
스크립트가 원격 시스템의 기본 셸에서 실행될 수 없도록 하기 위해 제가 생각할 수 있는 가장 좋은 방법은 원격 시스템에 스크립트를 저장하지 않는 것입니다. 대신 컴퓨터에 로컬로 저장하세요 ssh
.
ssh user@host bash < /local/path/to/script.sh
[편집하다]
다음 예제와 같이 별도의 파일이 아닌 원격 스크립트를 호출하는 로컬 스크립트 내에 원격 스크립트를 유지하려는 경우 여기에 있는 문서로 충분합니다.
#/usr/bin/env bash
user='someuser'
host='remote.host.name'
ssh -T $user@$host << \EOF
printf 'The remote hostname is: '
hostname
printf 'Current time on the remote host is: '
date
EOF
다음을 수행하여 원격 스크립트를 추가로 나눌 수 있습니다.
#/usr/bin/env bash
remote_script() {
cat << \EOF
printf 'The remote hostname is: '
hostname
printf 'Current time on the remote host is: '
date
EOF
}
user='someuser'
host='remote.host.name'
remote_script | ssh -T $user@$host