Где находится переменная пути, когда я запускаю раковину Bash с env -i bash?

Отличная копия и вставка из моего документа - приятно знать, что это находит применение :-)

У меня проблемы почти со всеми программами ввода пароля, такими как те, что я перечислил, и размещенные slm.Они обычно были разработаны для использования конкретной программы, обычно SSH, и практически без вариантов. И да, я знаю, что именно этого хочет автор сообщения.

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

Например:

Без опций: (почти все программы ssh-askpass - кроме x11-ssh-askpass)

Нет контроля над заголовком окна (pinentry, x11-ssh-askpass)

Или просто выглядит громоздко и ужасно (Xdialog)

Отсутствие контроля над фокусом клавиатуры или захватом клавиатуры (они разные!)

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

Мой текущий выбор - 'zenity' и 'x11-ssh-askpass', но в нынешнем виде большинство из вышеперечисленных программ не помешало бы иметь больше и лучше вариантов!

3
01.11.2018, 10:58
2 ответа

Убедитесь, что printenvне имеет значения для PATH. Если вы что-то найдете, это, вероятно, из вашего ~/.bashrc. Если он пуст, он был установлен самим Bash. Когда оболочка запускается, если она не может найти значение для PATH, она установит его, потому что без PATH мало что будет работать.

Вы можете посмотреть, как это делается в исходном коде (Я смотрю на исходники Bash 4.4):

Вvariables.c:

  /* Now make our own defaults in case the vars that we think are
     important are missing. */
  temp_var = set_if_not ("PATH", DEFAULT_PATH_VALUE);
#if 0
  set_auto_export (temp_var);   /* XXX */
#endif

Вconfig-top.hвы можете найти определение (, которое соответствует указанному вами PATH):

/* The default value of the PATH variable. */
#ifndef DEFAULT_PATH_VALUE
#define DEFAULT_PATH_VALUE \
  "/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:."
#endif

Я считаю, что часто считается плохой практикой помещать .в PATH, потому что это очень упрощает случайное выполнение!

2
27.01.2020, 21:25

Как поясняется в руководстве к оболочке Bourne Again, для переменной оболочки PATHсуществует значение по умолчанию, если нет переменной окружения PATHдля ее инициализации и переменная оболочки не задана в сценарии запуска.

То, что это значение зависит от, согласно руководству, "системного администратора, который устанавливает bash". На самом деле это зависит от того, какие варианты выбрал тот, кто компилировал оболочку Bourne Again из исходников.

  • В пакете Debian оболочки Bourne Again она близка к примеру по умолчанию из руководства:
    % unsetenv PATH `command -v bash` -c 'echo $PATH ; printenv PATH'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    %
  • В порте/пакете OpenBSD оболочки Bourne Again это то же самое:
    $ unsetenv PATH `command -v bash` -c 'echo $PATH ; printenv PATH'
    /usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
    $
  • В порте/пакете оболочки Bourne Again для FreeBSD она была несколько повреждена.:
    % unsetenv PATH `command -v bash` -c 'echo $PATH ; printenv PATH'
    /sbin:/bin:/usr/sbin:/usr/bin:/usr/games:%%LOCALBASE%%/sbin:%%LOCALBASE%%/bin
    %
    Это было исправлено в марте 2017 года путем настройки параметров компилятора, используемых для сборки программного обеспечения.

Тот факт, что printenvне печатает строку, говорит вам, что эта переменная оболочки по умолчанию PATHне экспортируется в переменную окружения, между прочим.

1
27.01.2020, 21:25

Теги

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