Что происходит, когда пользователь вставляет команду в оболочку в позицию ядра? [закрыто]

Necesita alguna forma para que el extremo receptor reconozca el final del archivo transferido. Con cat file - | ncen el lado de envío, el flujo de datos a través de la canalización no hará ninguna separación entre los contenidos del archivo, y todo lo que el usuario escriba en la terminal(cat -lee la terminal ). Además, por defecto, netcat no reacciona a un EOF en su entrada, pero podemos usar -qpara que envíe el EOF.

Entonces, el script de recepción podría ser algo como esto:

#!/bin/bash
filename=$1
cat > "$filename"

hash=$(shasum "$filename" |sed -e 's/.*//')
printf "received file \"%s\" with SHA-1 hash %s\n" "$filename" "$hash"

El catlee la entrada hasta EOF, guardando el archivo. Lo que sigue, se ejecuta después de recibir el archivo. Aquí, el script devuelve el hash SHA -256 de los datos que recibió.

Luego, en el lado receptor, ejecute:

$ nc.traditional -l -p 12345 -c "./receivefile.sh somefilename"

y en el lado emisor:

$ cat sourcefile | nc.traditional -q 9999 localhost 12345
received file "somefilename" with SHA-1 hash 3e8a7989ab68c8ae4a9cb0d64de6b8e37a7a42e5

La secuencia de comandos anterior toma el nombre del archivo como argumento, por lo que usé -cen lugar de -e, pero, por supuesto, también puede redirigir la salida de ncal archivo de destino, como lo hizo en la pregunta.


Si también desea enviar el nombre del archivo desde el lado de envío, puede hacer algo como esto en el lado de recepción:

#!/bin/bash
read -r filename
[[ $filename = */* ]] && exit 1       # exit if the filename contains slashes
cat > "$filename"
echo "received $filename"

y luego enviar con (echo filename; cat filename) | nc -q 9999 localhost 12345. (Es posible que desee tener mucho más cuidado con el nombre de archivo remoto -proporcionado, aquí. O simplemente use algo diseñado para la transferencia de archivos, como scp.)

En lugar de usar nc, podría hacer esto de manera similar con SSH:

cat filename | ssh user@somehost receive.sh
0
23.05.2019, 14:20
1 ответ

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

Ядро не несет прямой ответственности за обработку команд в оболочке. Оболочка — это отдельная программа. Оболочка интерпретирует текст, введенный пользователем, в команды, а затем выполняет задачи на основе этих команд.

Также важно понимать, что для Linux доступно несколько различных оболочек, включая Bash, KSH и ZSH. Таким образом, точные системные вызовы, используемые оболочкой, могут немного отличаться в зависимости от того, какую оболочку вы используете.

Как правило, некоторые команды встроены непосредственно в оболочку, но многие из них на самом деле являются программами, расположенными в каталогах, перечисленных в переменной окружения PATH. Это означает, что для многих команд оболочка выполняет другую программу. Это делается с помощью системных вызовов fork, затем exec.

Пример:

vi /etc/passwd

Оболочка не знает и не заботится о том, /etc/passwdчто такое. Он знает только, что vi— это программа (/usr/bin/vi). Он выполняет vi, используя fork (),exec ()передает текст "/etc/passwd" в качестве аргумента exec (). Затем он вызывает wait, чтобы дождаться завершения работы vi и получить возвращаемое значение.

Ядро не интересуется строкой «/etc/passwd». Он передается vi, и затем vi интерпретирует его как файл, который нужно открыть. vi отвечает за вызовopenдля открытия файла, и только на этом этапе ядро ​​проверяет, разрешено ли текущему пользователю открывать файл.

Как уже говорилось, точные используемые системные вызовы сильно различаются, и, как указывает Кусалананда, вопрос слишком сложный, чтобы перечислять все, что делает оболочка, но базовая вилка ()exec ()ожидание ()является распространенным шаблоном. при запуске любой программы.

0
28.04.2021, 23:33

Теги

Похожие вопросы