使用命令连接到远程计算机后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
通过肉眼发现其中。