ssh-在 sftp 会话中执行的 ForceCommand

ssh-在 sftp 会话中执行的 ForceCommand

我在 sshd_config 中添加了以下行:

...
ForceCommand /bin/ssh-alert
...

ssh-alert文件看起来像这样

#!/bin/bash
SSH_IP=$(echo $SSH_CLIENT | head -n1 | awk '{print $1;}')
yowsup-cli demos -c $YOWSUP_CONF -s $PHONENUMBER "SSH Alert! Login from IP $SSH_IP" > /dev/null 2>&1

#the important part:
/bin/bash --login

现在的问题是,如果我在 MobaXTerm 程序中启动 SSH 会话,SFTP 窗口是空的,关闭 ssh 会话后它会显示:Waiting for the pending transfer to complete...

如果我将文件更改/bin/bash --loginssh-alert/bin/bash不带--login),它可以再次工作,但我的.bashrc,.bash_profile,/etc/bash.bashrc将不会被获取。

有没有办法只在 SSH 会话而不是 SFTP 会话中执行 ForceCommand?或者有一种方法可以在我的 bash 脚本中检查它是否是 SFTP 会话。

注意:我的 .bash_profile 有一个带输出的命令。如果我禁用该输出,它将再次起作用。

编辑:FileZilla SFTP 也不起作用!

答案1

有没有办法仅在 SSH 会话而不是 SFTP 会话中执行 ForceCommand。

不。

或者在我的 bash 脚本中检查它是否是 SFTP 会话的方法。

这就是它$SSH_ORIGINAL_COMMAND的用途。你应该能够使用它来区分命令是否是 SFTP

注意:我的.bash_profile命令带有输出。如果我禁用该输出,它将再次起作用。

这就是破坏 SFTP 协议的问题。如果 shell 不是交互式的,则不应生成任何输出:

if [ "$PS1" ]; then
  # generate output
fi

答案2

如果ForceCommand由 运行sshd,则守护进程将放弃对此会话的任何进一步操作。它永远不会检查它是否是 sftp 以及是否需要“sftp 子系统”。SFTP 会话无法与 对话bash,这就是sshscp的用途。

为了使 SFTP 正常工作,ForceCommand脚本最终应该执行/usr/lib/openssh/sftp-server或一些类似的处理程序。

相关内容