GNU/Linux >> Tutoriales Linux >  >> Linux

Llame a una llamada al sistema de Linux desde un lenguaje de secuencias de comandos

Perl permite esto con su syscall función:

$ 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 documentación también da un ejemplo de cómo llamar a write(2):

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

No puedo decir que nunca Sin embargo, usé esta característica. Bueno, antes de ahora para confirmar que el ejemplo sí funciona.

Esto parece funcionar con 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..

Y si no tiene getrandom en su syscall.ph, entonces podría usar el número en su lugar. Es 318 en mi cuadro de pruebas de Debian (amd64). Tenga en cuenta que los números de llamada al sistema de Linux son específicos de la arquitectura.


En Python puedes usar el ctypes módulo para acceder a funciones arbitrarias en bibliotecas dinámicas, incluido syscall() de 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 su libc incluye el getrandom() función contenedora, también puede llamarla:

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)

Rubí tiene un syscall(num [, args...]) → integer función.

Por ejemplo:

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

Con 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. ¿Cuál es tu lenguaje de programación o secuencias de comandos de Linux favorito?

  2. imagen de linux del portapapeles

  3. Ejecute un script canalizado desde stdin (Linux/Shell Scripting)

  4. ¿Puedo iniciar Linux desde un VHD?

  5. Invocar Syscalls desde Java

Libro electrónico gratuito de Packt - Linux Shell Scripting Cookbook - Tercera edición

Cambiar de Windows a Linux

Cómo instalar Go Language en Linux

Instalar lenguaje de programación de raqueta en Linux

Instalar Linux Mint desde USB

Instalar Linux desde Linux