如何判断 shell 是否是由 sFTP 通过“转义到本地 shell”生成的?

如何判断 shell 是否是由 sFTP 通过“转义到本地 shell”生成的?

使用命令连接到远程计算机后sftp hostname!可以在sftp提示符中键入“Escape to local shell`。

是否可以判断我是否处于由 生成的外壳中sftp

答案1

没有简单的方法来检查(例如,没有环境变量将您的 shell 标识为从 sftp 启动的 shell)。

您可以沿着进程树向上走,看看您的祖先之一是否是一个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命令在与当前 shell 相同的会话中运行。如果有的话,那么这个 shell 很可能就是从那个开始的sftp

如果您pgrep支持该-q选项,请使用它而不是将输出重定向到/dev/null.

为了快速进行目视检查,您还可以使用pstree -s -p "$$"(在 Linux 上;pstree -p "$$"在某些 BSD 上,取决于pstree实现)。这将向您显示当前进程的进程树,您希望能够sftp通过肉眼发现其中。

相关内容