2017-07-20 1 views
1

Ich möchte überprüfen, ob ein Benutzer Zugriffsrechte auf eine bestimmte Samba-Freigabe hat. Ich mache dies derzeit mit dem Befehl smbclient in Version 4.3.11-Ubuntu.Unterschiedlicher Exit-Status in Perls-System als in Bash

Offenbar ist es nicht eine gute Idee, den exit Status für die Bewertung des Erfolgs zu verwenden, wie sie in dieser Frage beschrieben: Exit codes of smbclient

Aber trotzdem habe ich ein seltsames Verhalten. Ich bekomme einen anderen Ausgangsstatus, wenn ich das Programm mit Perls system Funktion anrufe.

perldoc -f system sagt mir dies:

Der Rückgabewert ist der Exit-Status des Programms durch den „warten“ Aufruf zurückgegeben.

Wenn von Kommandozeilen-Aufruf ich EXIT 1

[email protected]:~$ smbclient //server/share MyFalsePassword --user=any.user -c "cd somefolder;"; echo "EXIT $?" 
WARNING: The "syslog" option is deprecated 
session setup failed: NT_STATUS_LOGON_FAILURE 
EXIT 1 

den gleichen whitin Perl aufrufen ich EXIT 256 bekommen.

[email protected]:~$ perl -E 'say "EXIT " . system("smbclient //server/share MyFalsePassword --user=any.user -c \"cd somefolder;\"");' 
WARNING: The "syslog" option is deprecated 
session setup failed: NT_STATUS_LOGON_FAILURE 
EXIT 256 

Ich habe auch den Wert 256 in der Variablen $? whitin Perl.

Hinweis: Ich bekomme EXIT 0 in beiden (Bash und Perl), wenn ich die richtigen Anmeldeinformationen verwenden.

Meine Frage: Warum bekomme ich einen anderen Exit-Status von Bash und Perl, wenn ich falsche Anmeldeinformationen verwende? Wie überprüfe ich richtig?

Ich benutze Perl v5.22 auf Ubuntu 16.04.

+1

Einige weitere Hintergrund: http://blogs.perl.org/users/mauke/2011/09/exit-statuses-and-how-works.html – melpomene

Antwort

3

Die Status Ausfahrt von system zurückgekehrt ist ein zwei - Byte-Nummer, die den vom Programm zurückgegebenen Beendigungscode in hohe Bits packt, während die niedrigen 8 Bits gesetzt werden, wenn der Prozess durch ein Signal beendet wurde.Die niedrigen 7 Bits sind die Signalnummer und das 8. Bit zeigt an, ob der Kern ausgegeben wurde.

so dass der tatsächlichen Ausgang des Programms zu tun, wie der nächste Satz aus der Dokumentation bekommen Sie zitieren sagt

den tatsächlichen Exit-Wert zu erhalten, nach rechts verschieben von acht

und 256 >> 8 geben uns 1.

Die system ‚Rückkehr ist in der variable $? verfügbar, verhört, wie in buchstabiert 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; 
} 

Die Rückkehr wird am besten gespeichert oder $? sofort geprüft, bevor es gelöscht wird.


Die Bitverschiebung kann durch using IPC::System::Simple, die direkt Ausgang Wert zurückgibt vermieden werden das Programm. Danke an daxim für den Kommentar. Um das Signal zu untersuchen, brauchen wir noch $?, aber das kommt viel seltener vor. Das Modul vereinfacht system und qx Verwendung und Fehlerprüfung.

+0

Dies ist unerwartet kompliziert. Sollte hier erwähnt werden: https://stackoverflow.com/questions/799968/whats-the-difference-between-perls-backticks-system-and-exec Ich habe den Satz gelesen, den Sie zuvor zitiert haben. Ihre Erklärung hilft viel, die Dokumente zu verstehen. Vielen Dank! Gibt es auf CPAN kein Modul, das eine Schnittstelle bietet, die keine Bitoperationen erfordert? Dies ist ein Schmerz für jeden, der diesen Code später betrachten muss. –

+0

* "Wenn die Rückkehr vom System nicht Null ist, können Sie die Variable $ abfragen?" * Es ist nicht notwendig, '$?' Sowie den Rückgabewert von 'system' zu überprüfen: Sie sind identisch. – Borodin

+0

@Borodin Ich wollte '$?' Untersuchen, was am häufigsten gemacht wird, 'system (...) == 0 or ...' (oder 'system (...) and ...'). Ich meine, Leute überprüfen normalerweise zuerst die Rückgabe von 'System'. Es kam vielleicht ein bisschen ungeschickt heraus :( – zdim

2

Dies ist nicht sehr gut dokumentiert, und die nützlichsten Informationen in perldoc perlvar was sagt diese

  • $ CHILD_ERROR
  • $?

    Der Status, der von der letzten Pipe zurückgegeben wurde, schließen, Befehl zurücknehmen, erfolgreicher Aufruf an wait() oder waitpid(), oder vom Operator system(). Dies ist nur das 16-Bit-Statuswort, das vom traditionellen Unix-Systemruf wait() zurückgegeben wird (oder sonstwie so aussieht). Somit ist der Ausgangswert des Unterprozesses wirklich ($? >> 8) und $? & 127 gibt an, welches Signal, wenn überhaupt, der Prozess gestorben ist, und $? & 128 meldet, ob es einen Kernspeicherauszug gab.

So ein Rückgabewert von 256 aus system entspricht einem Ausgangswert von 256 >> 8, die 1 Sie

erwarteten
Verwandte Themen