我在 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 --login
为ssh-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
,这就是ssh
和scp
的用途。
为了使 SFTP 正常工作,ForceCommand
脚本最终应该执行/usr/lib/openssh/sftp-server
或一些类似的处理程序。