ssh-wrapper.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #!/usr/bin/env python
  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. ##### Complete command lines (Monitoring-Plugins on Debian)
  12. r'^/usr/lib/nagios/plugins/check_disk -w \d+% -c \d+% -p /[/a-z]*$',
  13. r'^/usr/lib/nagios/plugins/check_load -w \d+(,\d+,\d+)? -c \d+(,\d+,\d+)?$',
  14. r'^/usr/lib/nagios/plugins/check_mysql -u [a-z]+ -p [0-9a-zA-Z]+',
  15. r'^/usr/lib/nagios/plugins/check_mysql_health --user(name)?=[a-z]+ --pass(word)?=[0-9a-zA-Z]+ --mode=[a-z-]+$',
  16. ##### Simplified/combined (and a little bit less secure)
  17. ### most Linux distributions (with "sudo" and "doas")
  18. # r'^/usr/lib/(nagios/plugins|monitoring-plugins)/check_',
  19. # r'^sudo\s+/usr/lib/(nagios/plugins|monitoring-plugins)/check_',
  20. # r'^doas\s+/usr/lib/(nagios/plugins|monitoring-plugins)/check_',
  21. ### *BSD (with "sudo" and "doas")
  22. # r'^/usr/local/libexec/nagios/check_',
  23. # r'^sudo\s+/usr/local/libexec/nagios/check_',
  24. # r'^doas\s+/usr/local/libexec/nagios/check_',
  25. ]
  26. cmdline = os.getenv('SSH_ORIGINAL_COMMAND')
  27. if not cmdline:
  28. print 'This is just a wrapper, no command specified!'
  29. sys.exit(3)
  30. for maybe in allowed:
  31. if re.match(maybe, cmdline):
  32. cmdline = shlex.split(cmdline)
  33. try:
  34. cmd = subprocess.Popen(cmdline, stdout=subprocess.PIPE)
  35. except Exception, exc:
  36. print 'Could not execute plugin ("%s"): %s' % (' '.join(cmdline), exc)
  37. sys.exit(3)
  38. else:
  39. print cmd.communicate()[0].rstrip()
  40. sys.exit(cmd.returncode)
  41. print '%s: No allowed command found!' % sys.argv[0]
  42. sys.exit(3)