Если это - замороженный X сессий, поразите ctrl+alt+f1 для получения до консоли. Войдите в систему и оттуда, выполнитесь /sbin/shutdown
, /sbin/reboot
или /sbin/shutdown -r now
. В зависимости от полномочий Вы, возможно, должны снабдить префиксом эти команды sudo
или сначала su
стать корнем.
Можно также смочь уничтожить незаконный процесс. Выполненный ps aux
перечислять все процессы и искать, которые используют много ЦП и/или памяти (третьи и четвертые столбцы). Использовать kill <pid>
, где pid является числом во втором столбце ps
вывод). Если это не уничтожает процесс, Вы, возможно, должны работать kill -9 <pid>
сильно уничтожить его.
Это дизайном: совместное использование дескрипторов файлов с другими процессами является явным. По умолчанию дескрипторы файлов являются столь же частными как собственная память процесса.
Как обычно, если Вы имеете право на ptrace процесс, можно сделать что-либо, что Вы любите, включая то, чтобы заставлять это звонить sendmsg
. Традиционно, вызов ptrace
требует выполнения как того же идентификатора пользователя; ограничения безопасности, такие как SELinux, возможности, тюрьмы и так далее могут сделать ptrace
более строгий. Например, в соответствии с конфигурацией Ubuntu по умолчанию, некорневой процесс может только звонить ptrace
на его собственных потомках (через AppArmor).
Используя ptrace
надежно немного хитро: необходимо ввести правильные данные, удостоверьтесь, что не перезаписали что-либо и вымылись после себя. Таким образом, моя рекомендация состоит в том, чтобы ввести код окольным способом и триггер, которые кодируют с существующим инструментом.
Запишите небольшую общую библиотеку, содержащую sendmsg
код, и LD_PRELOAD
это к другому процессу. Вот некоторый непротестированный скелетный код с пропавшими без вести проверки ошибок.
int pts_gift_fd (char *path, int fd) {
int sock;
struct sockaddr_un addr = {0};
struct msghdr msg = {0};
struct iovec iov = {0};
addr.sun_family = AF_UNIX;
strlcpy(addr.sun_path, path, sizeof(addr.sun_path));
/* Populate msg, iov as in the code you've already found */
sock = socket(AF_UNIX, SOCK_STREAM, 0);
connect(sock, (struct sockaddr*)&addr, sizeof(addr));
sendmsg(sock, &msg, 0);
close(sock);
}
Затем для инициирования кода работать gdb -n -pid 13115 -batch -x /dev/stdin
с popen
и подайте его вход как это (где %d
fd, который Вы хотите получить, и %s
путь к сокету Unix, который Вы ранее создали и слушаете на):
call pts_gift_fd("%s", %d)
detach
quit
Вы не можете сделать этого по той же причине, Вы не можете получить доступ к памяти несвязанного процесса, потому что дескриптор файла является частью памяти другого процесса. Единственной причиной там является информация о материале как это в /proc
то, потому что ядро обеспечивает его там, и это только для чтения (таким образом существуют средства исследовать копию памяти процесса).
Если это касается файла, можно, конечно, попытаться получить доступ к файлу. Если это - сокет, Вы могли бы шпионить на нем с помощью libpcap, или что-то произошло из него.
Ситуация - в основном это: дескриптор файла является (снова) частью памяти процесса. Дескриптор имеет базовый буфер, который существует в пространстве ядра; когда процесс читает или записи в дескриптор, он пишет в и от этого буфера. Для выхода данных ядро промывает буфер (к аппаратным средствам) соответственно; для входящих данных это снова наполняет буфер (от аппаратных средств), когда процесс освобождает его. Те буферы не, AFAIK, доступный для других процессов, хотя существуют некоторые средства (например, libpcap) чтения данных в некоторой форме, определенной конкретным интерфейсом ядра, так же, как интерфейс proc может обеспечить некоторые данные из памяти пространства пользователя процесса.
/proc/13115/mem
перезаписываемо, и это влияет на другой процесс. Мне не удается видеть, почему Ваше объяснение о буферах делает сокет невозможным копировать: на самом деле, sendmsg (2) может сделать это с помощью SCM_RIGHTS, также это дублировано после ветвления (2).
– pts
04.05.2013, 16:52
ptrace
. Доступ к другому процессу /proc/$pid/mem
требует установки с ptrace
сначала.
– Gilles 'SO- stop being evil'
04.05.2013, 17:11
/proc/$pid/mem
хитро — видят, Как я читаю из/proc/$pid/mem в соответствии с Linux?. Это не самый легкий способ сделать то, что Вы хотите все же.
– Gilles 'SO- stop being evil'
05.05.2013, 21:28