I have a python script which is called by an external check.
Script connects to devices via SSH to run commands, it works perfectly when I 'su - zabbix' and invoke the script manually.
Does not work when I run the script via 'Check now' button in Zabbix.
# ls -l | grep zabbix
-rw-r--r-- 1 zabbix zabbix 62 Feb 21 12:07 aadebug
-rw-r--r-- 1 zabbix zabbix 1675 Jun 21 2018 id_rsa
-rw-r--r-- 1 zabbix zabbix 241 Feb 21 10:36 mikrotik-base
-rwxr-xr-x 1 zabbix zabbix 1355 Feb 21 12:04 mikrotik_ssh.py
Zabbix user seem to be able to access Python outside of Zabbix.
Error message from Zabbix:
Traceback (most recent call last): File "/usr/lib/zabbix/externalscripts/mikrotik_ssh.py", line 19, in <module> sftp = ssh.open_sftp() File "/usr/local/lib/python3.5/dist-packages/paramiko/client.py", line 541, in open_sftp return self._transport.open_sftp_client() File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 1024, in open_sftp_client return SFTPClient.from_transport(self) File "/usr/local/lib/python3.5/dist-packages/paramiko/sftp_client.py", line 169, in from_transport chan.invoke_subsystem("sftp") File "/usr/local/lib/python3.5/dist-packages/paramiko/channel.py", line 72, in _check return func(self, *args, **kwds) File "/usr/local/lib/python3.5/dist-packages/paramiko/channel.py", line 283, in invoke_subsystem self._wait_for_event() File "/usr/local/lib/python3.5/dist-packages/paramiko/channel.py", line 1208, in _wait_for_event raise e paramiko.ssh_exception.SSHException: Channel closed. Actual Python script: #!/usr/bin/python3.5 import os import paramiko import sys import time file = open("/usr/lib/zabbix/externalscripts/aadebug", "w") file.write(sys.argv[0] + "\n") file.write(sys.argv[1] + "\n") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy()) ssh.connect(sys.argv[1], username="zabbix", key_filename="/usr/lib/zabbix/externalscripts/id_rsa") sftp = ssh.open_sftp() sftp.put("/usr/lib/zabbix/externalscripts/mikrotik-base", "/mikrotik-base") time.sleep(1) stdin, stdout, stderr = ssh.exec_command("/import mikrotik-base") stdout.read() time.sleep(1) sftp.remove("/mikrotik-base") sftp.close() ssh.close() file.close() Any idea's? Thanks.
Script connects to devices via SSH to run commands, it works perfectly when I 'su - zabbix' and invoke the script manually.
Does not work when I run the script via 'Check now' button in Zabbix.
# ls -l | grep zabbix
-rw-r--r-- 1 zabbix zabbix 62 Feb 21 12:07 aadebug
-rw-r--r-- 1 zabbix zabbix 1675 Jun 21 2018 id_rsa
-rw-r--r-- 1 zabbix zabbix 241 Feb 21 10:36 mikrotik-base
-rwxr-xr-x 1 zabbix zabbix 1355 Feb 21 12:04 mikrotik_ssh.py
Zabbix user seem to be able to access Python outside of Zabbix.
Error message from Zabbix:
Traceback (most recent call last): File "/usr/lib/zabbix/externalscripts/mikrotik_ssh.py", line 19, in <module> sftp = ssh.open_sftp() File "/usr/local/lib/python3.5/dist-packages/paramiko/client.py", line 541, in open_sftp return self._transport.open_sftp_client() File "/usr/local/lib/python3.5/dist-packages/paramiko/transport.py", line 1024, in open_sftp_client return SFTPClient.from_transport(self) File "/usr/local/lib/python3.5/dist-packages/paramiko/sftp_client.py", line 169, in from_transport chan.invoke_subsystem("sftp") File "/usr/local/lib/python3.5/dist-packages/paramiko/channel.py", line 72, in _check return func(self, *args, **kwds) File "/usr/local/lib/python3.5/dist-packages/paramiko/channel.py", line 283, in invoke_subsystem self._wait_for_event() File "/usr/local/lib/python3.5/dist-packages/paramiko/channel.py", line 1208, in _wait_for_event raise e paramiko.ssh_exception.SSHException: Channel closed. Actual Python script: #!/usr/bin/python3.5 import os import paramiko import sys import time file = open("/usr/lib/zabbix/externalscripts/aadebug", "w") file.write(sys.argv[0] + "\n") file.write(sys.argv[1] + "\n") ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPo licy()) ssh.connect(sys.argv[1], username="zabbix", key_filename="/usr/lib/zabbix/externalscripts/id_rsa") sftp = ssh.open_sftp() sftp.put("/usr/lib/zabbix/externalscripts/mikrotik-base", "/mikrotik-base") time.sleep(1) stdin, stdout, stderr = ssh.exec_command("/import mikrotik-base") stdout.read() time.sleep(1) sftp.remove("/mikrotik-base") sftp.close() ssh.close() file.close() Any idea's? Thanks.