GNU/Linux >> Tutoriels Linux >  >> Linux

Appeler un appel système Linux à partir d'un langage de script

Perl permet cela avec son syscall fonction :

$ 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
⋮

La documentation donne également un exemple d'appel à write(2):

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

Je ne peux pas dire que j'ai déjà utilisé cette fonctionnalité, cependant. Eh bien, avant juste maintenant pour confirmer que l'exemple fonctionne bien.

Cela semble fonctionner avec getrandom :

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

Et si vous n'avez pas getrandom dans votre syscall.ph, vous pouvez utiliser le numéro à la place. C'est 318 sur ma boîte de test Debian (amd64). Attention, les numéros d'appel système Linux sont spécifiques à l'architecture.


En Python, vous pouvez utiliser le ctypes module pour accéder à des fonctions arbitraires dans des bibliothèques dynamiques, y compris syscall() de la 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)

Si votre libc inclut le getrandom() fonction wrapper, vous pouvez aussi l'appeler :

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 a un syscall(num [, args...]) → integer fonction.

Par exemple :

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

Avec 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. Installer Apache 2 à partir de la source sur Linux

  2. Utiliser la DLL Windows à partir de Linux

  3. image Linux du presse-papiers

  4. Exécuter un script canalisé à partir de stdin (Linux/Shell Scripting)

  5. Appeler une fonction de l'espace utilisateur à partir d'un module du noyau Linux

Livre électronique gratuit de Packt - Linux Shell Scripting Cookbook - Troisième édition

Passer de Windows à Linux

Comment installer le langage Go sous Linux

Installer le langage de programmation Racket sur Linux

Linux - Comment exécuter un chargeur de démarrage à partir de Linux ?

Installer Linux Mint à partir d'une clé USB