#!/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"
没有简单的检查方法(例如,没有环境变量将您的shell 标识为从sftp 启动的shell)。
您可以沿着流程树向上走,看看您的祖先是否是一个
sftp
流程:这用于
pgrep
测试是否有sftp
命令在与当前 shell 相同的会话中运行。如果有,那么这个 shell 很可能是从那个sftp
.如果您
pgrep
支持该-q
选项,请使用该选项而不是将输出重定向到/dev/null
.为了快速进行视觉检查,您还可以使用
pstree -s -p "$$"
(在 Linux 上;pstree -p "$$"
在某些 BSD 上,取决于pstree
实现)。这将向您显示当前流程的流程树,并且您希望能够sftp
通过肉眼发现其中。