GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Rufen Sie einen Linux-Systemaufruf von einer Skriptsprache aus auf

Perl erlaubt dies mit seinem syscall Funktion:

$ perldoc -f syscall
    syscall NUMBER, LIST
            Calls the system call specified as the first element of the list,
            passing the remaining elements as arguments to the system call. If
⋮

Die Dokumentation gibt auch ein Beispiel für den Aufruf von write(2):

require 'syscall.ph';        # may need to run h2ph
my $s = "hi there\n";
syscall(SYS_write(), fileno(STDOUT), $s, length $s);

Ich kann nicht sagen, dass ich das jemals getan habe habe diese Funktion aber genutzt. Nun, bevor Sie jetzt bestätigen, dass das Beispiel tatsächlich funktioniert.

Dies scheint mit getrandom zu funktionieren :

$ perl -E 'require "syscall.ph"; $v = " "x8; syscall(SYS_getrandom(), $v, length $v, 0); print $v' | xxd
00000000: 5790 8a6d 714f 8dbe                      W..mqO..

Und wenn Sie getrandom nicht in Ihrer syscall.ph haben, können Sie stattdessen die Nummer verwenden. Es ist 318 auf meiner Debian-Testbox (amd64). Beachten Sie, dass Linux-Systemaufrufnummern architekturspezifisch sind.


In Python können Sie den ctypes verwenden Modul für den Zugriff auf beliebige Funktionen in dynamischen Bibliotheken, einschließlich syscall() aus libc:

import ctypes

SYS_getrandom = 318 # You need to check the syscall number for your target architecture

libc = ctypes.CDLL(None)
_getrandom_syscall = libc.syscall
_getrandom_syscall.restypes = ctypes.c_int
_getrandom_syscall.argtypes = ctypes.c_int, ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint

def getrandom(size, flags=0):
    buf = (ctypes.c_char * size)()
    result = _getrandom_syscall(SYS_getrandom, buf, size, flags)
    if result < 0:
        raise OSError(ctypes.get_errno(), 'getrandom() failed')
    return bytes(buf)

Wenn Ihre libc den getrandom() enthält Wrapper-Funktion, Sie können sie auch aufrufen:

import ctypes

libc = ctypes.CDLL(None)
_getrandom = libc.getrandom
_getrandom.restypes = ctypes.c_int
_getrandom.argtypes = ctypes.POINTER(ctypes.c_char), ctypes.c_size_t, ctypes.c_uint

def getrandom(size, flags=0):
    buf = (ctypes.c_char * size)()
    result = _getrandom(buf, size, flags)
    if result < 0:
        raise OSError(ctypes.get_errno(), 'getrandom() failed')
    return bytes(buf)

Ruby hat einen syscall(num [, args...]) → integer Funktion.

Zum Beispiel:

irb(main):010:0> syscall 1, 1, "hello\n", 6
hello
=> 6

Mit getrandom() :

irb(main):001:0> a = "aaaaaaaa"
=> "aaaaaaaa"
irb(main):002:0> syscall 318,a,8,0
=> 8
irb(main):003:0> a
=> "\x9Cq\xBE\xD6|\x87\u0016\xC6"
irb(main):004:0> 

Linux
  1. Installieren Sie Apache 2 von Source unter Linux

  2. Best Practices für die Programmierung von Linux-Systemen in C-Sprache – Teil 1

  3. Wie rufe ich Wine dll von Python unter Linux auf?

  4. Linux-Image aus der Zwischenablage

  5. Ausführen eines von stdin geleiteten Skripts (Linux/Shell-Skripterstellung)

Kostenloses eBook von Packt – Linux Shell Scripting Cookbook – Third Edition

Umstieg von Windows auf Linux

So installieren Sie die Go-Sprache unter Linux

Installieren Sie die Racket-Programmiersprache unter Linux

Linux – Wie führe ich einen Bootloader von Linux aus?

Installieren Sie Linux Mint von USB