diff --git a/4.Postfix/0_setup.py b/4.Postfix/0_setup.py
index 68779a15ea95be54441668e2adfcfd5d5099d1d0..67589d1dc10aa16625e1ab45d87f13a9a769069c 100644
--- a/4.Postfix/0_setup.py
+++ b/4.Postfix/0_setup.py
@@ -6,9 +6,8 @@ import utils
 def setup(interactive=True):
     # Get hostname
     utils.log('Getting system hostname.')
-    code, out = utils.exec_cmd(['hostname'])
+    code, hostname = utils.exec_cmd('hostname')
     if code == 0:
-        hostname = out
         utils.log('Hostname is %s.' % hostname)
     else:
         raise Exception('Failed to get hostname.')
diff --git a/tester.py b/tester.py
index 2d4e75e64222971d9a070ab6446755e19c8f92d9..a28f21d13ba95851dcdb8e303c7d42aaacac4588 100755
--- a/tester.py
+++ b/tester.py
@@ -118,9 +118,14 @@ class Tester():
             description = self.get_file_description(test_path)
             # Run test
             try:
-                code, out = utils.exec_cmd(test_path)
-                if code != 0:
-                    raise Exception('Command exited with code %s.' % code)
+                p = subprocess.Popen([test_path], stdin=sys.stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+                out, err = p.communicate()
+                if out:
+                    log(out.decode('utf-8').strip())
+                if err:
+                    log(err.decode('utf-8').strip())
+                if p.returncode != 0:
+                    raise Exception('Command exited with code %s.' % p.returncode)
             except Exception as e:
                 exit_code = 1
                 log(e)
diff --git a/utils.py b/utils.py
index cb47cc1349163654d23701c421e40187ded90aa3..1e71079a51efa39938cc7c7fc5f3b9c2766e85ca 100644
--- a/utils.py
+++ b/utils.py
@@ -21,23 +21,26 @@ def get_dir(file_path):
     return os.path.dirname(os.path.abspath(os.path.expanduser(file_path)))
 
 
-def exec_cmd(cmd, log_output=True):
+def exec_cmd(cmd, log_output=True, get_output=True):
     shell = not isinstance(cmd, (tuple, list))
-    p = subprocess.Popen(cmd, stdin=sys.stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=shell)
+    stdout = subprocess.PIPE if get_output or not log_output else sys.stdout
+    stderr = subprocess.PIPE if get_output or not log_output else sys.stderr
+    p = subprocess.Popen(cmd, stdin=sys.stdin, stdout=stdout, stderr=stderr, shell=shell)
     out, err = p.communicate()
-    out = out.decode('utf-8').strip() if out else ''
-    if err:
-        if out:
-            out += '\n'
-        out += err.decode('utf-8').strip()
-    out = out.strip()
-    if log_output:
-        log(out)
+    if get_output:
+        out = out.decode('utf-8').strip() if out else ''
+        if err:
+            if out:
+                out += '\n'
+            out += err.decode('utf-8').strip()
+        out = out.strip()
+        if log_output:
+            log(out)
     return p.returncode, out
 
 
-def check_cmd(cmd):
-    code, out = exec_cmd(cmd, log_output=False)
+def check_cmd(cmd, log_output=False):
+    code, out = exec_cmd(cmd, log_output, False)
     return code
 
 
@@ -136,7 +139,7 @@ def run_commands(cmds):
                     log('A backup file already exist for:\n%s' % cmd['target'])
             else:
                 log('>>> ' + cmd['line'])
-                code = check_cmd(cmd['line'])
+                code = check_cmd(cmd['line'], log_output=True)
                 if code != 0:
                     raise Exception('Command exited with code %s.' % code)
     except Exception as e: