/dev/fd/63 не найдено при создании csr на Ubuntu

Perl раствор:

perl -lne '/(name:\s+\w+\s+\w+)/ and print $1'

  • \sсоответствует пробельным символам (пробелам для просмотра, табуляции и т. д.)
  • \wсоответствует буквам и цифрам
  • -lneозначает ничего не печатать (n ), за исключением случаев, когда используется печать, вывести новую строку в конце (l )и выполнить (e )следующее

Таким образом, вся строка будет соответствовать имени :, за которым следуют один или несколько пробельных символов и одна или несколько букв, снова один или несколько пробельных символов и одна или несколько букв, и затем это будет напечатано.

2
01.12.2019, 03:54
1 ответ

sudo явно закрывает файловые дескрипторы, отличные от 0, 1 и 2:

$ sudo ls -l /proc/self/fd 5< /dev/null
total 0
lrwx------ 1 root root 64 Dec  1 08:04 0 -> /dev/pts/7
lrwx------ 1 root root 64 Dec  1 08:04 1 -> /dev/pts/7
lrwx------ 1 root root 64 Dec  1 08:04 2 -> /dev/pts/7
lr-x------ 1 root root 64 Dec  1 08:04 3 -> /proc/5390/fd

Таким образом, это включает в себя тот fd 63, который является концом чтения канала, созданного подстановкой процесса.

Безsudo:

$ ls -l <(:) /proc/self/fd
lr-x------ 1 chazelas chazelas 64 Dec  1 08:07 /dev/fd/63 -> 'pipe:[146184]'

/proc/self/fd:
total 0
lrwx------ 1 chazelas chazelas 64 Dec  1 08:07 0 -> /dev/pts/7
lrwx------ 1 chazelas chazelas 64 Dec  1 08:07 1 -> /dev/pts/7
lrwx------ 1 chazelas chazelas 64 Dec  1 08:07 2 -> /dev/pts/7
lr-x------ 1 chazelas chazelas 64 Dec  1 08:07 3 -> /proc/7305/fd
lr-x------ 1 chazelas chazelas 64 Dec  1 08:07 63 -> 'pipe:[146184]'

Сsudo:

$ sudo ls -l <(:) /proc/self/fd
ls: cannot access '/dev/fd/63': No such file or directory
/proc/self/fd:
total 0
lrwx------ 1 root root 64 Dec  1 08:07 0 -> /dev/pts/7
lrwx------ 1 root root 64 Dec  1 08:07 1 -> /dev/pts/7
lrwx------ 1 root root 64 Dec  1 08:07 2 -> /dev/pts/7
lr-x------ 1 root root 64 Dec  1 08:07 3 -> /proc/7929/fd

Если sudoersразрешает это (с closefrom_override, выключено по умолчанию ), вы можете использовать опцию sudo-C, чтобы отключить его:

$ sudo -C65536 ls -l <(:) /proc/self/fd
lr-x------ 1 root root 64 Dec  1 08:15 /dev/fd/63 -> 'pipe:[148888]'

/proc/self/fd:
total 0
lrwx------ 1 root root 64 Dec  1 08:15 0 -> /dev/pts/8
lrwx------ 1 root root 64 Dec  1 08:15 1 -> /dev/pts/8
lrwx------ 1 root root 64 Dec  1 08:15 2 -> /dev/pts/8
lr-x------ 1 root root 64 Dec  1 08:15 3 -> /proc/15147/fd
lr-x------ 1 root root 64 Dec  1 08:15 63 -> 'pipe:[148888]'

(здесь говорится sudoне закрывать fd ниже 65536)

Или, если вы используете zsh, вы можете использовать форму подстановки процесса =(...), которая использует временный файл (и передает его путь )вместо конвейера (и передает/dev/fd/<its-fd>).

3
27.01.2020, 22:02

Теги

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