我正在创建一个没有shell的受限用户,仅用于端口转发,我需要通过pubkey登录时执行脚本,即使用户通过连接也是如此 ssh -N user@host 它没有要求SSH服务器提供shell。
该脚本应警告管理员对使用pubkey进行身份验证的连接,因此用户连接不应该跳过脚本的执行(例如,通过连接 ssh -N)。
我试图无济于事:
- 设置命令
/etc/ssh/sshrc。
- 在命令中使用command =“COMMAND”
.ssh/authorized_keys (man authorized_keys)
- 使用命令设置脚本作为用户的shell。 (
chsh -s /sbin/myscript.sh USERNAME)
- 匹配用户
/etc/ssh/sshd_config 喜欢:
Match User MYUSERNAME
ForceCommand "/sbin/myscript.sh"
当用户请求shell时,所有工作,但如果只记录端口转发而没有shell(ssh -N)它不起作用。
除非客户端请求,否则ForceCommand选项在没有PTY的情况下运行。因此,您实际上没有shell以您期望的方式执行脚本。此外,OpenSSH SSHD_CONFIG(5)手册页清楚地说:
使用用户的登录shell和-c选项调用该命令。
这意味着如果您已禁用用户的登录shell,或将其设置为类似的内容 /bin/false,那么ForceCommand无法正常工作。假如说:
- 用户有一个合理的shell定义,
- 你的目标脚本是可执行的,和
- 你的脚本有一个合适的shebang线
然后以下应该适用于你的 全球 使用正确的用户名和自定义脚本的完全限定路径名正确修改sshd_config文件:
Match User foo
ForceCommand /path/to/script.sh
我是OP的作者;我得出结论,我需要实现的是不可能只使用SSH到日期(OpenSSH_6.9p1 Ubuntu-2, OpenSSL 1.0.2d 9 Jul 2015),但是我找到了一个很棒的软件,它使用加密的SPAuthentication打开SSH端口,它的新版本(截至本文发表之日,它是GitHub主分支)具有执行命令的功能,用户始终成功授权。
FWKNOP - 加密单包授权
FWKNOP设置iptables规则,允许在通过UDP发送的单个数据包上访问给定端口。然后在授权之后允许授权用户访问给定时间,例如30秒,在此之后关闭端口,保持连接打开。
1.要在Ubuntu linux上安装:
Ubuntu存储库中当前版本(2.6.0-2.1build1)仍然不允许在成功的SPA上执行命令; (请使用GitHub中的2.6.8代替)
在客户端机器上:
sudo apt-get install fwknop-client
在服务器端:
sudo apt-get install fwknop-server
这是一个关于如何设置客户端和服务器计算机的教程
https://help.ubuntu.com/community/SinglePacketAuthorization
然后在设置之后,在服务器端:
- 编辑
/etc/default/fwknop-server
- 改变线
START_DAEMON="no" 至 START_DAEMON="yes"
然后运行:
sudo service fwknop-server stop
sudo service fwknop-server start
2.成功SPA的警告管理员(电子邮件,推送脚本等)
因此,如上所述,Ubuntu存储库(2.6.0-2.1build1)中的当前版本无法在成功的SPA上执行命令。如果你需要OP的这个功能,但它将在fwknop版本(2.6.8)发布,如下所述:
https://github.com/mrash/fwknop/issues/172
因此,如果您现在需要使用它,您可以使用github分支master来构建 CMD_CYCLE_OPEN 选项。
3.关于fwknop的更多资源
https://help.ubuntu.com/community/SinglePacketAuthorization
https://github.com/mrash/fwknop/ (GitHub上的项目)
http://www.cipherdyne.org/fwknop/ (项目现场)
https://www.digitalocean.com/community/tutorials/how-to-use-fwknop-to-enable-single-packet-authentication-on-ubuntu-12-04 (关于DO社区的教程)
我是OP的作者。此外,您可以实现一个简单的logwatcher,如下所述用python3编写,它保持读取文件并在行包含模式时执行命令。
logwatcher.python3
#!/usr/bin/env python3
# follow.py
#
# Follow a file like tail -f.
import sys
import os
import time
def follow(thefile):
thefile.seek(0,2)
while True:
line = thefile.readline()
if not line:
time.sleep(0.5)
continue
yield line
if __name__ == '__main__':
logfilename = sys.argv[1]
pattern_string = sys.argv[2]
command_to_execute = sys.argv[3]
print("Log filename is: {}".format(logfilename))
logfile = open(logfilename, "r")
loglines = follow(logfile)
for line in loglines:
if pattern_string in line:
os.system(command_to_execute)
用法
- 使上面的脚本可执行:
chmod +x logwatcher.python3
- 重新启动后添加一个cronjob来启动它
crontab -e
然后在那里写下这一行并在此之后保存:
@reboot /home/YOURUSERNAME/logwatcher.python3 "/var/log/auth.log" "session opened for user" "/sbin/myscript.sh"
该 此脚本的第一个参数是要监视的日志文件,和 第二个参数是要查看的字符串 在里面。该 第三个参数是要执行的脚本 当在文件中找到该行时。
最好是在崩溃时使用更可靠的东西来启动/重启脚本。