Какой код я должен использовать к загрузке и установить свой сценарий в перезаписываемый пользователем каталог в ПУТИ пользователя (не требуя sudo)?

[116411]Версия [116789]awk[116790]:[12212]
1
26.05.2014, 00:18
4 ответа

В итоге я дал им два варианта на моей странице «Начало работы». Я кратко объясню, что делает сценарий установщика, например ищет ~ / .local / bin или тому подобное, а затем потенциально добавляет это в PATH в ~ / .zshrc или ~ / .bashrc. Я также даю им возможность установить вручную вместо использования сценария с простыми инструкциями для этого.

Чтобы запустить автоматический установщик, пользователь должен вставить и выполнить следующую команду:

curl -s https://thesite.com/installmycmd > /tmp/inst; source /tmp/inst

Это сценарий installmycmd:

#!/bin/bash

BASE="https://thesite.com"

declare -a binddirs
bindirs=($HOME/bin $HOME/.local/bin $HOME/.bin)

founddir="false"

findprofile() {
  profiles=($HOME/.zshrc $HOME/.bashrc $HOME/.bash_login $HOME/.login $HOME/.profile)
  for prof in "${profiles[@]}"; do
    if [ -f "$prof" ]; then
      echo "$prof"
      return
    fi
  done
  touch $HOME/.profile
  echo "$HOME/.profile"
}

for bindir in "${bindirs[@]}"; do
  if [ -d "$bindir" ]; then
    founddir=true
    echo "You have a user bin dir here $bindir."
    whichprofile=$(findprofile)
    pathline=$(grep ^PATH= $whichprofile)
    if [[ ! $pathline == *$bindir* ]]; then
      echo "Appending $bindir to PATH in $whichprofile"
      echo -e "\nexport PATH=\$PATH:$bindir" >> "$whichprofile"
      NEWPATH=$PATH:$bindir      
      export NEWPATH
    else
      echo "That is in your PATH in $whichprofile"
    fi
    break;
  fi
done

if [ ! -z $NEWPATH ]; then
  echo "Exported PATH: $NEWPATH" 
  export PATH=$NEWPATH
fi

if [[ "$founddir" == "false" ]]; then
  echo "Could not find ~/.bin or ~/.local/bin or ~/bin."
  echo "Creating ~/.local/bin and adding to PATH"

  mkdir -p $HOME/.local/bin
  bindir=$HOME/.local/bin

  whichprofile=$(findprofile)
  echo "Appending PATH edit to $whichprofile"

  echo -e "\nexport PATH=$PATH:$HOME/.local/bin" >> "$whichprofile"
  export PATH=$PATH:$HOME/.local/bin
fi

bash -c "curl -s $BASE/JSON.sh > $bindir/JSON.sh"
bash -c "curl -s $BASE/mycmd > $bindir/mycmd"
chmod ug+x $bindir/mycmd
chmod ug+x $bindir/JSON.sh
0
27.01.2020, 23:12
[1179527]Есть слово для программ, которые внедряются в пользовательское окружение: вирусы.

Просто установите в ~/bin/ (исторический де-факто стандарт для скриптов, устанавливаемых вручную) или ~/.local/bin/ (современный, квазиформальный, стандарт для скриптов, устанавливаемых не корневым менеджером пакетов). Обычно в удобных для пользователя дистрибутивах уже есть один или оба дистрибутива в $PATH.

Или, что еще лучше, интерактивно запросите у пользователя префикс установки.[1179532].

4
27.01.2020, 23:12
[1179671]Почему бы вам просто не запросить $PATH в самом сценарии? Проверьте, есть ли у пользователя в $PATH каталоги, в которые он может записывать (обычно [1180146]~/bin[1180147] или [1180148]~/.local/bin[1180149]). Если они это сделают, отлично, установите там. Если нет, то подскажите. Я думаю, что некоторые дистрибутивы, такие как Ubuntu, автоматически добавят [1180150]~/bin[1180151] в $PATH, если каталог существует, но вы не можете предполагать, что это всегда так.


Единственный другой выбор, который у вас есть, это добавить любой каталог, в который вы установите, в $PATH, отредактировав [1180152]~/.profile[1180153], который исходит от многих оболочек командного интерпретатора. Забудьте о [1180154]~/.bashrc[1180155], он не только специфичен для bash, но и $PATH не имеет там никакого дела. Однако редактирование таких глобальных переменных не очень хорошо.

Самое лучшее на самом деле - это проверить записываемые каталоги и запросить, не найдены ли они.[1179676].

2
27.01.2020, 23:12
[1179731] Трубопровод к sh сомнителен с точки зрения [1180208] безопасности [1180209], и более тонко с точки зрения [1180210] надежности и обработки ошибок [1180211].

Если ваш скрипт установки состоит только из 3 строк, почему бы не попросить пользователя просто выполнить эти 3 строки? Они уже копируют и вставляют вашу команду [1180212]curl[1180213], и если сделать строку, которую они копируют и вставляют немного дольше, то можно просто сделать:

  1. На большинстве дистрибутивов, [1180214]~/bin/[1180215] помещается в [1180216]$PATH[1180217], пока каталог существует. В худшем случае, вашим пользователям может понадобиться выйти из системы и вернуться обратно, чтобы получить каталог, добавленный в их [1180218]$PATH[1180219]. Даже если его нет в их [1180220]$PATH[1180221], вы можете попросить людей просто запустить [1180222]~/bin/mycmd[1180223] вместо [1180224]mycmd[1180225]. Если они достаточно хорошо разбираются в Unix, они будут знать, что могут убедиться, что [1180226]~/bin/[1180227] находится на их пути, и сбросить лишние 6 символов. Если они не Unix-savvy, и их дистрибутив бесполезен, они должны набрать лишние 6 символов - вероятно, ничего страшного.
  2. И если кто-то имеет root и хочет установить что-то другое, чем [1180228]~/bin/[1180229], то легко изменить строку выше - и если они не понимают, как это изменить, они не должны менять корневую файловую систему![1179738].
2
27.01.2020, 23:12

Теги

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