Exit Codes of Smbclient

Exit codes of smbclient

What would be best is to use the -E argument to smbclient and redirect 2>/errorlog from the command line. You can then check this file to see if any errors occurred.

Warning, the first line is always the Domain=......... so you may need to strip that line out.

Something like this:

smbclient Hostname -A authfile -E 1>log 2>errorlog <<-EOF 
get foo
EOF

In the errorlog you should find something like below, your log file will be empty

Domain=[Hostname] OS=[Windows Server 2008 R2 Standard 7601 Service
Pack 1] Server=[Windows Server 2008 R2 Standard 6.1]
NT_STATUS_OBJECT_NAME_NOT_FOUND opening remote file \foo

Different Exit Status in Perls system than in Bash

The exit status returned by system is a two-byte number, which packs the exit code returned by the program into high bits, while the low 8 bits are set if the process was killed by a signal. The low 7 bits are the signal number and the 8th bit shows whether the core was dumped.

So to get the actual exit of the program do as the next sentence from the docs you quote says

To get the actual exit value, shift right by eight

and 256 >> 8 gives us 1.

The system's return is available in the variable $?, interrogated as spelled out in system

if ($? == -1) {
print "failed to execute: $!\n";
}
elsif ($? & 127) {
printf "child died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf "child exited with value %d\n", $? >> 8;
}

The return is best saved or $? examined right away, before it gets cleared.


The bit shifting can be avoided by using IPC::System::Simple, which returns the program's exit value directly. Thanks to daxim for the comment. To investigate the signal we still need $? but this comes up far less frequently. The module simplifies system and qx use and error checking.

smbclient NT_STATUS_ACCESS_DENIED

WARNING: This refers to Samba 2. We are at Samba 4 now. Take care which version of Samba you are using. As stated in my comment, the GUI will break your configurations.

A work colleague has pointed me in the right direction:

The Linux user ID being used to access the Linux share needs to have a second "samba" password defined for it. The easiest way to do this is to install and run the GUI Samba Server Configuration app, which isn't installed by default.

The Samba documentation does explain this, but it's buried in the masses of documentation explaining all the various arcane aspects of samba.conf configuration etc.

The following article gets to the heart of the subject:

http://ubuntuhandbook.org/index.php/2014/05/ubuntu1404-file-sharing-samba/

Ubuntu Smbclient Error returning browse list: NT_STATUS_IO_TIMEOUT

Changed the protocol .
Added SMB2 in smb.conf file and it worked

pysmb from linux to Windows, Unable to connect to shared device

After asking on the github repo Issues section (https://github.com/miketeo/pysmb/issues/169), I was able to fix the problem. It was just due to the arg I was using for the conn.listPath() servicename param.

When looking closer at the docs for that function (https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html), I saw...

service_name (string/unicode) – the name of the shared folder for the path

Originally, I was only looking at the function signature, which said service_name, so I assumed it would be the same as with the smbclient command-line tool (which I have been entering the servicename param as \\\\devicename\\sharename (unlike with pysmb which we can see from the docstring wants just the share as the service_name)).

So rather than

files = conn.listPath("\\\\H021BSBD20\\shared_folder", '\\')

I do

files = conn.listPath("shared_folder", '\\')

The full refactored snippet is shown below, just for reference.

import argparse
import json
import os
import pprint
import socket
import sys
import traceback
import warnings

from smb.SMBConnection import SMBConnection

def parseArguments():
# Create argument parser
parser = argparse.ArgumentParser()
# Positional mandatory arguments
parser.add_argument("project_home", help="project home path", type=str)
parser.add_argument("device_name", help="device (eg. NetBIOS) name in configs of share to process", type=str)
# Optional arguments
# parser.add_argument("-dfd", "--data_file_dir",
# help="path to data files dir to be pushed to sink, else source columns based on form_type",
# type=str, default=None)
# Parse arguments
args = parser.parse_args()
return args

args = parseArguments()
for a in args.__dict__:
print(str(a) + ": " + str(args.__dict__[a]))

pp = pprint.PrettyPrinter(indent=4)
PROJECT_HOME = args.project_home
REMOTE_NAME = args.device_name

# load configs
CONF = json.load(open(f"{PROJECT_HOME}/configs/configs.json"))
CREDS = json.load(open(f"{PROJECT_HOME}/configs/creds.json"))
pp.pprint(CONF)

SMB_CONFS = next(info for info in CONF["smb_server_configs"] if info["device_name"] == args.device_name)
print("\nUsing details for device:")
pp.pprint(SMB_CONFS)

# list all files in storage smb dir
#https://pysmb.readthedocs.io/en/latest/api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath
IS_DIRECT_TCP = False
CNXN_PORT = 139 if IS_DIRECT_TCP is False else 445
LOCAL_IP = socket.gethostname() #"172.18.4.69"
REMOTE_NAME = SMB_CONFS["device_name"]
SHARE_FOLDER = SMB_CONFS["share_folder"]
REMOTE_IP = socket.gethostbyname(REMOTE_NAME) # "172.18.7.102"
print(LOCAL_IP)
print(REMOTE_NAME)
try:
conn = SMBConnection(CREDS['smb_creds']['username'], CREDS['smb_creds']['password'],
my_name=LOCAL_IP, remote_name=REMOTE_NAME,
use_ntlm_v2=False,
is_direct_tcp=IS_DIRECT_TCP)
conn.connect(REMOTE_IP, CNXN_PORT)
except Exception:
traceback.print_exc()
warnings.warn("\n\nFailed to initially connect, attempting again with param use_ntlm_v2=True\n\n")
conn = SMBConnection(CREDS['smb_creds']['username'], CREDS['smb_creds']['password'],
my_name=LOCAL_IP, remote_name=REMOTE_NAME,
use_ntlm_v2=True,
is_direct_tcp=IS_DIRECT_TCP)
conn.connect(REMOTE_IP, CNXN_PORT)

files = conn.listPath(SHARE_FOLDER, '\\')
if len(files) > 0:
print("Found listed files")
for f in files:
print(f.filename)
else:
print("No files to list, this likely indicates a problem. Exiting...")
exit(255)


Related Topics



Leave a reply



Submit