"로컬 쉘로 이스케이프"를 통해 SFTP에서 쉘이 생성되었는지 확인하는 방법은 무엇입니까?

"로컬 쉘로 이스케이프"를 통해 SFTP에서 쉘이 생성되었는지 확인하는 방법은 무엇입니까?

명령을 사용하여 원격 컴퓨터에 연결한 후 sftp hostname프롬프트 에서 "Escape to local shell`을 입력 !할 수 있습니다 .sftp

내가 에 의해 생성된 쉘에 있는지 알 수 있습니까 sftp?

답변1

쉽게 확인할 수 있는 방법은 없습니다(예를 들어 sftp에서 시작된 쉘을 식별하는 환경 변수가 없습니다).

프로세스 트리를 올라가서 조상 중 하나가 프로세스인지 확인할 수 있습니다 sftp.

#!/bin/bash

pid=$$
while :; do
  # if we reach pid 1, we know we're not a child of an sftp process
  [[ $pid -eq 1 ]] && break

  # get parent of $pid
  ppid=$(ps -o ppid= $pid)

  # get the command associated with $ppid
  cmd=$(ps -o cmd= -p $ppid)

  # check if it was sftp
  if [[ $cmd =~ sftp ]]; then
    echo "Running under sftp"
    exit
  fi

  pid=$ppid
done

echo "Not a child of sftp"

답변2

% sftp myhost
Connected to myhost.
sftp> !sh
$ if pgrep -s 0 sftp >/dev/null; then echo 'in sftp session'; fi
in sftp session

현재 쉘과 동일한 세션에서 실행 중인 명령이 pgrep있는지 테스트 하는 데 사용됩니다 . sftp그렇다면 이 쉘은 아마도 sftp.

pgrep이 옵션을 지원 하는 경우 -q출력을 로 리디렉션하는 대신 이 옵션을 사용하십시오 /dev/null.

pstree -s -p "$$"빠른 시각적 검사를 위해 (Linux의 경우, 구현 pstree -p "$$"에 따라 일부 BSD의 경우 ) 사용할 수도 있습니다 pstree. 그러면 현재 프로세스의 프로세스 트리가 표시되며 sftp육안으로 확인할 수 있기를 바랍니다.

관련 정보