#c #unix
#c #unix
Вопрос:
Мне нужно создать программу, которая запускает системную команду без запуска нового pid. Пример:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("n***************************************n");
system("sleep 60");
return 0;
}
Если я посмотрю на process monitor, я увижу:
[root@dev ~]# ps axw | grep sleep
1655 pts/0 S 0:00 sleep 60
Есть ли способ «замаскировать» процесс? Цель состоит в том, чтобы запустить команду, которая имеет пароль в качестве аргумента, поэтому я хотел бы иметь возможность скрыть его.
Комментарии:
1. Это может быть возможно, если вы воссоздадите
system
функцию с незначительными изменениями. Прежде всего, вам нужно узнать о процессах, о том, как их создавать (fork
системный вызов) и как выполнять внешние программы (exec
семейство функций). Затем рассмотрите аргументы, которые вы передаетеexec
функции, и то, что вы передаете дляargv[0]
внешней программы, и как это может повлиять на то, что отображается.
Ответ №1:
Единственное надежное решение — вообще не помещать пароли в командную строку.
Хотя многие утилиты принимают пароли таким образом, трудно представить, каким образом эта практика может быть оправдана по соображениям безопасности — во всяком случае, не в производственной среде. Трудно скрыть строки команд процесса от кого-то, кто полон решимости их увидеть, и у них есть неприятная привычка появляться в файлах журналов и другой диагностике.
Если вам нужно запустить утилиту, которая принимает пароль, посмотрите, есть ли какой-либо другой способ передачи учетных данных — возможно, зашифрованный файл паролей или, в более современной практике, сертификат клиента. Если утилита, которую вам нужно запустить, не предоставляет способа ввода паролей, кроме как в командной строке, попросите разработчика исправить это.
В Linux нет безопасного и надежного способа сделать то, что вы предлагаете.
Комментарии:
1. Цель состоит в том, чтобы вызвать исполняемый файл .exe на удаленном сервере Windows из Linux. Я написал скрипт на python, который, начиная с домена имени пользователя и пароля, запускает команды на удаленном сервере. Проблема в том, что мне приходится маскировать пароль пользователя, если я скомпилирую python с помощью pyinstaller, я могу создать двоичный исполняемый файл, но разборка намного проще, чем двоичный файл, скомпилированный на c, вот почему мой выбор. Следуя приведенному здесь руководству ( unix.stackexchange.com/a/403918/119298 ) Мне удалось получить то, что я искал. Безопасно ли использовать LD_PRELOAD? Извините, но я не очень опытен
2. Если вы используете C в LInux, и вы готовы сделать что-то действительно уродливое, и вы пишете программу самостоятельно, тогда вы можете скрыть аргументы от
ps
и/proc/xxx/cmdline
просто перезаписав их (скопируйте их сначала, конечно). Эти аргументы находятся в сегменте, который может записать ваша программа. Но я не вижу, как что-либо из этого помогает с исполняемым файлом Windows.3. У меня есть Linux и компьютер с Windows, из Linux я должен вызвать исполняемый файл .exe, присутствующий на компьютере с Windows, и запустить его на удаленном сервере Windows. Я вызываю его через pywinrm с именем пользователя, паролем и IP-адресом сервера Windows