Red Hat Enterprise Linux 6'daki kabuk betiği için execvp exec biçim hatası


3

Çekirdeğin ve glibc'nin aynı sürümlerini çalıştıran iki RHEL 6 sistemimiz var (glibc – 2.12–1.90.el6_3.6). Çekirdek yürütülebilir bir dosya örneğin ELF olarak yürütülebilir biçimde değil belirlerse, POSIX standardı ve Linux kılavuz sayfalarına göre ve bir shebang (yok #!) hattını, fonksiyonlar execl, execlp, execle, execv, execvp, ve execvpe(ama not execve) bu dosyayı Linux'ta olan bir POSIX kabuğu kullanarak yürütmeye çalışacaktır /bin/sh.

Ancak, sistemlerden birinde, ilk satırı işlevi :kullanan bir kabuk komut dosyasının yürütülmesi execvpbaşarısız olurken, diğer makinede /bin/shbeklendiği gibi komut dosyası kullanılarak yürütülür . Özellikle, bu test programlarını kullanıyoruz; /tmp/test_scriptçalıştırılabilir hale getirildi:

xc:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

dıştaki char ** ortam;

int main () {
        char * argv [] = {"/ tmp / test_script", NULL};
        char * progname = argv [0];
        if (execvp (progname, argv) == -1) {
                perror ( "execvp");
                dönüş -1;
        }
}

/ Tmp / test_script:

:

yankı "Denenen komut dosyası"
Çıkış 0

Glibc'nin kurulu sürümü için kaynak RPM'yi aradık ve kesinlikle istenen davranışı uygular (execvp execvpe etrafında önemsiz bir sarıcıdır):

POSIX / execvpe.c:

if (strchr (dosya, '/')! = NULL)
    {
        / * Eğik çizgi içerdiğinde arama yapmayın. * /
        __execve (dosya, argv, envp);

        eğer (errno == ENOEXEC)
            {
                / * Argümanları say. * /
                int argc = 0;
                while (argv [argc ++])
                    ;
                size_t len ​​= (argc + 1) * sizeof (char *);
                char ** script_argv;
                void * ptr = NULL;
                if (__libc_use_alloca (len))
                    script_argv = alloca (len);
                Başka
                    script_argv = ptr = malloc (len);

                if (script_argv! = NULL)
                    {
                        scripts_argv (dosya, argv, argc, script_argv);
                        __execve (script_argv [0], script_argv, envp);

                        serbest (ptr);
                    }
            }
    }
Başka
   ︙

Burada, argüman listesine hazırlanan ve glibc üzerinden kullanıcı alanına maruz kalan ile aynı olan scripts_argvbasit bir işlevdir ./bin/sh__execveexecve

Bu konuda Linux'ta başka biriyle karşılaştı mı? Davranış denedim diğer tüm sistemlerde doğrudur.


lütfen hata mesajlarını göster. Ayrıca, neler olup bittiğini bulmak için "strace -f ...." kullanın?
Olivier Dulac

Yanıtlar:


0

Tamam, sorunun ne olduğunu keşfettim. x.cÇalıştırılabilir dosyayı derledikten sonra çalıştırdım ve çalıştırılabilir dosyaya dinamik olarak bağlanmış lddbir kitaplık olduğunu keşfettim liboit.so. Bu kütüphane, sistem çağrıları da dahil olmak üzere, oturum açmış kullanıcılar tarafından tüm etkinliklerle uğraşan ObserveIT Unix Auditor tarafından kuruldu . Bununla birlikte, sadece sistem çağrılarına müdahale etmenin gözlemlenen davranışla sonuçlanmayacağını düşünürdüm, çünkü yeniden çalıştırma /bin/shglibc içinde yapıldı. Belki de ObserveIT, POSIX işlevlerini de taklit eder, görünüşte bu durumda uyumsuzdur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.