원격 스크립트가 로컬 셸에서 실행되는지 아니면 원격 셸에서 실행되는지 확인하는 방법이 있습니까?

원격 스크립트가 로컬 셸에서 실행되는지 아니면 원격 셸에서 실행되는지 확인하는 방법이 있습니까?

을 사용하여 작동하는 원격 스크립트가 있습니다 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

관련 정보