ssh-wrapper.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #!/usr/bin/env python3
  2. import os
  3. import re
  4. import shlex
  5. import subprocess
  6. import sys
  7. allowed = [
  8. ##### System informations
  9. r'^/usr/bin/lsb_release\s+-d$', # Linux
  10. r'^/(usr/)?bin/uname\s+-mrs$', # Linux, BSD & others
  11. r'''^/(usr/)?s?bin/awk -F'"' (-e\s*)?'/PRETTY_NAME/{ print \$2; }' /etc/os-release''', # Linux: /etc/os-release via awk for get_os.py
  12. ##### Complete command lines (Monitoring-Plugins on Debian)
  13. r'^/usr/lib/nagios/plugins/check_disk -w \d+% -c \d+% -p /[/a-z]*$',
  14. r'^/usr/lib/nagios/plugins/check_load -w \d+(,\d+,\d+)? -c \d+(,\d+,\d+)?$',
  15. r'^/usr/lib/nagios/plugins/check_mysql -u [a-z]+ -p [0-9a-zA-Z]+',
  16. r'^/usr/lib/nagios/plugins/check_mysql_health --user(name)?=[a-z]+ --pass(word)?=[0-9a-zA-Z]+ --mode=[a-z-]+$',
  17. ##### Simplified/combined (and a little bit less secure)
  18. ### most Linux distributions (with "sudo" and "doas")
  19. # r'^/usr/lib(64)?/(nagios/plugins|monitoring-plugins)/check_',
  20. # r'^sudo\s+/usr/lib(64)?/(nagios/plugins|monitoring-plugins)/check_',
  21. # r'^doas\s+/usr/lib(64)?/(nagios/plugins|monitoring-plugins)/check_',
  22. ### *BSD (with "sudo" and "doas")
  23. # r'^/usr/local/libexec/nagios/check_',
  24. # r'^sudo\s+/usr/local/libexec/nagios/check_',
  25. # r'^doas\s+/usr/local/libexec/nagios/check_',
  26. ]
  27. cmdline = os.getenv('SSH_ORIGINAL_COMMAND')
  28. if not cmdline:
  29. print('This is just a wrapper, no command specified!')
  30. sys.exit(3)
  31. for maybe in allowed:
  32. if re.match(maybe, cmdline):
  33. cmdline = shlex.split(cmdline)
  34. try:
  35. cmd = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
  36. except Exception as exc:
  37. print('Could not execute plugin ("%s"): %s' % (' '.join(cmdline), exc))
  38. sys.exit(3)
  39. else:
  40. print(cmd.communicate()[0].rstrip().decode('utf-8'))
  41. sys.exit(cmd.returncode)
  42. print('%s: No allowed command found!' % sys.argv[0])
  43. sys.exit(3)