Насколько портативный/dev/stdin,/dev/stdout и/dev/stderr?

Можно использовать GPG для симметричного шифрования файла с паролем (gpg -c). Если пароль имеет достаточно энтропии, Вам не нужен дополнительный шаг генерации секретного ключа. Что делает “достаточно энтропии”, средней? Ваше шифрование должно противостоять офлайновым нападениям, где взломщик может предпринять раскалывающиеся попытки с такой скоростью, как его аппаратные средства позволяют его. С небольшой фермой ПК взломщик смог делать пару сотни миллиардов попыток в секунду, который является примерно 2^69 в десятилетие. Таким образом с энтропией 2^70 Вы будете в безопасности. Это означает, состоит ли Ваш пароль из абсолютно случайных букв (нижний регистр или верхний регистр) и цифры, это должны быть 12 символов в длину.

Теперь для хранения того пароля можно использовать GPG с его обычными парами ключей. Использовать gpg --gen-key генерировать пару ключей, и gpg -e зашифровать пароль раньше шифровало большой файл для одной или нескольких пар ключей.

Вот эскиз о том, как сделать шифрование (обратите внимание, что я стараюсь не помещать пароль на командную строку или в среде, чтобы удостовериться, что другой пользователь не может найти его путем взгляда на ps вывод, в то время как команда работает):

passphrase=$(pwgen -s 12 -1)
echo "The passphrase for myiso.iso.gpg is: $passphrase" |
gpg -e -r somebody -r somebodyelse >passphrase.gpg
echo "$passphrase" | gpg -c --passphrase-fd 3 3<&0 <myiso.iso >myiso.iso.gpg

и как дешифровать:

passphrase=$(gpg -d <passphrase.gpg)
echo "$passphrase" | gpg -d --passphrase-fd 3 3<&0 <myiso.iso.gpg >myiso.iso

Причина использовать пароль (общий секрет), а не непосредственно зашифровать состоит в том, что он позволяет файлу быть совместно использованным несколькими людьми. Только небольшой пароль должен быть повторно зашифрован, если Вы хотите добавить, получатель (удаляющий получателя только имеет смысл, если Вы знаете, что получатель не имел доступа к простому тексту и требует перекодирования шифрованного текста так или иначе).

57
15.03.2018, 10:27
5 ответов

Это было доступно на Linux назад в его предысторию. Это не POSIX, хотя много фактических оболочек (включая AT&T ksh и bash) моделирует его, если это не будет присутствовать в ОС; обратите внимание, что это моделирование только работает на уровне оболочки (т.е. перенаправление или параметр командной строки, не как явный аргумент, например. open()). Тем не менее это должно быть доступно в большинстве коммерческих систем Unix, так или иначе (иногда, это записано /dev/fd/N для различных целых чисел N, но большинство систем с этим обеспечит символьные ссылки как Linux и *, BSD делают).

37
27.01.2020, 19:33
  • 1
    Действительно, /dev/std{in,out,err} конкретно перечислены как не часть стандарта POSIX.1-2008. –  jw013 14.04.2012, 02:05
  • 2
    Это появляется это ash не поддерживает /dev/stdout в initrd (git.razvi.ro / …) –  CMCDragonkai 13.02.2016, 07:48
  • 3
    @CMCDragonkai: это не/dev/stdout, который может быть обработан оболочкой, и что Вы ожидали initrd? Это пропускает большую часть nicities для создания его столь же маленьким как практичным. –  Joshua 01.11.2016, 18:04

/dev/std{in,out,err} файлы являются обычно просто символьными ссылками на /proc/self/fd/{0,1,2} (соответственно). Как таковой нет ничего полученного по использованию методов, которые являются определенным POSIX.

Если Вы хотите быть совместимым POSIX, лучший способ сделать, это должно использовать перенаправление вывода. Перенаправление вывода Shell определяется в стандарте POSIX. Дополнительно STDIN, STDOUT, числа дескриптора файла STDERR являются также частью POSIX.
Короче говоря, вещи как >&2 как гарантируют, будут работать.

Одна важная вещь отметить, хотя то использование STDIN, STDOUT и STDERR, субъективна к тому, как программа была запущена. Если бы программа была запущена с дескриптором файла 1 являющийся открытым дескриптором в файл, то Ваша программа просто должна принять его. Даже если у Вас должна была быть программа, открываются /dev/stdout, все, что это сделало бы, открывают дескриптор файла 1, который все еще собирается указать на тот файл.
Если это - то, что Вы пытаетесь обойти, необходимо открыть TTY непосредственно. Обычно, без любого продолжения перенаправления, STDIN, STDOUT и STDERR являются все просто открытыми дескрипторами файлов, указывающими на тот же TTY. Нет абсолютно ничего больше к нему, чем это.

22
27.01.2020, 19:33
  • 1
    +1, специально для "одной важной вещи" часть; я собираюсь переварить это в частях :) –  Alois Mahdal 15.04.2012, 16:22
  • 2
    Может Вы разъясняться если /proc/self/fd/1 или /dev/fd/1 часть POSIX? –  Steven Penny 15.06.2014, 05:32
  • 3
    /dev/std??? только символьные ссылки на /proc/self/fd на Linux. –  Stéphane Chazelas 26.01.2017, 14:36

В POSIX 7 говорится, что это расширения.

Базовые определения , раздел 2.1.1 Требования:

Система может предоставлять нестандартные расширения. Эти функции, не требуемые POSIX.1-2008, могут включать, но не ограничиваются:

[...]

  • Дополнительные специальные символьные файлы с специальные свойства (например, / dev / stdin , / dev / stdout и / dev / stderr ])

Найдено путем поиска POSIX HTML: Где находится список функций POSIX C API?

Также довольно странно, что инструмент uuencode дает / dev / stdout волшебный эффект :

Указание операнда decode_pathname для / dev / stdout должно указывать, что uudecode должен использовать стандартный вывод.

В документации ядра Linux сказано, что оно должно быть во всех системах.

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst

Compulsory links
These links should exist on all systems:
/dev/fd       /proc/self/fd   symbolic   File descriptors
/dev/stdin    fd/0            symbolic   stdin file descriptor
/dev/stdout   fd/1            symbolic   stdout file descriptor
/dev/stderr   fd/2            symbolic   stderr file descriptor

Однако я не смог найти, где эти символические ссылки создаются в ядре (имеется ли дистрибутив? ).

5
27.01.2020, 19:33

Одна проблема с / dev / stdout и друзьями заключается в том, что у вас может не быть разрешения писать им при определенных обстоятельствах. Например, я столкнулся с этим при вызове скриптов из Nix , и я представляю себе аналогичные инструменты, которые запускают скрипты в тюрьмах / песочницах / контейнерах / виртуальных машинах и т. Д. могут возникнуть аналогичные проблемы.

Использование синтаксиса типа 1> & 2 работало в этих случаях, и, поскольку я знал, что буду работать в Bash, я мог использовать подстановку процесса для команд, которые ожидают имена файлов.

0
27.01.2020, 19:33

/ dev / {stdout, stdin, stderr} работают в Bash на этих платформах:

Linux debian-ppc 3.16.0-4-powerpc #1 Debian 3.16.7-ckt25-1 (2016-03-06) ppc GNU/Linux
HP-UX hpux-ia6 B.11.31 U ia64 0107668277 unlimited-user license
AIX aix7 1 7 000ACFDE4C00
FreeBSD freebsd.polarhome.com 10.0-RELEASE-p7 FreeBSD 10.0-RELEASE-p7 #0: Tue Jul  8 06:37:44 UTC 2014     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  amd64
HP-UX hpux64 B.11.11 U 9000/785 2000587908 unlimited-user license
Darwin macosx 11.4.2 Darwin Kernel Version 11.4.2: Thu Aug 23 16:26:45 PDT 2012; root:xnu-1699.32.7~1/RELEASE_I386 i386
GNU hurd 0.7 GNU-Mach 1.6-486/Hurd-0.7 i686-AT386 GNU
Linux mandriva.polarhome.com 2.6.33.7-desktop-2mnb #1 SMP Mon Sep 20 18:19:20 UTC 2010 x86_64 x86_64 x86_64 GNU/Linux
SunOS openindiana 5.11 oi_148 i86pc i386 i86pc
MirBSD miros.polarhome.com 10 Kv#10uAF-20110818 GENERIC#1330 i386
Linux pidora 3.12.23-2.20140626git25673c3.rpfr20.armv6hl.bcm2708 #1 PREEMPT Fri Jul 4 16:06:10 EDT 2014 armv6l armv6l armv6l GNU/Linux
QNX qnx 6.5.0 2010/07/09-14:44:03EDT x86pc x86
NetBSD netbsd.polarhome.com 6.1.3 NetBSD 6.1.3 (GENERIC) i386
OpenBSD openbsd.polarhome.com 4.9 GENERIC#671 i386
Linux raspbian 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015 armv6l GNU/Linux
SCO_SV scosysv 5 6.0.0 i386
Linux redhat.polarhome.com 3.17.4-301.fc21.x86_64 #1 SMP Thu Nov 27 19:09:10 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
SunOS solaris-x86 5.11 11.3 i86pc i386 i86pc
Linux suse 3.4.63-2.44-desktop #1 SMP PREEMPT Wed Oct 2 11:18:32 UTC 2013 (d91a619) x86_64 x86_64 x86_64 GNU/Linux
SunOS solaris 5.10 Generic_147147-26 sun4u sparc SUNW,Sun-Fire-V210
Linux ubuntu 3.13.0-85-generic #129-Ubuntu SMP Thu Mar 17 20:50:15 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
UnixWare unixware 5 7.1.4 i386 x86at SCO UNIX_SVR5
OSF1 tru64.polarhome.com V5.1 2650 alpha
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u2 (2016-01-02) x86_64 GNU/Linux

Но не работает в csh на этих:

HP-UX hpux-ia6 B.11.31 U ia64 0107668277 unlimited-user license
Linux centos.polarhome.com 2.6.18-409.el5 #1 SMP Tue Mar 15 18:13:50 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
HP-UX hpux64 B.11.11 U 9000/785 2000587908 unlimited-user license
AIX aix7 1 7 000ACFDE4C00
SCO_SV scosysv 5 6.0.0 i386
SunOS solaris-x86 5.11 11.3 i86pc i386 i86pc
SunOS openindiana 5.11 oi_148 i86pc i386 i86pc
SunOS solaris 5.10 Generic_147147-26 sun4u sparc SUNW,Sun-Fire-V210
UnixWare unixware 5 7.1.4 i386 x86at SCO UNIX_SVR5
OSF1 tru64.polarhome.com V5.1 2650 alpha
2
27.01.2020, 19:33

Теги

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