Как перенаправить вывод запущенного процесса из канала во что-то другое?

Как описано на странице руководства (ual )в find, а на странице руководства lsточно нет, -execявляется параметром, специфичным для find. Вот почему -execработает с find, но не с ls.

На справочной странице findговорится:

   -exec command ;
          Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the command until an argument consisting of `;' is encountered.  The string `{}' is
          replaced  by  the  current  file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.  Both of these
          constructions might need to be escaped (with a `\') or quoted to protect them from expansion by the shell.  See the EXAMPLES section for examples of the use of the -exec option.  The specified
          command is run once for each matched file.  The command is executed in the starting directory.   There are unavoidable security problems surrounding use of the -exec action; you should use the
          -execdir option instead.

   -exec command {} +
          This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end; the total  number  of  invoca‐
          tions  of the command will be much less than the number of matched files.  The command line is built in much the same way that xargs builds its command lines.  Only one instance of `{}' is al‐
          lowed within the command.  The command is executed in the starting directory.  If find encounters an error, this can sometimes cause an immediate exit, so some pending commands may not be  run
          at all.  This variant of -exec always returns true.

   -execdir command ;

   -execdir command {} +
          Like  -exec,  but the specified command is run from the subdirectory containing the matched file, which is not normally the directory in which you started find.  This a much more secure method
          for invoking commands, as it avoids race conditions during resolution of the paths to the matched files.  As with the -exec action, the `+' form of  -execdir  will  build  a  command  line  to
          process more than one matched file, but any given invocation of command will only list files that exist in the same subdirectory.  If you use this option, you must ensure that your $PATH envi‐
          ronment variable does not reference `.'; otherwise, an attacker can run any commands they like by leaving an appropriately-named file in a directory in which you will run -execdir.   The  same
          applies to having entries in $PATH which are empty or which are not absolute directory names.  If find encounters an error, this can sometimes cause an immediate exit, so some pending commands
          may not be run at all. The result of the action depends on whether the + or the ; variant is being used; -execdir command {} + always returns true, while -execdir command  {}  ;  returns  true
          only if command returns 0.

Команда lsне принимает такой параметр.

0
24.09.2021, 11:54
1 ответ

Не чистым и не переносимым способом. Вы должны подключиться с помощью отладчика, такого как gdb, открыть какой-нибудь файл назначения и скопировать его в fd 1. Как и в случае с

gdb -p <PID> -batch -ex 'call dup2(open("<PATH>", 2), 1)'

Что pipe:[digits]является "анонимным" каналом, созданным конструкцией оболочки cmd | cmd.

Однако в Linux это не совсем анонимно, так как вы можете открыть его через /proc/<PID>/fd/<NUM>. Таким образом, у вас есть еще один вариант (, который гарантированно нанесет еще больший хаос, чем использованиеgdb):открытия другой стороны канала, уничтожения любой программы, которая читает из него, и catее в другом месте.. Глупый пример:

% while sleep 1; do TZ=Zulu date; done | wc -c &
[1] 26727
% ps
  PID TTY          TIME CMD
20330 pts/1    00:00:00 bash
26726 pts/1    00:00:00 bash     # this the while... done process
26727 pts/1    00:00:00 wc
26745 pts/1    00:00:00 sleep
26746 pts/1    00:00:00 ps
% ls -l /proc/26726/fd/1
... /proc/26726/fd/1 -> 'pipe:[1294932]'
% exec 7</proc/26726/fd/1        # open the other side of the pipe
% kill 26727                     # kill wc -c
% cat <&7
Fri 24 Sep 2021 01:25:52 PM UTC
Fri 24 Sep 2021 01:25:53 PM UTC
Fri 24 Sep 2021 01:25:54 PM UTC
...
1
24.09.2021, 13:19

Теги

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