스크립팅 언어에서 Linux 시스템 호출 호출

스크립팅 언어에서 Linux 시스템 호출 호출

스크립트 언어에서 직접 Linux 시스템 호출(또는 최소한 libc 래퍼)을 호출하고 싶습니다. 어떤 스크립팅 언어는 신경 쓰지 않습니다. 중요한 것은 컴파일되지 않는다는 것입니다. 이유는 기본적으로 종속성 경로에 컴파일러를 원하지 않는 것과 관련이 있지만 여기도 거기도 아닙니다. 이를 허용하는 스크립트 언어(셸, Python, Ruby 등)가 있나요?

특히,무작위의시스템 호출.

답변1

Perl의 기능은 다음을 허용합니다 syscall:

$ 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

문서에는 write(2)를 호출하는 예도 나와 있습니다.

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

내가 가지고 있다고 말할 수 없어한 번하지만 이 기능을 사용해 보세요. 좋아요, 이 예제가 실제로 작동하는지 확인하기 전에요.

이것은 다음과 같은 경우에 작동하는 것 같습니다 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..

syscall.ph에 getrandom이 없으면 이 번호를 사용할 수 있습니다. 내 Debian 테스트(amd64) 시스템의 값은 318이었습니다. Linux 시스템 호출 번호는 아키텍처마다 다릅니다.

답변2

Python에서는 다음을 사용할 수 있습니다.ctypes모듈은 다음을 포함하여 동적 라이브러리의 모든 기능에 액세스합니다.syscall()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)

libc에 getrandom()래퍼 함수가 포함되어 있으면 이를 호출할 수도 있습니다.

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)

답변3

루비에는 syscall(num [, args...]) → integer기능이 있습니다.

예를 들어:

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

그리고 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> 

관련 정보