Bash 如何确定它是否由于 ssh 上的 rsync 而正在运行?

Bash 如何确定它是否由于 ssh 上的 rsync 而正在运行?

我需要我的 Bash 初始化脚本能够区分

  • 已被调用ssh me@host /some/complicated/operation,如 和
  • 被像这样调用rsync -e ssh /src me@host:/dest

在第一种情况下,我想运行许多初始化,但在第二种情况下,我总是想跳过这些初始化。我可以使用什么环境或 Bash 变量来区分这些情况?

(注:这是一个自我回答的问题。)

答案1

如上所述通过 ssh 调用 rsync(没有其他连接选项)将导致远程 sshd 生成如下子进程(假设远程主机上的默认 shell 是 bash):

bash -c rsync --server [-options] [--long-options] ...

该 shell 是您的 init 文件的来源,因此在您的 init 文件中您可以使用 shell 变量

BASH_EXECUTION_STRING
      The command argument to the -c invocation option.

像这样:

if [[ "$BASH_EXECUTION_STRING" == rsync\ --server\ * ]]; then return; fi

由常规(非 rsync)SSH 连接生成的 shell 将与此命令不匹配,因此会正常运行。

答案2

如果您正在寻找解决方案来确定是否正在运行交互式会话,这可能会有所帮助:

if [[ $- == *i* ]]
then
  echo "You are in interactive mode
else
  echo "Non-Interactive session"
fi

相关内容